c++ - 如何为 LookAt 转换获取正确的 Up vector ?

标签 c++ math 3d glm-math

我确实了解 glm::LookAt 的工作原理以及它需要哪些参数。 我不明白如何提供正确的向上 vector 。

例如,这个:

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));

这是行不通的。矩阵将包含 NaNs(不是数字)值! 那么如何获得正确的Up vector 值呢?

最佳答案

您得到 NaN 的原因是被零除


引用 this post :

The up vector is basically a vector defining your world's "upwards" direction. In almost all normal cases, this will be the vector (0, 1, 0) i.e. towards positive Y. eye is the position of the camera's viewpoint, and center is where you are looking at (a position).

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

enter image description here

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

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

enter image description here

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

由于您只提供向上 vector 和(实际上,因为 d = p - c)方向 vector ,我们必须使用 叉积 计算正确的 vector :

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)!这是因为方向和向上 vector 是反平行的,而它们之间应该有一个角度才能使程序正常工作(理想情况下为 90 度)。当 r 被归一化时,除以零,因此矩阵的整个第一行应该被 NaN 占据。

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

关于c++ - 如何为 LookAt 转换获取正确的 Up vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47187970/

相关文章:

c++ - 调用宏时参数太多

计算成员(member)价格的Python函数

c++ - 余弦/正弦矩阵数学

algorithm - 列出条目总和为 n 的所有 k 元组,忽略旋转

javascript - three.js 是否有等效的背面可见性?

python - 在python中的3D numpy数组中绘制三角形

c++ - 要在 Windows 上读取/设置用户屏幕保护程序,我是否需要使用系统注册表或 SystemParametersInfo API?

c++ - 编写线程安全的容器

c++ - BOOST_FUSION_ADAPT_ADT找不到设置方法

graphics - 在不使用图形 API 的情况下编写 3d 游戏