Math 从4x4齐次变换矩阵中删除旋转

Math 从4x4齐次变换矩阵中删除旋转,math,matrix,Math,Matrix,我正在处理一个变换矩阵,我想做的是删除旋转变换并保留缩放、平移等 我该怎么做?我正在寻求创建一个手动编程的解决方案。您需要使用仿射矩阵分解,有几种方法有不同的优缺点。你得调查一下。这里有一些链接可以帮助您入门: 这可能更简单,也可能更复杂,这取决于变换的性质,我假设它是仿射的。但是如果它是线性/刚性的,那么这就容易多了,如果它是透视变换,那么我想它会更复杂。如果你确定你的矩阵是旋转+平移+缩放,那么你可以只提取你需要的参数: rotation = atan2(m12, m11) scale

我正在处理一个变换矩阵,我想做的是删除旋转变换并保留缩放、平移等


我该怎么做?我正在寻求创建一个手动编程的解决方案。

您需要使用仿射矩阵分解,有几种方法有不同的优缺点。你得调查一下。这里有一些链接可以帮助您入门:


这可能更简单,也可能更复杂,这取决于变换的性质,我假设它是仿射的。但是如果它是线性/刚性的,那么这就容易多了,如果它是透视变换,那么我想它会更复杂。

如果你确定你的矩阵是旋转+平移+缩放,那么你可以只提取你需要的参数:

rotation = atan2(m12, m11)
scale = sqrt(m11*m11 + m12*m12)
translation = (m31, m32)
编辑 我没有注意到你对3d变换感兴趣,在这种情况下,旋转部分很烦人,但是如果你只想平移和缩放

translation = (m41, m42, m43)
scale = sqrt(m11*m11 + m12*m12 + m13*m13)

4×4齐次变换矩阵定义如下:

| x2 |   | R11*SX R12*SY R13*SZ TX | | x1 |
| y2 | = | R21*SX R22*SY R23*SZ TY | | y1 |
| z2 |   | R31*SX R32*SY R33*SZ TZ | | z1 |
| 1  |   | 0      0      0      1  | |  1 |
其中
(SX、SY、SZ)
是缩放因子,
(TX、TY、TZ)
是平移系数,而
Rij
是旋转系数

由于您选择了最后一列,因此获取翻译非常简单。要获得缩放,请使用以下属性:变换是旋转乘以对角线缩放(
a=R*S
),因此

tr(A)*A = tr(R*S)*(R*S) = tr(S)*tr(R)*R*S = tr(S)*S
其中
tr(A)
是转置运算符。要获得缩放因子,请计算

S2 = tr(A)*A
然后选择前三个对角线项的平方根

SX = sqrt(S2(1,1))
SY = sqrt(S2(2,2))
SZ = sqrt(S2(3,3))
然后将新转换组装为:

| SX   0   0  TX |
|  0  SY   0  TY |
|  0   0  SZ  TZ |
|  0   0   0   1 |

到目前为止,我不喜欢任何解决方案。3x4(或4x4)仿射变换首先在目标帧中应用旋转,然后应用平移。该变换中的最终列向量是平移,但在目标帧中,而不是原始帧中!因此,如果我们进行逆变换,那么我们可以将最终的列向量作为原始帧中的平移

以下是我是如何做到的(在numpy):


如果只有平移、缩放和旋转-那么可以通过提取平移和缩放组件并将它们相乘来移除旋转,而忽略剩下的部分…你的缩放是否假设每个方向上的缩放一致?情况可能并非如此,即图像可能是stretched@Dan:对于“恼人的”我的意思很简单,用自由坐标表示旋转的“本质”就像在2D中一样好是不可能的(参见万向节锁问题)。关于缩放请注意,如果允许非均匀缩放和旋转,则闭包会变得更一般,旋转角度的概念也会变得有问题,即使远离奇点缩放=0。是的,问题在于矩阵不限于均匀缩放,而是3D的。
b_to_a = np.linalg.inv(a_to_b)
a_to_b_only_translation = np.eye(4)
a_to_b_only_translation[:,3] = -b_to_a[:,3]