C 如何对齐两个网格

C 如何对齐两个网格,c,computational-geometry,mesh,C,Computational Geometry,Mesh,我有一个很好的问题要问你。 我需要使用非常快速的算法对齐两个网格。给定mesh1和mesh2,我想知道如何平移和旋转mesh1,使其与mesh2处于相同的位置。 首先,我使用了两个网格的惯性矩,但如果第二个网格与第一个网格相似,但缺少一些部分,则该算法不起作用。换句话说,取两个相同的网格,从其中一个网格上剪下相同的部分 我想用C编写代码,因为我需要在多平台机器(linux/win)上执行该操作,并以非常快的方式执行:它必须被放入GA算法中 这两个网格采用STL(立体摄影)格式(二进制或ascii

我有一个很好的问题要问你。 我需要使用非常快速的算法对齐两个网格。给定mesh1和mesh2,我想知道如何平移和旋转mesh1,使其与mesh2处于相同的位置。 首先,我使用了两个网格的惯性矩,但如果第二个网格与第一个网格相似,但缺少一些部分,则该算法不起作用。换句话说,取两个相同的网格,从其中一个网格上剪下相同的部分

我想用C编写代码,因为我需要在多平台机器(linux/win)上执行该操作,并以非常快的方式执行:它必须被放入GA算法中

这两个网格采用STL(立体摄影)格式(二进制或ascii),但使用另一种文件格式可能很有用

你知道怎么做吗

问题更新:

首先,我要非常感谢你们的建议。我已经在我的机器上下载了一个安装PCL,并从PCL网站上成功地编译了ICP(教程)算法。 但现在我有一些问题,也许是因为对我来说是一件全新的事情。4x4矩阵输出对适应度的意义是什么?我应该期望一个旋转矩阵和一个平移向量

我希望你们中的一些人能帮助我。 如果您需要任何其他信息,请询问。

迭代最近点(ICP)是使用刚性变换注册(对齐)3D点云的一种方法。(它也可以应用于网格。)

下面是一个很好的介绍:

以下是一个合理的总结:

以下是一个matlab实现:

以下是一些潜在的优化:

有一些您可能会发现有用的资源。正如@Throwback1986所说,ICP是对齐几何体的一种优秀算法。Pcl还具有其他通常更快的对齐算法,基于识别和匹配两块几何体中感兴趣的特征。该库在机器人社区中有很多用途,机器人社区和您一样,非常注重性能


PCL是用C++编写的。虽然不像直板C那样可移植,但它们提供了windows、一些*nix版本和mac os的安装说明。我也见过它在ios和android上运行。查看.

那么基本上你想要一个算法来计算变换矩阵,使mesh1在mesh2上变换得尽可能接近?另外:编辑一个网格的唯一方法是删除部分,或者可以移动和添加顶点?@没人,我正在计算比较两个物体惯性矩的变换矩阵,但任何其他将mesh1置于mesh2之上的方法都可以。总之,我需要找到mesh1相对于mesh2的最近位置,它给出了两者之间的最小距离值。对于(像我一样)很久以后偶然发现这一点的人,值得注意的是,当相关性高而差异小时,ICP最有效,因为如果必须将一个云/网格移动太远而无法到达正确的云/网格,ICP往往会陷入不正确的解决方案中。这就是为什么通常首先执行某种粗糙的特征匹配步骤,以获得正确附近的变换。从这一点来看,ICP在完善注册方面非常出色。我一直在做一些关于这个主题的研究。我发现matlab代码非常有用,尽管我认为这比你的好,因为它也有cpp源代码!我会尽快告诉你这方面的任何新进展,我想我会在这里发布我将得到的解决方案。谢谢你给我这个链接。这是一个非常有趣的图书馆。我一直在尝试使用一些教程,但不幸的是,它没有达到我预期的奇迹:)。它只适用于微小的差异,我希望我能将这些代码与我的粗糙惯量方法合并。还有什么好的建议吗?试着搜索pcl邮件列表,如果你没有找到任何东西,发布一个问题!开发人员的反应相当迅速。一个想法是在ICP中植入基于惯性矩技术的最佳猜测,然后在此基础上进行迭代以实现精确对齐。4x4变换矩阵中嵌入了旋转矩阵,如左上角。第4列包含转换矩阵。(请注意,最下面一行中有三个0)