OpenGL输出失真(可能没有偏移到中心?)

时间:2016-12-14 15:45:24

标签: python opengl pygame pyopengl

我正在尝试输出一个正方形,并且得到一个相当扭曲的菱形。像这样,

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 个答案:

答案 0 :(得分:1)

两件事:

我怀疑你所看到的“扭曲”可能是透视投影矩阵的正常效果;当应用透视时,3D空间中的正方形可以在2D中呈现为奇怪的菱形形状。在这种情况下,很难说出预期的输出应该是什么,因为你没有包括摄像机和立方体的坐标。但是,如果您使用正交投影(通过gluOrtho2D),我的猜测是它会成为(旋转,平移和压扁)平行四边形。

其次,我认为你只看到你的立方体的单面显示。如果您可以看到多维数据集的其他可见面,则图片可能会更有意义,但由于您已在vertices中重复使用x,y,z变量,因此Cube.__init__列表已被删除。

如果修复此名称冲突,渲染会变得更好吗?您可以尝试将一组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))