对于行主要和列主要矩阵,我有一些主要的(没有双关语)混淆。
在上面的文章中,声明(对于列矩阵)翻译部分在索引12,13和14中。在用于图形和游戏开发的3D数学入门书中,声明它们在索引3中, 7和11。
所以,我正在尝试构建一个矩阵类。我的阵列布局如下:
[ xx, yx, zx, 0, xy, yy, zy, 0, xz, yz, zz, 0, xT, yT, zT, 1]
我的问题是,这是布置列主矩阵的正确方法吗?还是应该像下列之一一样布局?
[ xx, xy, xz, xT, yx, yy, yz, yT, zx, zy, zz, zT, 0, 0, 0, 1]
[ xx, yx, zx, xT, xy, yy, zy, yT, xz, yz, zz, zT, 0, 0, 0, 1]
[ xx, xy, xz, 0, yx, yy, yz, 0, zx, zy, zz, 0, xT, yT, zT, 1]
编辑以使问题更加清晰:
我将矩阵传递给下一个函数(作为数组)
gl.uniformMatrix4fv( shaderProgram.pMatrixUniform, false, pMatrix );
问题是:在4个订单(上面解释过)中,这个方法对矩阵的期望是什么? http://msdn.microsoft.com/en-us/library/ie/dn302458%28v=vs.85%29.aspx
文档没有说明关于顺序的任何内容,只是关于转置整个矩阵。但是,如果我不知道它会怎么样,我怎么知道我是否必须转置它。
答案 0 :(得分:3)
没关系? 3D数学库中经常会混淆两件事。列与行存储以及这些元素的使用方式。
我使用的大多数库都会在您编写数据时存储数据。
[ xx, yx, zx, 0, xy, yy, zy, 0, xz, yz, zz, 0, xT, yT, zT, 1]
或以其他方式描绘它
[ xAxis, 0,
yAxis, 0,
zAxis, 0,
translation, 1]
然后他们提供矩阵函数。如果更改了存储格式,则可以轻松更改功能,以便行为不会发生变化。只有当你允许直接访问存储格式重要的矩阵元素时,你仍然可以选择你想要的任何格式,你只需告诉用户这种格式是什么。
作为上面格式的示例,典型的GLSL着色器可能包含这样的代码
gl_Position = u_worldViewProjection * a_position;
如果您将订单切换为
[ xx, yx, zx, xT, xy, yy, zy, yT, xz, yz, zz, zT, 0, 0, 0, 1]
您只需将GLSL更改为
即可gl_Position = a_position * u_worldViewProjection;
另一方面,由于(至少根据我的经验),大多数库存储的矩阵与顶部示例相同,这样做似乎是一个好主意吗?
答案 1 :(得分:-1)
转换矩阵是
| R v | | p | = | v + R*p |
| 0 1 | | 1 | | 1 |
首先被v
解释为翻译,然后按R
进行旋转。因此,如果您采用转换矩阵的行,则
| R11 R12 R13 v1 |
| R21 R22 R23 v2 | -> [R11,R12,R13,v1,R21,R22,R23,v2,...]
| R31 R32 R33 v3 |
| 0 0 0 1 |
要确认这一点,您只需按(1,2,3)
进行翻译,然后使用glGetFloat(GL_MODELVIEW_MATRIX, matrix)
来探测数据。
参考:http://relativity.net.au/gaming/java/ModelViewMatrix.html