javascript - 平移部分4×4变换矩阵

标签 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

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

最佳答案

没关系吗?在 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/

相关文章:

javascript - Canvas 在移动设备上不工作

python - 给定转移概率矩阵,如何生成随机序列?

C语言——将矩阵表示为指针数组

javascript - 大型 WebGL 应用程序加载时间

WebGL 等距投影

shader - 如何在 WebGL 中使用数据纹理

javascript - 想要在视频设置暂停时显示暂停图标

javascript - 使用循环将 EventListener() 添加到我的类中

c++ - Word Solver - 所有方向

javascript - React 编译器不会接受我的 .map 函数作为函数