我如何正确使用gluLookAt?

时间:2010-07-31 22:57:20

标签: python opengl graphics pyopengl

我不想进入复杂的三角函数计算旋转和我的3D世界那样的东西所以gluLookAt似乎是一个不错的选择。根据文档,我需要做的就是为摄像机位置放置3个坐标,为我应该看到的位置设置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.1,100)”基本上将投影矩阵设置为具有45度视角和近和远坐标为0.1和100。

第一个gluLookAt很好地将相机放在正确的位置。

我有一个以(0,0,0)为中心绘制的立方体,没有gluLookAt它可以正常工作。在我绘制它之前,我有这个代码:

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轴。实际发生的事情是,当我使用左右键时,立方体将围绕由键加速的“眼睛”旋转。向上键导致另一个立方体从无处穿过屏幕并击中第一个立方体。向下键将神秘的克隆立方体带回来。这可以与轮换相结合,以提供完全不同的结果,因为文档说会出现。

究竟出了什么问题?

谢谢。

1 个答案:

答案 0 :(得分:38)

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

但要回答你的问题: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。