5

我对 CATransform3D 结构的矩阵行/列顺序有些困惑。该结构定义了一个这样的矩阵:

[m11 m12 m13 m14]
[m21 m22 m23 m24]
[m31 m32 m33 m34]
[m41 m42 m43 m44]

起初,这些值似乎定义了行(因此 [m11 m12 m13 m14] 形成第一行),但是当您通过 (tx, ty, tz) 创建平移矩阵时,矩阵将如下所示:

[ 1  0  0  0]
[ 0  1  0  0]
[ 0  0  1  0]
[tx ty tz  1]

我的困惑来自于这不是一个有效的翻译矩阵。将它与 4 元素列向量相乘不会转换该点。

我的猜测是 CATransform3D 结构按列顺序存储值,因此值 [m11 m12 m13 m14] 形成第一列(而不是第一行)。

任何人都可以确认吗?

4

2 回答 2

5

是的,CATransform3D按列主要顺序,因为这就是 OpenGL(ES) 想要的方式。Core Animation 在后台使用 GL 进行渲染。如果您想要证明,请查看以下man页面glMultMatrix

参数

m指向 16 个连续值,用作 4 x 4 列主矩阵的元素。16 个连续值用作 4 x 4 列主矩阵的元素。

这在CALayer.

于 2011-02-10T20:28:48.757 回答
3

您最初的解释是正确的;CATransform3D确实定义了下面的矩阵:

[m11 m12 m13 m14]
[m21 m22 m23 m24]
[m31 m32 m33 m34]
[m41 m42 m43 m44]

是的,尽管它可能会令人困惑(如果您习惯于预乘变换矩阵),但这会产生平移矩阵:

[ 1  0  0  0]
[ 0  1  0  0]
[ 0  0  1  0]
[tx ty tz  1]

参见《核心动画编程指南》中的图 1-8

如果您对变换矩阵进行后乘,这一个有效的变换矩阵,这正是 Apple 在 Core Animation 中所做的(请参见同一指南中的图 1-7,但请注意该等式缺少转置操作)。

于 2013-05-07T18:17:39.913 回答