我有两个4 * 4矩阵表示OpenGL中两个对象的姿势和位置。如何计算这些对象的方向和原点的差异。 这是从OpenGL样式矩阵转换而来的矩阵。
r1 r2 r3 t1
r4 r5 r6 t2
r7 r8 r9 t3
0 0 0 1
答案 0 :(得分:5)
假设两个矩阵是M1和M2,它们适用于右边的向量:
x1 = M1 * x
x2 = M2 * x
两个矩阵之间的“差异”可以定义为需要应用于x1以获得x2的矩阵Md:
Md * x1 = x2
Md * (M1 * x) = M2 * x
要为所有向量x创建此标识,Md需要满足等式:
Md * M1 = M2
为了在这个等式中隔离Md,我们乘以M1的倒数:
Md * M1 * inv(M1) = M2 * inv(M1)
矩阵乘法是关联的,因此我们可以将左侧分组为:
Md * (M1 * inv(M1)) = M2 * inv(M1)
,Md的结果是:
Md = M2 * inv(M1)
所以你可以用4x4矩阵求逆和矩阵乘法来解决这个问题。
另一种方法是将原始矩阵分解为旋转和平移,这些矩阵应用于向量:
x1 = R1 * x + t1
x2 = R2 * x + t2
其中R1和R2是3×3矩阵,t1和t2平移向量。按照与之前相同的步骤,还将差异分解为旋转Rd和翻译td:
Rd * x1 + td = x2
Rd * (R1 * x + t1) + td = R2 * x + t2
Rd * R1 * x + Rd * t1 + td = R2 * x + t2
要使两侧的旋转部分相匹配,Rd需要满足:
Rd * R1 = R2
毫不奇怪,Rd的计算看起来非常类似于上面的Md。作为一种简化,我们可以利用旋转的逆是其转置的事实:
Rd = R2 * inv(R1)
Rd = R2 * transp(R1)
现在在上面的等式中,翻译部分也需要匹配,这给了我们td:
Rd * t1 + td = t2
td = t2 - Rd * t1
总之,您可以计算差异的旋转矩阵和平移向量:
Rd = R2 * transp(R1)
td = t2 - Rd * t1