Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用gluLookAt()会导致对象旋转_Python_Python 3.x_Opengl_Pygame_Pyopengl - Fatal编程技术网

Python 使用gluLookAt()会导致对象旋转

Python 使用gluLookAt()会导致对象旋转,python,python-3.x,opengl,pygame,pyopengl,Python,Python 3.x,Opengl,Pygame,Pyopengl,我正在用OpenGL和Pygame制作一个游戏。到目前为止,我能够使立方体出现,并使交叉头发。当我尝试实施环顾四周时,事情变得。。。奇怪的当我使用gluLookAt()函数时,我会运行它,甚至不用移动鼠标,它就会开始在任何地方旋转屏幕。当我把它拿出来时,它起作用了,但我不能四处看看。我做了一些测试,我甚至在函数中输入了设置的数据值,以确保它们没有改变,并且仍然旋转。提前感谢您为我提供的一切帮助,这是我的代码:在您的代码中有两个问题 设置视图矩阵。但这还不是全部。 gluLookAt将视图矩阵乘以

我正在用OpenGL和Pygame制作一个游戏。到目前为止,我能够使立方体出现,并使交叉头发。当我尝试实施环顾四周时,事情变得。。。奇怪的当我使用
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