正确的OpenGL矩阵格式?

Cob*_*ast 11 opengl math matrix

我的问题很简单:Projection和ModelView矩阵的正确格式是什么?

我被告知下面的示例矩阵是转置的,并不像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)}
Run Code Online (Sandbox Code Playgroud)

Zec*_*ecc 22

编辑:这个答案非常需要更新.即,没有关于着色器的考虑.

正如@gman在评论中指出的那样,是否使用行主要或列主要取决于你的数学运算方式.只要符合您的坐标系和操作顺序,您可以选择其中一个(或者在不同时间,如果您认为不会混淆).

我将此答案作为社区维基离开,以防有人有时间并愿意更新它.


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

m0 m4 m8  m12
m1 m5 m9  m13
m2 m6 m10 m14
m3 m7 m11 m15
Run Code Online (Sandbox Code Playgroud)

因此,如果以这种方式初始化数组,在C或几乎任何其他语言中,生成的矩阵看起来需要转置,因为C代码首先从左到右,然后从上到下(换句话说,就像它是在行主要顺序):

int mat[16] = {
    0, 1, 2, 3,
    4, 5, 6, 7,
    8, 9, 10, 11,
    12, 13, 14, 15,
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,OpenGL有glLoadTransposeMatrixglMultTransposeMatrix,您可以使用它们而不是glLoadMatrixglMultMatrix,所以这应该不是问题.


tmw*_*tmw 5

您可以使用您喜欢的任何符号,只要您符合矩阵运算的顺序即可.引自https://www.opengl.org/archives/resources/faq/technical/transformations.htm:

9.005 OpenGL矩阵是专列还是行专业?

出于编程目的,OpenGL矩阵是16值数组,其基本向量在内存中连续排列.转换组件占据16元素矩阵的第13,14和15个元素,其中索引编号为1到16,如OpenGL 2.1规范的2.11.2部分所述.

列主要与行主要纯粹是一种符号约定.请注意,使用列主矩阵进行后乘法会产生与使用行主矩阵预乘的结果相同的结果.OpenGL规范和OpenGL参考手册都使用列主要表示法.只要明确说明,您可以使用任何表示法.

也就是说,在着色器中,您可以将变换矩阵加载为浮点数组,这些浮点数组按排序为均匀并预先乘以顶点进行变换:

gl_Position = Proj * View * Model * vPosition;
Run Code Online (Sandbox Code Playgroud)

或者加载与按排序的浮点数相同的矩阵并进行后乘以获得相同的效果:

gl_Position = vPosition * Model * View * Proj;
Run Code Online (Sandbox Code Playgroud)

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