更具体地说,我正在开发一个iOS应用,并具有CATransform3D结构(基本上是4x4转换数组)。

是否可以推断出该矩阵所暗示的所有不同“操作”?诸如旋转,缩放等含义意味着什么?

#1 楼

您可以将矩阵$ \ mathbf {M} = \ mathbf {TRS} $分解为基本转换:平移,缩放和旋转。给定此矩阵:

$$ \ mathbf {M} = \ begin {bmatrix}
a_ {00}和a_ {01}&a_ {02}和a_ {03} \\
a_ {10}和a_ {11}和a_ {12}和a_ {13} \\
a_ {20}和a_ {21}和a_ {22}和a_ {23} \\
0&0&0&1
\ end {bmatrix} $$

您可以使用最后一列$ \ mathbf {t} =(a_ {03},a_ {13},a_ {23})$。

对于缩放,我们知道矩阵的前三列对应于基数(轴)。我们可以通过这些向量的长度/范数来获得比例,即缩放了多少个碱基。因此小数位数是$ \ mathbf {s} =(s_0,s_1,s_2)$,其中:

$$ \ begin {matrix}
\ end {matrix} $$

现在有了标度,您可以通过将矩阵乘以标度$ \ mathbf {S} ^的倒数,使用​​与$ \ mathbf {RS} $对应的$ 3 \乘以3 $子矩阵来摆脱标度。 {-1} $获得$ \ mathbf {R} $

$$ \ begin {align}
\ mathbf {(RS)S} ^ {-1}&=
\开始{bmatrix}
a_ {00}和a_ {01}和a_ {02} \\
a_ {10}和a_ {11}和a_ {12} \\
a_ {20}和a_ {21}和a_ {22} \\
\ end {bmatrix}
\ begin {bmatrix}
s_0&0和0 \\
0&s_1&0 \\
0&0&s_2
\ end {bmatrix} ^ {-1} \\
&=
\ begin {bmatrix}
a_ {00}和a_ {01}和a_ {02} \\
a_ {10}和a_ {11}和a_ {12} \\
a_ {20}和a_ {21} &a_ {22} \\
\ end {bmatrix}
1 / s_0&0&0 \\
0&1 / s_1&0 \ \
0&0&1 / s_2
\ end {bmatrix}
\ end {align} $$

因此($ \ mathbf {(RS)S} ^ { -1} = \ mathbf {RI} = \ mathbf {R} $):

$$ \ mathbf {R} =
\ begin {bmatrix}
a_ {00} / s_0和a_ {01} / s_1和a_ {02} / s_2 \\
a_ {10} / s_0和a_ {11} / s_1和a_ {12} / s_2 \\
a_ {20} / s_0和a_ {21} / s_1和a_ {22} / s_2 \\
\ end {bmatrix} $$

这是最终的旋转矩阵。您可以使用多种方法进一步分解它。它很冗长,但是您可以搜索分解旋转矩阵。


此方法仅提供平移,缩放和旋转形式的等效值(原始矩阵可能是其他类型的转换)。如果您进一步使用分解角度,则旋转角度的浮点精度可能会出现问题,在计算中可能会累积舍入误差。除非您自己没有构造矩阵,否则不要使用它。

如果您是构造矩阵并希望分解以便能够单独和独立地编辑和显示平移,缩放和旋转的人,那么最干净的原因可能是存储变换类中的$ \ mathbf {t} $,$ \ mathbf {s} $和$ \ mathbf {r} $分别作为矢量(可能是旋转的四元数)。仅在需要转换矩阵时,才从这些组件构造一个$ \ mathbf {TRS} $矩阵(您可以缓存该矩阵,直到某些组件被更改为止)。

评论


$ \ begingroup $
您能否澄清浮点精度存在哪些问题?除非比例尺非常高,否则我认为这种方法不会导致精度问题。同样,值得注意的是,如果矩阵是由包含不均匀标度和旋转的一系列矩阵组成的,则此方法可能会失败。在这种情况下,$ \ mathbf {R} $矩阵将不是旋转,而是包括一些剪切。
$ \ endgroup $
–内森·里德(Nathan Reed)
16年11月16日在16:11

$ \ begingroup $
所有浮点数都有固有(有界)错误。任何时候执行操作,尤其是加法或减法,都会使误差复杂化,从而增加边界的幅度。分解算法中隐藏了许多加法运算(在矩阵乘法和比例尺计算中)和平方根(在比例尺中)。进一步分解将引入进一步的错误。
$ \ endgroup $
– Timbo
16年11月16日在19:14

$ \ begingroup $
@Timbo但是这里没有任何完整的矩阵乘法,只是将矩阵的列乘以反比例。向量幅值涉及所有正数的加法运算,因此那里没有灾难性的抵消;它不会产生太大的相对误差,AFAICT。无论如何,作者澄清说,他们正在谈论将旋转矩阵进一步分解为欧拉角或类似角度,这更有​​意义。
$ \ endgroup $
–内森·里德(Nathan Reed)
16年11月16日在20:31

$ \ begingroup $
谢谢–很好的答案。后续:为了获得原始矩阵,我假设我们需要从单位矩阵开始遵循一定的操作顺序。这个订单是TRS吗?
$ \ endgroup $
– elsurudo
16-11-28在15:45