【发布时间】:2021-10-10 19:17:24
【问题描述】:
假设我来自左撇子世界空间。我的正 Z 在屏幕上,我的 Y 在上,与 OpenGL 在剪辑空间中的默认值相同。
据我了解,当来自右手世界空间时(在使用 gluLookAt 等将前向向量映射到 -Z 轴的旧函数时,这在一定程度上是必需的),Z 坐标在计算之前被翻转投影矩阵(正交/透视)。这是因为右手系统在屏幕上的 Z 值为负,在传递给 OpenGL 之前需要翻转。
我已经确认,对于 orthoLH_ZO 等函数,不会发生翻转。事实上,矩阵是一种“标准”正交投影,也适用于例如Vulkan,即它保持惯用手(除了 Y 在 Vulkan 中会向下,因此底部和顶部会切换)。
因此,我希望 glm::frustumLH_ZO 也是这样一个“标准”矩阵,因为不需要发生翻转。但是,在查看其源代码时,元素 [2][0] 和 [2][1] 与例如Vulkan 的平截头体透视投影矩阵(在 11:49 讨论here)。
这些元素是:
Result[2][0] = (right + left) / (right - left);
Result[2][1] = (top + bottom) / (top - bottom);
而不是我的预期:
Result[2][0] = -(right + left) / (right - left);
Result[2][1] = -(top + bottom) / (top - bottom);
我不认为这是由于 Z 翻转,因为这也应该导致例如元素 [2][3] 为 -1 而不是 +1。
为什么矩阵中的这些条目会翻转?
【问题讨论】: