我正在尝试输出一个正方形,并且得到一个相当扭曲的菱形。像这样,
虽然我可以说这实际上是我想要的立方体,但立方体却奇怪地扭曲了。在我自己的工作中创建一个简单的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.
答案 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))