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