23

这与LookAt 目标位置无关,如果它是 z = 0 或 z = 1000 或 -1000?

我试过

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

一切正常,现在我将第三行(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

4 回答 4

32

向上向量用于创建提供给 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;
}

这个问题中接受的答案如何正确使用 gluLookAt?很好地描述了向上向量的实际影响。

(gluLookAt 中“向上”向量背后的直觉很简单:看任何东西。现在将头倾斜 90 度。你在哪里没有改变,你正在看的方向没有改变,但是你的图像视网膜明显有。有什么区别?你的头顶指向的地方。那是向上的向量。)
于 2012-05-17T12:55:26.577 回答
25

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

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

希望有帮助。:)

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

于 2012-05-17T12:52:24.873 回答
5

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

于 2012-05-17T12:58:17.610 回答
3

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

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

具有这些特征的可能的摄像机数量不计其数,但它们的不同仅在于具有不同的“向上”方向。因此,不同的“向上”方向对应于围绕观察方向具有不同的方向。

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

现在,回头看看你想象的视图,看看那条垂直线。你能分辨出那条垂直线是朝着你还是远离你?不; 它只是一条垂直线。因此,向上向量是否部分指向视图方向并不重要。重要的是向上方向并不完全指向视图方向。

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

这样做的目的是,如果您更改视图观察点或相机原点,您也不必更改向上方向。只要您不直接沿着上轴看,就可以了。

于 2012-05-17T12:56:07.447 回答