【问题标题】:How do I use gluLookAt properly?如何正确使用 gluLookAt?
【发布时间】:2011-03-23 17:55:18
【问题描述】:

我不想使用复杂的三角函数来计算我的 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.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轴上左右移动。实际发生的情况是,当我使用左右键时,立方体将围绕被按键加速的“眼睛”旋转。向上键使另一个立方体从无处穿过屏幕并击中第一个立方体。向下键将神秘的克隆立方体带回来。这可以与轮换相结合,得到与文档所述完全不同的结果。

到底怎么了?

谢谢。

【问题讨论】:

    标签: python opengl graphics pyopengl


    【解决方案1】:

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

    【讨论】:

    • 非常感谢。它现在完美运行。我现在可以继续做更高级的事情了。但是你是说 gluLookAt 很慢吗?
    • 不是慢。正是 gluLookAt 隐藏了一些你在进行严肃的 OpenGL 编程时应该知道的事情。特别是,您应该学会组合不同的坐标变换。这需要习惯,而且一开始有点令人沮丧,但最终会得到回报:许多图形技术都是建立在巧妙地转换坐标系之上的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多