gluLookAt的解释?

39

尝试理解gluLookAt函数,特别是最后三个参数。

有人能够解释一下吗?

gluLookAt(camera[0], camera[1], camera[2], /* look from camera XYZ */ 
          0, 0, 0,  /* look at the origin */ 
          0, 1, 0); /* positive Y up vector */
  1. "正 Y 上向量" 到底是什么意思?
  2. 最后的上向量 3 个参数都设为 1(例如,1、1、1),这种情况可能吗?如果可能的话,它到底代表什么?
  3. 上向量的值是否可能大于1,例如2、3、4?

谢谢。

4个回答

74

Sketchup来拯救!

GluLookAt参数

你的图像有一个“上升”方向,可以与世界的上升方向分离。这个图像中的蓝色窗口可以被认为是你所绘制的“近平面”:就像你的显示器一样。如果你只提供了眼点和注视点,那么这个窗口是自由旋转的。你需要提供一个额外的“上升”方向来固定它。如果你提供的向量长度不是单位长度,OpenGL将归一化该向量。OpenGL还会将其投影下来,以使它与由eyeat定义的“z”向量形成90度的角度(除非你提供的“上升”向量与从“眼睛”到“at”的线路完全相同)。一旦定义了“内部”(z)和“上升”(y)方向,就容易从这两个方向计算出“右”或(x)方向。

在这个图中,如果蓝轴指向y方向,则“提供”的向上向量为(0,1,0)。如果你提供(1,1,1),它可能会将图像旋转45度,因为这意味着蓝色窗口的顶部应该朝向那个方向。因此,人物的图像看起来会向相反的方向倾斜。


你提供的图片没有显示出来!可能链接已经过期了。 - Sihat Afnan

8
gluLookAt函数的"up向量"仅表示相机的方向。如果你有一个摄像机在某一位置,直接对准一个物体,那么还有一个自由度:旋转。想象一个固定不动、直接对准一个物体的相机。但是,你的相机还可以旋转,从而使图像旋转。OpenGL 使用"up向量"将此旋转锁定在一个位置。
假设(0, 0, 0)位于相机正前方。现在,"up向量"只是相机周围的一个坐标系。然而,一旦确定了"up向量",OpenGL就会旋转相机,直到相机的顶部朝向"up向量"的坐标。
如果"up向量"为(0, 1, 0),则相机将正常对准物体,因为"up向量"正好在相机正上方,所以相机的顶部也在上面,相机的方向正确。但是,如果把"up向量"移动到(1, 1, 0),为了让相机的顶部指向"up向量",相机需要旋转45度,整个图像也会旋转45度。
这篇文章不是一份深入教程,而是为了帮助更好地理解其他优秀回答中的"up向量"概念。

6

前三个参数是相机位置,接下来的三个参数是目标位置, 最后三个参数代表相机旋转。

非常重要的一点是,在 "glMatrixMode (GL_MODELVIEW);" 之后使用 gluLookAt。

另一个有用的提示是,总是将最后三个参数指定为0,0,1。 通常,坐标被写成 x、y、z。z 是向上的向量。 0,1,0 很容易引起混淆,因为它表示 x、z、y。 所以最好把它留在0,0,1。


如果您仍然无法理解,那么您可以尝试对向量进行实验。 - Fennekin

2

最后一个向量,也被称为相机的上向量,定义了相机的方向。

想象一下一个棒子连接在一个“真实”的相机的顶部。这个棒子的方向就是上向量。

通过将其从(0,1,0)更改,您可以进行侧向滚动。


还是不太明白。当参数为(1,0,0)与(0,1,0)与(0,0,1)时,up-vector有什么区别?找不到网站上的图片帮助我理解。如果有人知道在哪里可以找到,请告诉我。 - Johnnt Jazz
1
@Johnnt:想象一下站在你房间地板上某个特定位置的观察者,朝向门口。现在,这个观察者可以坐着、侧躺左侧或侧躺右侧。除了他们的位置和朝向,你还需要知道观察者头部的旋转情况。 - Ben Voigt
3
在Ben的解释基础上,想象一下你的相机顶部有一个天线。这就是“相机向上”的方向。作为手持视频相机,当保持相机对准主题时旋转相机!现在相机向上可以指向任何方向,甚至是倒置的方向!这就是gluLookAt的up XYZ坐标的作用-告诉GL相机的朝向。在大多数情况下,0,1,0是可行的,但如果相机直接向上或向下看,则会出现问题,此时0,0,1是一个好的起点,但您可能需要进行实验。 - Olie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接