我有两个 4*4 矩阵表示 OpenGL 中两个对象的姿势和位置。如何计算这些对象的方向和原点的差异。
这是从 OpenGL 样式矩阵转换而来的矩阵。
r1 r2 r3 t1
r4 r5 r6 t2
r7 r8 r9 t3
0 0 0 1
最佳答案
假设这两个矩阵是 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 是 3x3 矩阵,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
关于opengl - 如何从旋转和平移矩阵中比较两个对象的姿势和位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27308525/