Python 使用gluLookAt()会导致对象旋转
我正在用OpenGL和Pygame制作一个游戏。到目前为止,我能够使立方体出现,并使交叉头发。当我尝试实施环顾四周时,事情变得。。。奇怪的当我使用Python 使用gluLookAt()会导致对象旋转,python,python-3.x,opengl,pygame,pyopengl,Python,Python 3.x,Opengl,Pygame,Pyopengl,我正在用OpenGL和Pygame制作一个游戏。到目前为止,我能够使立方体出现,并使交叉头发。当我尝试实施环顾四周时,事情变得。。。奇怪的当我使用gluLookAt()函数时,我会运行它,甚至不用移动鼠标,它就会开始在任何地方旋转屏幕。当我把它拿出来时,它起作用了,但我不能四处看看。我做了一些测试,我甚至在函数中输入了设置的数据值,以确保它们没有改变,并且仍然旋转。提前感谢您为我提供的一切帮助,这是我的代码:在您的代码中有两个问题 设置视图矩阵。但这还不是全部。 gluLookAt将视图矩阵乘以
gluLookAt()
函数时,我会运行它,甚至不用移动鼠标,它就会开始在任何地方旋转屏幕。当我把它拿出来时,它起作用了,但我不能四处看看。我做了一些测试,我甚至在函数中输入了设置的数据值,以确保它们没有改变,并且仍然旋转。提前感谢您为我提供的一切帮助,这是我的代码:在您的代码中有两个问题
gluLookAt
将视图矩阵乘以矩阵堆栈上的当前矩阵,该矩阵由选择。因此,您的代码将新视图矩阵连接到现有视图矩阵。这会导致对象开始快速旋转
gluLookAt
之前设置以解决此问题。这导致模型视图矩阵是从头开始设置的,与以前的状态无关
glLoadIdentity()
gluLookAt(0,0,0,面对[0],面对[1],注视Z,0,1,0)
glLoadIdentity
也跳过投影矩阵。这种行为很容易解决。将视图矩阵放在模型视图矩阵堆栈(
GL\u MODELVIEW
)上,将投影矩阵放在投影矩阵堆栈(GL\u projection
)上:glMatrixMode(GL_投影)
透视图(45,(宽/高),0.1100.0)
glMatrixMode(GLU模型视图)
glPushMatrix()
一个更好且完全有效的解决方案是将绕x轴和y轴的旋转矩阵应用于视图矩阵。首先围绕y轴(上方向向量)应用旋转矩阵,然后应用当前视图矩阵,最后应用x轴上的旋转:
视图矩阵=旋转-X*视图矩阵*旋转-Y
为此,必须通过以下方式读取当前视图矩阵:
modelview=glGetFloatv(GL\u modelview\u矩阵)
glLoadIdentity()
glRotate(-change[1]*0.1,1,0,0)
glMultMatrixf(模型视图)
glRotate(更改[0]*0.1,0,1,0)
注意,必须这样做,而不是:
glLoadIdentity()
gluLookAt(0,0,0,面向[0],面向[1],面向Z,0,1,0) 完成
main
函数(),并进行建议的更改:
def main(世界、x、y、z、宽度、高度、渲染距离):
pygame.init()
pygame.display.set_模式((宽度,高度),DOUBLEBUF | OPENGL)
glClearColor(0.0,0.0,0.0,0.0)
glClearDepth(1.0)
glDepthMask(GL_TRUE)
glDepthFunc(GL_LESS)
glEnable(GL_深度_测试)
glEnable(GL_CULL_面)
正面(背面)
GLU正面(GL_CCW)
glShadeModel(GLU平滑)
gldepsrange(0.0,1.0)
glMatrixMode(GL_投影)
透视图(45,(宽/高),0.1100.0)
glMatrixMode(GLU模型视图)
glPushMatrix()
#pygame.mouse.set_可见(False)
面向=[0,0,False]
尽管如此:
对于pygame.event.get()中的事件:
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_a:
pygame.mouse.set_可见(True)
pygame.quit()
return#TODO:添加暂停
newMousePos=pygame.mouse.get_pos()
更改=(newMousePos[0]-(宽度/2),newMousePos[1]-(高度/2))
pygame.mouse.set_pos([width/2,height/2])
如果面向[2]:
面向[0]-=更改[0]
其他:
面向[0]+=更改[0]
面对[1]+=改变[1]
面对[0]>宽度时:
朝向[0]=2*宽度朝向[0]
面向[2]=不面向[2]
当面对[0]<0时:
面向[0]=0-面向[0]
面向[2]=不面向[2]
如果面向[1]<0:
面向[1]=0
如果面向[1]>高度:
面[1]=高度
半径=(宽度**2+高度**2)**.5+1
lookingZ=(-1*面向[0]**2-面向[1]**2+半径**2)***.5
如果面向[2]:
lookingZ*=-1
#打印(注视Z、朝向[0]、朝向[1]、半径)
打印(面对[0],面对[1],注视Z)
#glLoadIdentity()
#gluLookAt(0,0,0,面对[0],面对[1],注视Z,0,1,0)
modelview=glGetFloatv(GL_modelview_矩阵)
glLoadIdentity()
glRotate(-change[1]*0.1,1,0,0)
glMultMatrixf(模型视图)
glRotate(更改[0]*0.1,0,1,0)
xmin=round(x-renderInstance[0])
ymin=圆形(y形渲染距离[1])
zmin=圆形(z-renderInstance[2])
如果xmin<0:
xmin=0
如果ymin<0:
ymin=0
如果zmin<0:
zmin=0
xmax=round(x+renderstance[0])
ymax=圆形(y+渲染距离[1])
zmax=圆形(z+RenderInstance[2])
dims=world.dims()
如果xmax>dims[0]:
xmax=dims[0]
如果ymax>变暗[1]:
ymax=dims[1]
如果zmax>变暗[2]:
zmax=dims[2]
选择=世界。选择_数据(xrange=(xmin,xmax),yrange=(ymin,ymax),zrange=(zmin,zmax))
块=选择。迭代(忽略=(无,))
glClearDepth(1.0)
glClear(GL_颜色_缓冲区_位| GL_深度_缓冲区_位)
对于区块中的bl:
地点=bl[0]
block=bl[1]
立方体(位置[0]-x,位置[1]-y,位置[2]-z,块)
#打印(位置[0]、位置[1]、位置[2])
glMatrixMode(GL_投影)
glPushMatrix()
glLoadIdentity()
格洛托(0.0,宽度,0.0,高度,-1.0,1.0)
glMatrixMode(GLU模型视图)
glPushMatrix()
glLoadIdenti