翻译部分4×4变换矩阵

时间:2014-02-16 20:34:46

标签: javascript matrix webgl transformation

对于行主要和列主要矩阵,我有一些主要的(没有双关语)混淆。

https://gamedev.stackexchange.com/questions/18901/can-someone-explain-the-reasons-for-the-implications-of-colum-vs-row-major-in

在上面的文章中,声明(对于列矩阵)翻译部分在索引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

文档没有说明关于顺序的任何内容,只是关于转置整个矩阵。但是,如果我不知道它会怎么样,我怎么知道我是否必须转置它。

2 个答案:

答案 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