Python 如何正确使用gluLookAt?

Python 如何正确使用gluLookAt?,python,opengl,graphics,pyopengl,Python,Opengl,Graphics,Pyopengl,我不想进入复杂的三角学来计算我的3D世界的旋转和类似的东西,所以gluLookAt似乎是一个不错的选择。根据文档,我所需要做的就是为摄像机的位置放置3个坐标,三个坐标表示我应该看到的位置,以及一个“向上”的位置。最后一个没有意义,直到我假设它必须与屏幕顶部的视线方向成直角 它根本就不是那样工作的。我有一些python代码。这是我进入游戏这一部分时初始化一些数据和一些模式代码的代码: def init(self): self.game_over = False self.z = -

我不想进入复杂的三角学来计算我的3D世界的旋转和类似的东西,所以gluLookAt似乎是一个不错的选择。根据文档,我所需要做的就是为摄像机的位置放置3个坐标,三个坐标表示我应该看到的位置,以及一个“向上”的位置。最后一个没有意义,直到我假设它必须与屏幕顶部的视线方向成直角

它根本就不是那样工作的。我有一些python代码。这是我进入游戏这一部分时初始化一些数据和一些模式代码的代码:

def init(self):
    self.game_over = False
    self.z = -30
    self.x = 0
def transfer(self):
    #Make OpenGL use 3D
    game.engage_3d(45,0.1,100)
    gluLookAt(0,0,-30,0,0,0,0,1,0)
“game.engage_3d(45,0.1100)”基本上设置了投影矩阵,使其具有45度的视角以及0.1和100的远近坐标

第一眼将相机很好地放在正确的位置

我画了一个以(0,0,0)为中心的立方体,它在不看的情况下工作得很好。在绘制之前,我有以下代码:

gluLookAt(self.x,0,self.z,0,0,0,0,1,0)
if game.key(KEY_UP):
    self.z += 2.0/game.get_fps()
if game.key(KEY_DOWN):
    self.z -= 2.0/game.get_fps()
if game.key(KEY_LEFT):
    self.x += 2.0/game.get_fps()
if game.key(KEY_RIGHT):
    self.x -= 2.0/game.get_fps()
从那以后,向上的位置应该始终保持不变,因为它始终处于直角。我想它会做的是用上下键前后移动z轴,用左右键左右移动x轴。实际情况是,当我使用左右键时,立方体将围绕着被键加速的“眼睛”旋转。向上键使另一个不知从何而来的立方体穿过屏幕并击中第一个立方体。向下键将神秘的克隆立方体带回来。这可以与轮换相结合,以产生完全不同的结果,正如文件所说的那样

到底怎么了

谢谢。

(gluLookAt中“向上”向量背后的直觉很简单:看任何东西。现在将你的头倾斜90度。你所在的位置没有改变,你看的方向没有改变,但你视网膜中的图像清楚地改变了。有什么区别?你的头顶指向哪里。这就是向上向量。)

但要回答您的问题:gluLookAt调用不应该连接。换句话说,如果您不知道gluLookAt是如何工作的,那么可以使用gluLookAt的唯一模式如下:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(...);
# do not touch the modelview matrix anymore!
从代码中可以看出,您正在执行以下操作:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(...);
# some stuff..
gluLookAt(...);

这将产生奇怪的结果,因为gluLookAt将当前矩阵乘以它计算的查看矩阵。如果您想连接转换,最好弄清楚如何使glTranslate、glScale和glRotatef为您工作。更好的是,您应该学习坐标变换的工作原理并坚持使用glMultMatrix。

非常感谢。它现在工作得很好。我现在可以进入更高级的领域。但你是说gluLookAt很慢吗?并不是说它很慢。gluLookAt隐藏了一些在进行OpenGL编程时应该知道的事情。特别是,您应该学习组合不同的坐标变换。这需要习惯,一开始有些令人沮丧,但最终会有回报:许多图形技术都建立在巧妙地变换坐标系的基础上。