如何为 LookAt 转换获取正确的 Up 向量?
How to get right Up vector for LookAt transformation?
我确实了解 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));
不行。矩阵将包含 NaNs(不是数字)值!
那么如何获得Up向量的正确值呢?
您得到 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).
设置如何工作?下图说明:
u
是向上向量(第三个参数)
p
是目标位置(第二个参数)
c
是相机位置(第一个参数)
d
为方向向量(=p - c
)
r
是右向量
lookAt
returns 视图矩阵,格式如下:
(其中 "hats" 表示 标准化 - 长度为 1)
由于您只提供向上向量和(实际上,因为 d = p - c
)方向向量,我们必须使用 叉积 计算正确的向量:
(注意上面是归一化之前)
现在说明为什么您的示例没有按预期工作。这样的论点:
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 占据。
(作为可能的解决方法,请尝试 up = (0, 0, 1)
。)
我确实了解 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));
不行。矩阵将包含 NaNs(不是数字)值! 那么如何获得Up向量的正确值呢?
您得到 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).
设置如何工作?下图说明:
u
是向上向量(第三个参数)p
是目标位置(第二个参数)c
是相机位置(第一个参数)d
为方向向量(=p - c
)r
是右向量
lookAt
returns 视图矩阵,格式如下:
(其中 "hats" 表示 标准化 - 长度为 1)
由于您只提供向上向量和(实际上,因为 d = p - c
)方向向量,我们必须使用 叉积 计算正确的向量:
(注意上面是归一化之前)
现在说明为什么您的示例没有按预期工作。这样的论点:
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 占据。
(作为可能的解决方法,请尝试 up = (0, 0, 1)
。)