我对行主矩阵和列主矩阵有一些主要的(没有双关语)混淆。
在上面的文章中指出(对于列矩阵)平移部分位于索引 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
文档没有说明任何有关顺序的内容,只说明了整个矩阵的转置。但是,如果我不知道它通常会期望什么,我怎么知道是否必须转置它。
最佳答案
没关系吗?在 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;
另一方面,由于(至少从我的经验来看),大多数库都将其矩阵存储为与顶部示例相同的矩阵,因此这样做似乎是个好主意?
关于javascript - 平移部分4×4变换矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21816210/