如何从包含两个对齐网格的 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
我有两个网格:网格 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