到底是什么UP矢量在OpenGL的注视功能?(What exactly is the UP vect

2019-06-24 13:06发布

这是有关的注视目标的位置,如果它是Z = 0或Z = 1000或-1000不要紧?

我试过了

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

而事情做工精细,现在我的第三行(向上矢量),最后的数字更改为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矢量工作?

Answer 1:

向上矢量被用于创建提供给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度如果你没有改变,你看没有改变方向,但在你的形象视网膜明明已经什么区别?如果你的头顶指向,这就是向上矢量)。


Answer 2:

向上矢量确定哪个方向是“向上”。 认为它像一台摄像机...如果你握住相机“正常”,然后假想线从摄像机的中心到摄像头的顶部向上去可以用向量表示为(0,1,0) 。 如果你倾斜相机45度到右边,从摄像机的中心要到相机的“顶部”的假想线现在将通过一个新的向量(1,1,0)表示。 如果然后倾斜相机“回”只是有点,你的“up”矢量现在变成(1,1,1)或(1,1,-1)......我总是得到z轴的极性逆转。

因此,简而言之,向上矢量说这点是“向上”在相机的方向说明相机的卷。

希望帮助。 :)

(编辑更正内容摘要根据注释)



Answer 3:

gluLookAt的前两个参数是摄像机的位置和摄像机目标。 只有这两个相机不能完全约束。 想象一下,站在某处拿着相机。 你可以横握相机进行拍摄风景照片,或者你可以竖持相机进行拍摄的肖像照片。 在两种情况下,摄像机的位置和图像的对象的位置是相同的。 您可以在摄像机旋转到任何角度,这两个值不会改变。 第三个参数,向上矢量,选择摄像机的取向。



Answer 4:

它的工作原理,它看起来像它的工作原理完全相同的方式。

想象一下,你在空间的某个位置。 和他们想象你从你的-Z方向直接2000台看一些点。

有可能的相机具有这些特征的无穷多,但他们完全基于具有不同的“向上”的方向是不同的。 因此,不同的“向上”方向对应于具有围绕的观察方向不同的取向。

向上矢量是与您希望相机拥有“向上”方向排列的矢量方向。 也就是说,如果你从你的相机点绘制了向量,你会看到一个直线的垂直线朝上。

现在,回头看看你想像中的观点,并期待在此垂直线。 你能告诉我们,如果是垂直线是走向或远离你? 没有; 它只是一个垂直线。 因此,它并不重要,如果向上向量在视图方向部分点。 重要的是,向上的方向是不完全视方向指向。

当你给向上方向非零Z坐标,现在部分地在视图方向(:Z轴即)所指出的。 这部分最终是无关的,你得到了方向,因此将其忽略。 当你给了方向非零X坐标,这不是在视图方向,所以它是显著。

这样做的问题是这样,如果你改变了观点看,在或相机原点,你不必改变了方向了。 只要你不沿上轴直接看,你的罚款。



文章来源: What exactly is the UP vector in OpenGL's LookAt function?