我是一名业余程序员,最近刚接触OpenGL。我目前正在使用PyOpenGL模块在Python中进行编程。我开始研究用于视野控制的摄影机模块,但是我对gluLookAt()函数感到困惑。我也有一些键盘交互。我的问题是,当我按下某个键来平移相机时,它可以正常工作,但在我松开该键时不会停止。我认为可能是因为我必须重新初始化转换矩阵之类的东西。我已经看到我应该推送和弹出矩阵,或将标识矩阵加载到某个地方,但是现在我对OpenGL到底对gluLookAt()给出的矩阵做了什么感到非常困惑。
这是我的代码:
import pygame from pygame.locals import * import numpy as np import glm from math import * from OpenGL.GLU import * from OpenGL.GL import * class camera: def __init__(self, position, angles, target): self.position = glm.vec3(position[0], position[1], position[2]) self.front = glm.normalize(self.position - glm.vec3(target[0], target[1], target[2])) self.upVector = glm.normalize(glm.cross(self.front, glm.normalize(glm.cross(self.front, glm.vec3(0, 1, 0))))) def update(self): glMatrixMode(GL_MODELVIEW) gluLookAt(self.position[0], self.position[1], self.position[2], self.position[0] + self.front[0], self.position[1] + self.front[1], self.position[2] + self.front[2], self.upVector[0], self.upVector[1], self.upVector[2]) def getPos(self): return self.position def translateCamera(self, vector): self.position = self.position + vector def keyboardControl(self): keys = pygame.key.get_pressed() if keys[K_LALT] and keys[K_F4]: pygame.quit() quit() if keys[K_w] and not isSprinting: self.position += self.front * 0.02085 if keys[K_s]: self.position -= self.front * 0.02085 if keys[K_d]: self.position += glm.normalize(glm.cross(self.front, self.upVector)) * 0.02085 if keys[K_a]: self.position -= glm.normalize(glm.cross(self.front, self.upVector)) * 0.02085
[放开键,相机一直在滑行,而且我想也许是因为我没有在某个地方重置矩阵,所以它只是一遍又一遍地应用gluLookAt()给出的矩阵。
[我也尝试了GLM,并设法通过glm.lookAt()创建了我想要的转换矩阵,但是我不知道如何将其传递给OpenGL处理。
如果有人还可以解释如何使用glPushMatrix和glPopMatrix,以及何时必须使用glLoadIdentity,我将非常感激。非常感谢!
我是一名业余程序员,最近刚接触OpenGL。我目前正在使用PyOpenGL模块在Python中进行编程。我开始研究用于视野控制的摄像头模块,但遇到问题...
[放开键,相机一直在滑行,我想也许是因为我没有在某个地方重设矩阵,所以它只会一遍又一遍地应用
gluLookAt()
给出的矩阵。