如何从包含两个对齐网格的 MeshLab 项目文件中推断变换矩阵?

How can I extrapolate the transformation matrix from a MeshLab project file containing two aligned meshes?

我有两个网格:网格 A 和网格 B.

我正在使用 MeshLab,我需要做的就是对齐它们,然后 外推一个转换矩阵,将 B 带到 A

当我使用对齐工具时,我粘贴 A 并将其设置为基础网格。 然后我在 B 上执行点基础粘合,并且我可以选择使用 process 按钮。 在程序结束时,我保存了 MeshLab 项目。

为了推断将 B 带到 A 上的变换矩阵,我只是打开 .mlp 项目文件(实际上它是一个纯文本文件)并读取数据。不幸的是,我得到的不是我所期望的。 当然,有两个网格,A 和 B。对于每个网格,都有一个变换矩阵。我希望网格 A(粘合并设置为基础网格的网格)具有单位矩阵,而网格 B 具有将 B 带到 A 上所需的变换矩阵。 有时,网格A的矩阵接近恒等式,但仍然不是恒等式

这是一个例子:

<!DOCTYPE MeshLabDocument>
<MeshLabProject>
 <MeshGroup>
  <MLMesh label="A" filename="A.stl">
   <MLMatrix44>
1 3.61241e-09 1.85292e-11 -5.04461e-08 
-3.61241e-09 1 3.45518e-10 1.03514e-07 
-1.85292e-11 -3.45518e-10 1 5.35603e-09 
0 0 0 1 
</MLMatrix44>
  </MLMesh>
  <MLMesh label="B" filename="B.stl">
   <MLMatrix44>
-0.670956 -0.741136 -0.0231387 78.366 
0.738444 -0.665039 -0.111463 24.2717 
0.0672212 -0.0918734 0.993499 33.6056 
0 0 0 1 
</MLMatrix44>
  </MLMesh>
 </MeshGroup>
 <RasterGroup/>
</MeshLabProject>

现在,我的简单假设是,出于某种原因,MeshLab 无法将 B 正确地带到 A 上。相反,它使 B 非常靠近 A,但它也需要对 A 的位置进行最低限度的调整,以获得最佳匹配。

如果是这样,为了获得最佳的 B 到 A 转换,我想执行以下操作:

[B 矩阵] * INVERTED[A 矩阵] = [A 矩阵上的 B]

这是正确的吗?

顺序很重要。矩阵 Mb 将网格 B 带到位置 p,矩阵 Ma 将网格 A 带到位置 p。同样,Ma_invert 将网格从位置 p 带到网格 A 的位置。

将 Mb 应用到 mesh B,现在它达到了 p:

B_transformed = Mb * B

B_transformed从位置p带到mesh A的位置:

B_aligned = Ma_inverse * B_transformed

所以组合操作应该是这样的:

B_aligned = Ma_inverse * Mb * B