GLKit的GLKMatrix"专栏"如何?

Mat*_*ing 15 c opengl-es matrix ios glkit

前提A.

当在线性存储器中讨论"列主要"矩阵时,一个接一个地指定列,使得存储器中的前4个条目对应于矩阵中的第一列.另一方面,"行主要"矩阵被理解为一个接一个地指定行,使得存储器中的前4个条目指定矩阵的第一行.


A GLKMatrix4看起来像这样:

union _GLKMatrix4
{
    struct
    {
        float m00, m01, m02, m03;
        float m10, m11, m12, m13;
        float m20, m21, m22, m23;
        float m30, m31, m32, m33;
    };
    float m[16];
}
typedef union _GLKMatrix4 GLKMatrix4;
Run Code Online (Sandbox Code Playgroud)

文件将在m人员说:

列主要顺序的矩阵元素的一维数组.

前提B

GLKMatrix4中的"行"是一组4个水平声明的浮点数([m00, m01, m02, m03]将是第一个"行").因此,这些条目可以解释为mRowCol(m12将是第1行第2列的条目).


如果我们根据声明的顺序查看这些GLKMatrix结构成员的布局,我们会看到:

[m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, ...]

前4个条目清楚地表示矩阵的第一,而不是第一列.

结论

m 实际上并不是专业,而且文档是错误的.


现在,我应该注意到我实际上并不相信结论,但这两个前提似乎很合理.实际上,我最不信任前提B,但将"行"定义为垂直并将"列"定义为水平似乎很奇怪.有人可以解释一下吗?

Tar*_*ark 11

声明有点令人困惑,但矩阵按列主要顺序排列.结构中的四行表示矩阵中的列,m0*为列0,m3*为列3.这很容易验证,只需创建转换矩阵并检查转换组件的值m30,m31和m32.

我猜你的混乱来自这样一个事实,即结构在行中放置浮点数,而它们实际上代表了列.


bob*_*obo 10

这来自OpenGL规范 -

专栏专业

混淆点就是这样:正如其他人所指出的那样,我们使用指示列的第一个索引来索引列主矩阵,而不是行:

  • m00列= 0,行= 0,
  • m01列= 0,行= 1,
  • m02指的是列= 0,行= 2,

MATLAB可能已经做了很多间接贡献这种混淆,而MATLAB确实使用列主要用于它的内部数据表示,它仍然使用行主要索引约定x(row,col).我不确定他们为什么这样做.

另请注意,OpenGL默认使用列向量 - 即您希望将矩阵乘以它转换的向量,如(MATRIX*VECTOR)着色器.与之对比的(VECTOR*MATRIX)是行主矩阵.

查看我关于C中行主要与列主要矩阵的文章可能会有所帮助.

在代码中布置矩阵时,列专业是反直觉的

我越是看这个,我认为在C代码专栏中工作是一个错误,因为需要精神上转置你正在做的事情.当您在代码中布置矩阵时,您受到我们语言从左到右的性质限制,要逐行写出矩阵:

float a[4] = { 1, 2,
               3, 4 };
Run Code Online (Sandbox Code Playgroud)

所以,很自然地看起来你是按行,矩阵指定的

1 2
3 4
Run Code Online (Sandbox Code Playgroud)

但是,如果您使用的是列主要规范,那么您实际上已经指定了矩阵

1 3
2 4
Run Code Online (Sandbox Code Playgroud)

这是违反直觉的.如果我们有一个垂直(或"列主要"语言),那么在代码中指定列主要矩阵更容易.

对于Direct3D来说,所有这些都是另一回事吗?我不知道,你告诉我.

真的,为什么OpenGL会使用列主要矩阵呢?

深入挖掘,似乎这样做的原因是为了能够通过向量"后乘"矩阵(MATRIX*VECTOR) - 即能够使用列(主要)向量,:

列主要矩阵乘法

? 2 8 1 1 ? ? 2 ?
? 2 1 7 2 ? ? 2 ?
? 2 6 5 1 ? ? 2 ?
? 1 9 0 0 ? ? 1 ?
Run Code Online (Sandbox Code Playgroud)

与此对比必须使用行向量:

行主矩阵乘法

[ 2 2 2 1 ]  ? 2 8 1 1 ? 
             ? 2 1 7 2 ?
             ? 2 6 5 1 ?
             ? 1 9 0 0 ?
Run Code Online (Sandbox Code Playgroud)

该协议是,如果矩阵被指定为行为主,那么你"应该"由他们将载体用行向量和预乘矩阵.

使用行主矩阵时"应该"使用行向量的原因是一致的数据表示:毕竟,行向量只是1行,4列矩阵.