opengl - 如何从旋转和平移矩阵中比较两个对象的姿势和位置?

标签 opengl graphics computer-vision

我有两个 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/

相关文章:

c++ - Opencv-2.4.5 是否预先启用了 TBB?

neural-network - InfoGainLoss导致精度和损失为0

opencv - 如何确定线条的宽度?

c++ - 点光源阴影贴图和光照着色器

opengl - OpenCL 或 OpenGL – 使用哪一个?

c - 在C中使用OpenGL 3.0+绘制多条线

matlab - 在 MATLAB 中使用 surf 创建沿 z 轴的堆叠二维矩阵

java - OpenGL 顶点数组抛出无效操作错误

macos - Carbon 窗口(OS Lion、Mono)上的 OpenGL 3.2 上下文

r - 修改 GGplot2 对象