opengl (python) 相机旋转与立方体 旋转gluLookAt() 在显示代码中的位置



此代码为显示部分。

def display(self):
    
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glLoadIdentity()
        gluLookAt(5.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
        if (self.axis == 0):
            glRotatef(self.pitch, 1.0, 0.0, 0.0)      
        elif (self.axis == 1):
            glRotatef(self.yaw, 0.0, 1.0, 0.0)
        elif (self.axis == 2):
            glRotatef(self.roll, 0.0, 0.0, 1.0)
        
        
        self.colorcube()
        glFlush()
        glutSwapBuffers()

)计算出当我将代码gluLookAt()放在glRotate()之前时立方体旋转,当我将代码gluLookAt()放在glRotate()之后时摄像机旋转。但我不知道为什么。为什么会这样呢?

OpenGL是一个状态引擎。当前的转换矩阵是一个全局状态。函数gluLookAtglRotatef都定义了一个矩阵,并将当前的变换矩阵与新定义的矩阵相乘。矩阵乘法是不可交换的,顺序是重要的:

matrix1 * matrix2 != matrix2 * matrix1

因而:

gluLookAt(5.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
glRotatef(self.pitch, 1.0, 0.0, 0.0) 

不一样
glRotatef(self.pitch, 1.0, 0.0, 0.0)
gluLookAt(5.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)

你必须关心顺序。

最新更新