是否可以将3d旋转矩阵(4x4)转换为其组成部分(旋转,比例等)?


11

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

是否可以推断出该矩阵所暗示的所有不同“操作”?像它暗示多少旋转,缩放等?

Answers:


10

您可以将矩阵分解为基本变换:平移,缩放和旋转。给定这个矩阵:中号=Ť[R小号

M=[a00a01a02a03a10a11a12a13a20a21a22a230001]

您可以使用最后一列t=(a03,a13,a23)

对于缩放,我们知道矩阵的前三列对应于基数(轴)。我们可以通过这些向量的长度/范数来获得比例,即缩放了多少个碱基。因此比例为其中:s=(s0,s1,s2

s0=(a00,a10,a20)s1=(a01,a11,a21)s2=(a02,a12,a22)

现在您有了刻度,您可以使用与R S对应的子矩阵来去除刻度,方法是将矩阵乘以刻度S 1的倒数来获得R3×3RSS1[R

[R小号小号-1个=[一种00一种01一种02一种10一种11一种12一种20一种21一种22][s0000s1个000s2]-1个=[一种00一种01一种02一种10一种11一种12一种20一种21一种22][1个/s00001个/s1个0001个/s2]

因此([R小号小号-1个=[R一世=[R):

[R=[一种00/s0一种01/s1个一种02/s2一种10/s0一种11/s1个一种12/s2一种20/s0一种21/s1个一种22/s2]

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


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

Ťs[RŤ[R小号


2
[R

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

1
@Timbo虽然这里没有任何完整的矩阵乘法,只是将矩阵的列乘以反比例。向量幅值涉及所有正数的加法运算,因此那里没有灾难性的抵消。它不会产生太多相对误差,AFAICT。无论如何,作者澄清说,他们正在谈论将旋转矩阵进一步分解为欧拉角或类似角度,这更有​​意义。
内森·里德

谢谢–很好的答案。后续:为了获得原始矩阵,我假设我们需要从单位矩阵开始遵循一定的操作顺序。这个订单是TRS吗?
elsurudo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.