【问题标题】:Why values [2][0] and [2][1] of glm::frustumLH_ZO are negated?为什么 glm::frustumLH_ZO 的值 [2][0] 和 [2][1] 被否定?
【发布时间】: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。

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

【问题讨论】:

    标签: c++ opengl glm-math


    【解决方案1】:

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

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

    【讨论】:

    • 我建议为此创建一个 github 问题。
    • 嘘,我以为我快疯了。感谢您为我确认这一点。我明天做个公关
    • 你看,已经被举报了。显然只需要合并即可掌握github.com/g-truc/glm/pull/1080/commits/…
    猜你喜欢
    • 2015-07-23
    • 2013-08-17
    • 1970-01-01
    • 2012-11-10
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 2013-11-30
    相关资源
    最近更新 更多