c++ - 为什么 glm::frustumLH_ZO 的值 [2][0] 和 [2][1] 被求反?

标签 c++ opengl glm-math

假设我来自左手世界空间。我的正 Z 轴进入屏幕,而我的 Y 轴向上,与 OpenGL 在剪辑空间中的默认值相同。

据我了解,当来自右手世界空间时(在使用旧函数(例如将前向 vector 映射到 -Z 轴的 gluLookAt 时有点需要)),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。

为什么矩阵中的这些条目会翻转?

最佳答案

Why are these entries in the matrix flipped?

你是对的,他们不应该这样,but they are in the most recent glm code base to date 。看来您发现了 glm 中的错误。它可能没有被注意到这么长时间,因为 a) 大多数人使用默认 GL 约定的 glm,b) 这两个元素在标准对称平截头体中通常为 0(left = -righttop = -底部)。

关于c++ - 为什么 glm::frustumLH_ZO 的值 [2][0] 和 [2][1] 被求反?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68672360/

相关文章:

c++ - CUDA 小核 2d 卷积 - 怎么做

c++ - 排序 vector 以将偶数和奇数 fork

c++ - 在 opengl c++ 中计算顶点法线(gouraud 着色)

java - lwjgl 3 , glUniformMatrix4 导致 jre 崩溃

c++ - Swig 包装 GLM 库

c++ - 运行时黑屏,没有错误

c++ - 为什么我们在使用C++11的<thread>时一定要链接pthread?

c++ - 为什么 std::begin() 和 std::end() 适用于固定数组,而不适用于动态数组?

c++ - wglGetProcAddress 未定义

c++ - 无法在屏幕上绘制正方形(相同的宽度和高度)