代码之家  ›  专栏  ›  技术社区  ›  Matthew Mitchell

如何正确使用gluLookAt?

  •  14
  • Matthew Mitchell  · 技术社区  · 16 年前

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

    一点都不管用。我有一些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\u 3d(45,0.1100)”基本上设置投影矩阵,使其具有45度视角和0.1和100的远近坐标。

    第一眼把相机放在正确的位置,很好。

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

    到底怎么了?

    1 回复  |  直到 16 年前
        1
  •  39
  •   Carlos Scheidegger    16 年前

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

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

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(...);
    # do not touch the modelview matrix anymore!
    

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