OpenGL LookAt函数:上向量是任意的吗?

7

我正在尝试理解glLookAt函数。

它需要三个三元组。第一个是眼睛位置,第二个是眼睛注视的点。那个点会出现在我的视口中心,对吗?第三个是“上”向量。如果它垂直于从眼睛到注视点的向量,我理解“上”向量的含义。问题是,是否允许为up指定其他向量,如果可以,那么意义是什么?

非常感谢提供gluPerstpectiveglLookAtglFrustum的图形详细说明链接。官方的OpenGL文档似乎不适合新手。

请注意,当up向量垂直于眼睛->物体向量时,我理解up向量的含义。问题是,如果不是这样,它有什么含义(如果有的话)。我不能通过调整参数来弄清楚这一点。


非常感谢大家。每个答案都包含了一些有用的信息。我的问题已经得到解答。谢谢。 - Armen Tsirunyan
5个回答

11
只要“足够垂直”于向上的矢量,它就能正常工作。重要的是向上矢量和观察矢量之间的平面。
如果这两个向量对齐,则向上方向将更多或更少地随机(基于值中非常小的位),因为对其进行小调整将使其指向观察矢量的上方/左侧/右侧。
如果它们在32位浮点数学中具有足够大的分离角度,则它将正常工作。这个角度通常不需要超过一度左右,所以它们可以非常接近。但是,如果差异仅剩下几个位,每个改变的位都会产生巨大的方向变化。
这涉及到数字精度问题。
(我相信有更多数学术语和定义,但是距离大学已经过去了几年... :)
最后一个要点:如果向量平行,则向上方向完全未定义,您将得到一个退化的视图矩阵。

谢谢。你能看一下我对thecoshman答案的评论吗?这是你的意思吗? - Armen Tsirunyan
他所说的是,如果您的上向量为(0,1,0),并且您决定对齐眼睛和物体,使得眼睛->物体的法线为(或非常接近)(0,1,0),则会发现相机可能会旋转到未定义的角度。不过我发现,在实践中,这种情况并不会发生,我从来没有将两者对齐到足以导致这个问题。 - thecoshman
@Armen:正确。随着投影变得越来越小(当向上和观察向量共线时),投影的方向(这才是重要的)会因为任意一个向量的微小变化而突然改变。只有在这种情况下,你才会遇到问题。 - Macke

3

up向量让OpenGL知道你的相机是朝哪个方向的。

想象现实世界中,如果有两个空间点,你可以从一个点画一条线到另一个点。然后你可以对准一个物体(比如相机),使其指向另一个点。但你不知道围绕这个线形成的轴心应该旋转多少度。up向量决定了相机应该朝哪个方向站立。

大多数时候,你的up向量将是(0,1,0),这意味着相机会像正常拿相机一样旋转,或者你抬起头直视前方。如果你设置up向量为(1,0,0),那么就像把头侧着,从头底部到头顶朝右。你仍然从同一个点(或多或少)观察到同一个点,但你的'up'发生了变化。 看向量 (0,-1,0) 会使相机倒置,就像你在做手倒立一样。

你可以这样思考:你的手臂是从相机位置(肩膀)到相机观看点(食指)的向量,如果伸出拇指,这就是你的up向量。

这张图片可能会对你有所帮助http://images.gamedev.net/features/programming/oglch3excerpt/03fig11.jpg

EIDT

是否垂直无所谓。

我现在明白你的问题了。例如,你在 (10,10,10) 处看向 (0,0,0),你观察方向的结果向量为 (-10,-10,-10),对于你up向量的glLookAt目的来说,垂直于这个向量的向量并不重要,如果你想让视图朝着一个正常人稍微向下看的方向,只需将你的up向量设置为(0,1,0)。事实上,除非你想旋转相机,否则不需要将其设置为其他任何值。


非常感谢,但我仍然不明白如果上向量不垂直于从眼睛到物体的向量会发生什么。 - Armen Tsirunyan
假设A是垂直于眼睛->物体向量的平面。您是否意味着只有向上矢量在平面A上的投影才重要? - Armen Tsirunyan
嗯...让我想想。是的...我想。我能确定的是,眼睛->物体点非常陡峭地向上或向下,同样的向上矢量仍然有效。如果OpenGL需要垂直于我的视线矢量的内容,那么我不必自己计算,因为它会自动计算(为您)。 - thecoshman
Armen:那么你仍然会朝着同一个方向看,但可能会感觉自己是倒立的,或者侧躺着。 - Kylotan

2

并且像往常一样,对于链接的内容:“错误404-文档未找到” - Kromster
1
@KromStern,感谢您指出这一点。我已经用新链接更新了答案。 - bruno

1

上向量不需要垂直于观察方向。只要它不是平行的(或非常接近于平行),就可以使用。

给定一个视图平面法线N(观察方向)和一个向上的向量(不能与N平行),UV,您可以通过首先计算向量V = UV -(N * UV)N来计算将在相机变换中使用的实际向上向量。然后使用V来计算实际使用的向上向量,通过创建一个同时垂直于N和V的向量U = N x V。


0

是的。这是任意的,可以让您使相机“滚动”,即看起来场景围绕眼睛轴旋转。


我的意思是,只要它垂直于眼轴,那么它就是任意的,但是如果不是呢?我仍然无法想象其含义... - Armen Tsirunyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接