OpenGL';s look函数?

OpenGL';s look函数?,opengl,glulookat,Opengl,Glulookat,这与 我试过了 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); gluLookAt(512, 384, 20

这与

我试过了

    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);
    gluLookAt(512, 384, 2000,
              512, 384, 0,
              0.8f, 1.0f, 0.8f);
而且完全一样。。。接下来,我尝试并修改了第三行,第一个数字为
0.8

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

现在视图好像向左旋转了45度。这个上方向向量是如何工作的?

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

简言之,上方向向量描述了摄像机的滚动,即摄像机方向上的哪个点是“向上的”

希望有帮助。:)


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

上方向向量用于在提供给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中“向上”向量背后的直觉很简单:看任何东西。现在将你的头倾斜90度。你所在的位置没有改变,你看的方向没有改变,但你视网膜中的图像明显改变了。有什么区别?你的头顶指向哪里。这就是向上向量。)它的工作原理和它看起来的一样

想象你在太空中的某个地方。想象一下,你正朝着-Z方向看2000个单位

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

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

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

如果将“向上方向”指定为非零Z坐标,则它现在部分指向视图方向(即:Z轴)。这一部分最终与你得到的上升方向无关,因此被忽略。如果向上方向提供非零X坐标,则该坐标不在视图方向上,因此非常重要


这样做的目的是,如果您更改了“视图查看”或“摄影机原点”,则不必也更改“向上方向”。只要你不直接沿着上轴看,你就没事。

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

如果我坐在椅子上直视前方,将iPad举在眼前,那么我的头顶指向天空,因此
(0,1,0)
。。。如果我把它改成
(0,0.00001,1)
,那就意味着我几乎要躺下了,现在我的脸和眼睛都面向天空。。。那么,如果我使用
(0,1,0)
,结果会是完全一样的吗?@JeremyL:因为如果你脸朝着天空躺着,眼睛对着天空,你就不会再看你的iPad了。看到问题了吗?函数必须找出哪些是最重要的约束。相机位置和注视位置在决定你注视的方向上胜过向上方向。在决定你看的地方后,向上方向严格用于方向。改变向上的方向永远不会改变你看的方向,只会改变你看这个方向的方式。我想说的是,如果你几乎要躺下,结果与坐在椅子上面对直是完全一样的ahead@JeremyL:除了它不是。你不能躺在那里,看着与你直视前方时相同的点。一个人必须优先,而注视点才是最重要的。您仍然无法理解上方向向量不会更改摄影机指向的方向。如果要显示摄影机“躺着”,则必须更改注视点。“因此,简而言之,上方向向量描述摄影机的俯仰、偏航和滚动,表示摄影机方向上的哪个点是“向上的”。“错误。“向上”只是滚动(偏航和俯仰受到相机所观察点的限制)。这可能很旧,但感谢这一点,这是迄今为止对我有意义的第一个解释!