不能用gluLookAt()放大,只能缩小?



我试图在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)

Up为(0,1,0)。在main函数中,我调用了moveForward()或moveBack(),然后调用了update()。

这只是放大和缩小,所以phi和θ保持不变,唯一改变的是半径,它随着moveForward()而减小,随着moveBack()而增大,这是应该的。但是在pygame窗口中,无论我按什么键,对象都会越来越远。

我很确定我在代数上做了什么,但我不知道是什么。什么好主意吗?

gluLookAt不仅设置一个矩阵,而且定义一个矩阵,并将当前矩阵(可以是最后一帧的矩阵)与新的look at矩阵相乘。因此,您必须在调用gluLookAt之前用glLoadIdentity加载单位矩阵:

def update(self):
self.pos = self.orbitalPos()
print(f"self.pos length {self.magnitude(self.pos)}")
self.look = self.pos * (-1.0)
glLoadIdentity()
gluLookAt(*(self.pos), *(self.look), *(self.up))

最新更新