OpenGL的LookAt函数中的UP向量究竟是什么?

时间:2012-05-17 12:42:37

标签: opengl glulookat

这与The LookAt target location doesn't matter if it is z = 0 or z = 1000 or -1000?

有关

我试过

    gluLookAt(512, 384, 2000,
              512, 384, 0,
              0.0f, 1.0f, 0.0f);

并且工作正常,现在我将第3行(UP向量),最后一个数字更改为0.8

    gluLookAt(512, 384, 2000,
              512, 384, 0,
              0.0f, 1.0f, 0.8f);

并且它完全相同...接下来我尝试并修改了第3行,第一个数字为0.8

    gluLookAt(512, 384, 2000,
              512, 384, 0,
              0.8f, 1.0f, 0.8f);

现在视图就像是向左旋转了45度。这个UP向量如何工作?

4 个答案:

答案 0 :(得分:30)

向上矢量用于创建提供给gluLookAt的眼睛和中心向量之间的叉积。

从iOS上的GLKit标题中,您可以看到实现为:

static __inline__ GLKMatrix4 GLKMatrix4MakeLookAt(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ)
{
    GLKVector3 ev = { eyeX, eyeY, eyeZ };
    GLKVector3 cv = { centerX, centerY, centerZ };
    GLKVector3 uv = { upX, upY, upZ };
    GLKVector3 n = GLKVector3Normalize(GLKVector3Add(ev, GLKVector3Negate(cv)));
    GLKVector3 u = GLKVector3Normalize(GLKVector3CrossProduct(uv, n));
    GLKVector3 v = GLKVector3CrossProduct(n, u);

    GLKMatrix4 m = { u.v[0], v.v[0], n.v[0], 0.0f,
        u.v[1], v.v[1], n.v[1], 0.0f,
        u.v[2], v.v[2], n.v[2], 0.0f,
        GLKVector3DotProduct(GLKVector3Negate(u), ev),
        GLKVector3DotProduct(GLKVector3Negate(v), ev),
        GLKVector3DotProduct(GLKVector3Negate(n), ev),
        1.0f };

    return m;
}

此问题How do I use gluLookAt properly?中接受的答案提供了向上矢量实际影响的内容的良好描述。

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

答案 1 :(得分:21)

向上矢量确定哪个方向是“向上”。可以把它想象成一个摄像机...如果你“正确地”拿着相机,那么从摄像机中心向上移动到相机顶部的假想线可以用矢量(0,1,0)表示。如果将摄像机向右倾斜45度,则从摄像机中心到摄像机“顶部”的假想线现在将由新矢量(1,1,0)表示。如果你稍后向后倾斜相机,你的“向上”矢量现在变为(1,1,1)[或(1,1,-1)...我总是得到z轴的极性逆转。

因此,简而言之,UP向量通过说明相机朝向哪个点“向上”来描述相机的滚动。

希望有所帮助。 :)

(根据评论编辑以更正摘要)

答案 2 :(得分:5)

gluLookAt的前两个参数是摄像机位置和摄像机目标。只有这两个相机没有完全约束。想象一下站在拿着相机的地方。您可以水平握住相机拍摄风景照片,也可以垂直握住相机拍摄人像照片。在这两种情况下,相机的位置和图片主题的位置是相同的。您可以将相机旋转到任何角度,这两个值不会改变。第三个参数,向上矢量,选择摄像机的方向。

答案 3 :(得分:3)

它的工作方式与它的工作方式完全相同。

想象一下你在太空中的某个角落。他们想象你从-Z方向直接看到2000个单位。

有无数可能的相机具有这些特征,但它们的不同仅仅是基于具有不同的“向上”方向。因此,不同的“向上”方向对应于围绕视图方向具有不同的方向。

向上矢量是与您希望相机具有的“向上”方向对齐的矢量方向。也就是说,如果你要从相机点绘制向上矢量,你会看到一条垂直的直线向上。

现在,回顾一下你想象的视图,然后看看那条垂直线。你能说出这条垂直线是朝向还是远离你?没有;它只是一条垂直线。因此,向上部分指向视图方向并不重要。重要的是向上方向不是完全指向视图方向。

当向上方向给出非零Z坐标时,它现在部分指向视图方向(即:Z轴)。那部分最终与你获得的向上方向无关,所以它被忽略了。当你向上方向给出一个非零的 X 坐标时,在视图方向上不是,所以它很重要。

关键在于,如果更改视图观察点或摄像机原点,则不必更改向上方向。只要你没有直接沿着向上轴看,你就没事了。