gluPerspective生成矩阵与文档公式不符:原因及正确性确认
gluPerspective投影矩阵与文档公式的差异解答 1. 差异原因
这种差异的根本原因是矩阵的表示和存储约定不同:
- Khronos、IBM等官方文档给出的是行主序的数学矩阵,对应3D图形学里行向量左乘矩阵的计算逻辑(变换公式为
变换后向量 = 原始行向量 × 投影矩阵)。 - 而OpenGL内部采用列主序存储矩阵,对应列向量右乘矩阵的逻辑(变换公式为
变换后向量 = 投影矩阵 × 原始列向量)。
为了保证变换效果一致,列主序矩阵是行主序矩阵的转置。你通过glGetFloatv获取到的是OpenGL内部列主序存储的结果,因此看起来和文档里的行主序矩阵在第三、四行的元素位置上发生了交换——本质就是两种矩阵表示方式的转置关系。
另外需要纠正:你给出的文档公式里(2 * far + near)是笔误,正确的应该是2 * far * near,从你提供的示例计算结果也能验证:2*0.1*100/(0.1-100) ≈ -0.2002002,和实际矩阵第四行第三列的数值完全匹配。
2. 哪个公式正确?
两种表示都是正确的,只是适配不同的向量乘法规则:
- 文档里的行主序矩阵适合行向量左乘的场景;
- OpenGL实际生成的列主序矩阵适合列向量右乘的场景。
两者的变换效果完全等价,只是矩阵的存储顺序和乘法顺序不同而已。
内容的提问来源于stack exchange,提问作者Maciej_Adamski
相关产品推荐
相关产品推荐

