此代码为显示部分。
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是一个状态引擎。当前的转换矩阵是一个全局状态。函数gluLookAt
和glRotatef
都定义了一个矩阵,并将当前的变换矩阵与新定义的矩阵相乘。矩阵乘法是不可交换的,顺序是重要的:
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)
你必须关心顺序。