如何为LookAt转换找到正确的向量?

时间:2017-11-08 19:20:31

标签: c++ math 3d glm-math

我确实理解glm :: LookAt是如何工作的以及它需要什么参数。 我无法理解如何提供正确的向上矢量。

例如,这个:

glm::mat4x4 transformation = glm::lookAt(cameraPosition, targetPosition, glm::vec3(0.f, 1.f, 0.f));

如果我想直接制作相机手表:

 mat4x4 transformation = glm::lookAt(vec3(0.f, 1.f, 0.f), vec3(0.f, 0.f, 0.f), vec3(0.f, 1.f, 0.f));

它无效。 Matrix将包含 NaNs (非数字)值! 那么如何为Up vector获得正确的价值?

1 个答案:

答案 0 :(得分:3)

你得到NaN的原因是除以零

引用this post

  

向上矢量基本上是一个矢量,用来定义你的世界"向上"   方向。在几乎所有正常情况下,这将是向量(0,1,   0)即朝向正Y.眼睛是相机的位置   观点,中心是你正在看的地方(一个位置)。

设置如何工作?下图说明了:

enter image description here

  • u是向上矢量(第三个参数)
  • p是目标位置(第二个参数)
  • c是相机位置(第一个参数)
  • d是方向向量(= p - c
  • r是正确的向量

lookAt返回视图矩阵,其格式如下:

enter image description here

(其中"帽子"表示标准化 - 长度为1)

由于你只提供向上矢量和(有效地,因为d = p - c)方向向量,我们必须使用交叉产品计算正确的向量

enter image description here

(注意以上是在标准化之前)

现在为什么你的例子没有按预期工作。这样的论点:

  • u = (0, 1, 0)
  • p = (0, 0, 0)
  • c = (0, 1, 0)
  • 因此d = (0, -1, 0)

上面给出了r = d * u = (0, 0, 0)!这是因为方向和向上矢量是反平行的,而它们之间应该有一个角度,以便日常工作(理想情况下为90度)。当r被归一化时,除以零,因此矩阵的整个第一行应该被NaN's占用。

(作为一种可能的解决方法,请尝试使用up = (0, 0, 1)。)