2016-12-14 95 views
0

我想輸出一個正方形,並得到一個相當扭曲的菱形。像這樣,OpenGL輸出失真(可能不會偏移到中心?)

Not the sort of cube that was expected...

雖然我可以告訴大家,其實這是我本來打算立方體,該立方體是奇怪的扭曲。在我自己創建一個簡單的3D投影程序的過程中,當我缺少2D點到屏幕中間的偏移量時,我發現了一個類似的問題,但是我知道沒有這種方法可以將此偏移量通知給OpenGL ...

對於任何人誰可能想知道,我現在的相機對象看起來像[在Python]:

class Camera: 
    def __init__(self,x,y,z,fov=45,zNear=0.1,zFar=50): 
     self.x,self.y,self.z = x,y,z 
     self.pitch,self.yaw,self.roll = 0,0,0 
     glMatrixMode(GL_PROJECTION) 
     gluPerspective(fov, 1, zNear, zFar) 
    def __goto__(self,x,y,z,pitch,yaw,roll): 
     print "loc:",x,y,z 
     print "ang:",pitch,yaw,roll 

     glMatrixMode(GL_MODELVIEW) 
     glLoadIdentity() 
     glRotatef(pitch,1,0,0) 
     glRotatef(yaw,0,1,0) 
     glRotatef(roll,0,0,1) 
     glTranslatef(-x,-y,-z) 
    def __flushloc__(self): 
     self.__goto__(self.x,self.y,self.z,self.pitch,self.yaw,self.roll) 

與立方體正在呈現以下方式:

class Cube: 
    def __init__(self,x,y,z,width): 
     self.vertices=[] 
     for x in [x,x+width]: 
      for y in [y,y+width]: 
       for z in [z,z+width]: 
        self.vertices.append((x,y,z)) 
     self.faces = [ 
      [0,1,3,2], 
      [4,5,7,6], 
      [0,2,6,4], 
      [1,3,7,5], 
      [0,1,5,4], 
      [2,3,7,6]] 
    def __render__(self): 
     glBegin(GL_QUADS) 

     for face in self.faces: 
      for vertex in face: 
       glVertex3fv(self.vertices[vertex]) 

     glEnd() 

也許我還要提到的是給定的窗口是400px×400px,因此縱橫比是1.

回答

1

兩件事情:

我懷疑「失真」你看到的很可能是透視投影矩陣的正常作用;當應用透視圖時,3D空間中的正方形可以渲染爲2D中奇怪的菱形形狀。在這種情況下,很難說出預期的輸出應該是什麼,因爲您沒有包含相機和立方體的座標。但是,如果您使用了正交投影(通過gluOrtho2D),我的猜測是它會出現(旋轉,平移和壓扁)平行四邊形。

其次,我認爲你只能看到你的立方體的單一面顯示。如果您可以看到多維數據集的其他可見面,則圖片可能會更有意義,但由於您在Cube.__init__中重複使用了x,y,z變量,因此您的列表將被丟棄。

如果你修復這個名稱衝突,你的渲染會變得更好嗎?您可以嘗試重新命名一組x,y,z別的東西,像這樣:

def __init__(self,x,y,z,width): 
    self.vertices=[] 
    for xv in [x,x+width]: 
     for yv in [y,y+width]: 
      for zv in [z,z+width]: 
       self.vertices.append((xv,yv,zv)) 
+0

我要問,這是我自己的愚蠢通常原來是我的問題的根源。正如你剛剛證明的,我可能不應該在堆棧溢出。實際上沒有變形,只是由你指出的重疊產生的極其奇特的一組頂點。 –

+0

可能我只是說,非常感謝你... –

+0

不愚蠢,只是學習:)混淆變量名稱很容易在Python中完成,所以不用擔心!我想大多數棉絨都不會發現這個問題;把它放在SO上是一個快速的方法來獲得一些關於來源的眼球並找到你的問題。 – wildwilhelm