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

6l7fqoea  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(127)

我试图在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窗口中,无论我按什么键,对象都是越来越远。
我很确定我在代数上犯了什么错误,但我不知道是什么。有什么想法吗?

zf9nrax1

zf9nrax11#

gluLookAt不仅设置了一个矩阵,而且定义了一个矩阵,并将当前矩阵(可以是上一帧的矩阵)与新的look at矩阵相乘。因此,在调用gluLookAt之前,必须先用glLoadIdentity加载identity matrix

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))

相关问题