Math 正确的OpenGL矩阵格式?

Math 正确的OpenGL矩阵格式?,math,opengl,matrix,Math,Opengl,Matrix,我的问题只是:投影和模型视图矩阵的正确格式是什么 我被告知下面的示例矩阵是转置的,并不像OpenGL矩阵那样构建 ModelView Matrix {(1, 0, 0, 0) (0, 0.7071068, 0.7071068, 0) (0, -0.7071068, 0.7071068, 0) (0, -141.4214, -141.4214, 1)} Projection Matrix {(1.931371, 0, 0, 0) (0, 2.414213, 0, 0) (0, 0, -1.000

我的问题只是:投影和模型视图矩阵的正确格式是什么

我被告知下面的示例矩阵是转置的,并不像OpenGL矩阵那样构建

ModelView Matrix
{(1, 0, 0, 0)
(0, 0.7071068, 0.7071068, 0)
(0, -0.7071068, 0.7071068, 0)
(0, -141.4214, -141.4214, 1)}

Projection Matrix
{(1.931371, 0, 0, 0)
(0, 2.414213, 0, 0)
(0, 0, -1.0002, -1)
(0, 0, -2.0002, 0)}

编辑:此答案急需更新。也就是说,不考虑着色器。

正如@gman在评论中指出的,使用行专业还是列专业取决于你的数学计算方式。只要它们与您的坐标系和操作顺序相匹配,您就可以选择其中一个(或者在不同的时间选择两个,如果您不认为这会混淆的话)。

我将此答案留作社区维基,以防有人有时间和意愿更新它。


OpenGL将矩阵指定为按列主顺序列出的一维数组,即元素的顺序如下:

m0 m4 m8  m12
m1 m5 m9  m13
m2 m6 m10 m14
m3 m7 m11 m15
因此,如果以这种方式初始化数组,在C语言或几乎任何其他语言中,生成的矩阵看起来需要进行转置,因为C代码先从左到右读取,然后从上到下读取(换句话说,就像是按行主顺序读取):


顺便说一句,OpenGL同时具有and,您可以使用and来代替glLoadMatrix和glMultMatrix,因此这应该不是问题。

您可以使用任何您喜欢的符号,只要您符合矩阵操作的顺序。引述自:

9.005 OpenGL矩阵是列主还是行主?

出于编程目的,OpenGL矩阵是具有 在内存中连续排列的基向量。翻译 组件占据16个元素中的第13、14和15个元素 矩阵,其中索引的编号范围为1到16,如中所述 OpenGL 2.1规范的第2.11.2节

列主键与行主键纯粹是一种符号约定。注 与列主矩阵相乘后产生相同的结果 结果为与行主矩阵的预乘。OpenGL 规范和OpenGL参考手册都使用ColumnMajor 符号你可以使用任何符号,只要清楚地说明

i、 e.在着色器中,可以将变换矩阵作为浮点数组加载到均匀的列中,并将预乘顶点中进行变换:

gl_Position = Proj * View * Model * vPosition;
或者加载与按后乘排序的浮点数组相同的矩阵,以实现相同的效果:

gl_Position = vPosition * Model * View * Proj;

通过转置矩阵,可以有效地将其转换为相反的表示法存储,这就是为什么OpenGL可以在输入矩阵时选择转置矩阵。

那么,我如何判断我的问题中的矩阵是按列顺序还是按行顺序排列呢?模型视图矩阵在最后一行中有非零元素,而最后一列是按读取顺序排列的(0,0,0,1)。这意味着它是按行主顺序排列的。(根据)同时,将投影矩阵与此链接中的投影矩阵进行对比——它似乎是按列主顺序排列的。请注意,我并没有对此进行过太多考虑。这个答案是错误的。OpenGL肯定同时支持行主顺序和列主顺序。如果使用glUniformMatrix4fv,则第三个参数是正确的row major,如果您使用的是column major,则为false。实际上,大多数使用C样式数组和语法的编程语言都会使row major更方便。@TalLiron这不是我说的,在大多数编程语言中,以row major形式初始化矩阵更容易吗?这种转换来自于您在文本编辑器中编写的方式r与您按照通常的数学约定编写的方式不同。它与OpenGL如何处理矩阵没有真正的关系。这是向后看的。第一个乘法顺序用于列主矩阵,第二个用于行主矩阵。如果有人对上面的注释感到困惑(“这是向后看的”),这篇文章已经被编辑以反映这一评论。只是说,以防它不明显,因为这****已经够令人困惑的了
gl_Position = vPosition * Model * View * Proj;