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

OpenGL output distorted (Possibly not offset to center?)

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


虽然我可以看出这实际上是我想要的立方体,但立方体奇怪地扭曲了。在我自己创建一个简单的 3D 投影程序的工作中,当我缺少 2D 点到屏幕中间的偏移量时,我发现了一个类似的问题,但是我知道没有这样的方法来通知 OpenGL 这个偏移量...

对于任何可能想知道的人,我当前的相机对象看起来像 [in 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()

也许我还应该提到给定的 window 是 400px x 400px,因此纵横比是 1。

两件事:

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

其次,我认为您只看到显示了立方体的一个面。如果您能看到立方体的其他可见面,该图片可能更有意义,但是您的 vertices 列表已被丢弃,因为您在 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))