我想知道是否有可能(以及如何)将任意 M3 矩阵变换重新表示为一系列更简单的变换(例如平移、缩放、倾斜、旋转)
换句话说:如何从 MComplex 计算 MTranslate、MScale、MRotate、MSkew 矩阵,以便以下等式成立:
MComplex = MTranslate * MScale * MRotate * MSkew(或以其他顺序)
我想知道是否有可能(以及如何)将任意 M3 矩阵变换重新表示为一系列更简单的变换(例如平移、缩放、倾斜、旋转)
换句话说:如何从 MComplex 计算 MTranslate、MScale、MRotate、MSkew 矩阵,以便以下等式成立:
MComplex = MTranslate * MScale * MRotate * MSkew(或以其他顺序)
奇异值分解(另请参阅此博客和此PDF)。它将任意矩阵转换为 3 个矩阵的组合:正交 + 对角线 + 正交。正交矩阵是旋转矩阵;对角矩阵表示沿主轴的倾斜 = 缩放。
翻译在游戏中抛出了一个活动扳手,但你应该做的是取出矩阵的平移部分,这样你就有一个 3x3 矩阵,在其上运行 SVD 以给你旋转+倾斜,然后将平移部分添加回. 这样,您将拥有 4 个矩阵的旋转 + 缩放 + 旋转 + 平移组合。可能可以在 3 个矩阵中执行此操作(旋转 + 沿一组轴缩放 + 平移),但我不确定如何......也许是 QR 分解(Q = 正交 = 旋转,但我不确定是否R 仅倾斜或具有旋转部分。)
是的,但解决方案不会是唯一的。你也应该把翻译放在最后(其余的顺序无关紧要)
对于任何给定的方阵A
,都存在无限多个矩阵B
,C
因此A = B*C
. 选择任何可逆矩阵B
(这意味着 B^-1 存在或 det(B) != 0)和 now C = B^-1*A
。
因此,对于您的解决方案,首先分解MC
为MT
和MS*MR*MSk*I
,选择 MT 作为一些可逆转置矩阵。然后将其余部分分解为MS
和MR*MSk*I
,使 MS 为任意缩放矩阵。等等...
现在,如果乐趣的最后I
是一个单位矩阵(对角线上为 1,其他地方为 0),那么你很好。如果不是,请重新开始,但选择不同的矩阵;-)
事实上,象征性地使用上述方法,您可以创建一组方程,这些方程将为您生成所有这些矩阵的参数化公式。
这些分解对你有多大用处,嗯——那是另一回事了。
如果您将其输入Mathematica或Maxima,他们会立即为您计算。