正确的OpenGL矩阵格式?

时间:2010-12-05 20:18:20

标签: math opengl 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)}

2 个答案:

答案 0 :(得分:22)

编辑:这个答案非常需要更新。也就是说,没有考虑着色器。

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

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


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

m0 m4 m8  m12
m1 m5 m9  m13
m2 m6 m10 m14
m3 m7 m11 m15

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

int mat[16] = {
    0, 1, 2, 3,
    4, 5, 6, 7,
    8, 9, 10, 11,
    12, 13, 14, 15,
}

顺便说一句,OpenGL有glLoadTransposeMatrixglMultTransposeMatrix,你可以使用它而不是glLoadMatrix和glMultMatrix,所以这应该不是问题。

答案 1 :(得分: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参考手册都使用column-major   符号。您可以使用任何符号,只要它清楚说明。

即。在着色器中,您可以将转换矩阵加载为由排序的浮点数组到一个均匀的预乘顶点来转换它:

gl_Position = Proj * View * Model * vPosition;

或加载与后乘法排序的float数组相同的矩阵,以达到相同的效果:

gl_Position = vPosition * Model * View * Proj;

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