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

Jer*_*y L 18 opengl glulookat

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

我试过了

    gluLookAt(512, 384, 2000,
              512, 384, 0,
              0.0f, 1.0f, 0.0f);
Run Code Online (Sandbox Code Playgroud)

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

    gluLookAt(512, 384, 2000,
              512, 384, 0,
              0.0f, 1.0f, 0.8f);
Run Code Online (Sandbox Code Playgroud)

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

    gluLookAt(512, 384, 2000,
              512, 384, 0,
              0.8f, 1.0f, 0.8f);
Run Code Online (Sandbox Code Playgroud)

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

Cap*_*uff 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;
}
Run Code Online (Sandbox Code Playgroud)

此问题中接受的答案如何正确使用gluLookAt?提供了向上矢量实际影响的内容的良好描述.

(gluLookAt中"up"向量背后的直觉很简单:看看任何东西.现在将你的头部倾斜90度.你没有改变的地方,你所看到的方向没有改变,但是你的形象是视网膜显然有.有什么不同?头顶指向的位置.这是向上的向量.)


Cod*_*Hxr 21

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

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

希望有所帮助.:)

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

  • 这可能是旧的,但多亏了这一点,这是迄今为止对我有意义的第一个解释! (4认同)

Iro*_*san 5

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