2010-12-05 88 views
11

我的问题只是:Projection和ModelView矩阵的正确格式是什么?正确的OpenGL矩阵格式?

我已经被告知下面的例子矩阵被转置,并且不像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)} 

回答

23

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

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

我离开这个答案作为社区维基百科,以防有人有时间和更新它。


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,所以这应该不成问题。

+0

那么如何判断我的问题矩阵是按列还是按行排列? – 2010-12-05 20:52:08

+0

模型视图矩阵在最后一行中包含非零元素,而最后一列读取的是(0,0,0,1)。这意味着它是按行排列的。 (根据http://www.songho.ca/opengl/gl_transform.html#modelview) – Zecc 2010-12-05 20:59:47

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; 

或加载相同的矩阵作为浮阵列由行排序后乘来达到同样的效果:

gl_Position = vPosition * Model * View * Proj; 

通过转矩阵你有效地将它存放在没有相反这就是OpenGL在输入矩阵时可以选择转置矩阵的原因。