我试图在PyOpenGL Legacy中实现一个轨道相机,并试图让它放大和缩小(所以,前进和后退)。
下面是相关的代码:
def update(self):
self.pos = self.orbitalPos()
print(f"self.pos length {self.magnitude(self.pos)}")
self.look = self.pos * (-1.0)
gluLookAt(*(self.pos), *(self.look), *(self.up))
def moveForward(self):
print("in moveForward")
direction = glm.normalize(self.look)
speed = direction * 0.001
self.pos = self.pos + speed
self.radius = self.magnitude(self.pos)
print(self.radius)
def moveBack(self):
print("in moveBack")
direction = glm.normalize(self.look)
speed = direction * (-0.001)
self.pos = self.pos + speed
self.radius = self.magnitude(self.pos)
print(self.radius)
def orbitalPos(self):
return glm.vec3(
self.radius * math.sin(math.radians(self.phi)) * math.sin(math.radians(self.theta)),
self.radius * math.cos(math.radians(self.phi)),
self.radius * math.sin(math.radians(self.phi)) * math.cos(math.radians(self.theta))
)
def magnitude(self, vec):
return math.sqrt(vec.x ** 2 + vec.y ** 2 + vec.z ** 2)
在main函数中,我调用了moveForward()或moveBack(),然后调用update()。
这只是放大和缩小,所以phi和theta保持不变,唯一改变的是半径,它随着moveForward()减小,随着moveBack()增大,这是应该的。但是在pygame窗口中,无论我按什么键,对象都是越来越远。
我很确定我在代数上犯了什么错误,但我不知道是什么。有什么想法吗?
1条答案
按热度按时间zf9nrax11#
gluLookAt
不仅设置了一个矩阵,而且定义了一个矩阵,并将当前矩阵(可以是上一帧的矩阵)与新的look at
矩阵相乘。因此,在调用gluLookAt
之前,必须先用glLoadIdentity
加载identity matrix: