C++库用于网格与网格的相交:有哪些可用的选项?

11

我需要计算3D三角网格(例如.obj格式)之间的体积交和穿透深度,但我对计算几何还比较陌生。

在之前的帖子中 (Mesh to mesh intersections) 和通过谷歌搜索,我找到了一些C ++库可能适合这项工作:

  • CGAL
  • PQP
  • libigl
  • SWIFT

虽然我不确定哪一个对初学者来说最合适。有什么建议吗?

2个回答

13

libigl自版本1.1起在igl/boolean/mesh_boolean.h中具有强大的网格布尔运算功能。它使用CGAL的精确算术内核实现或cork的包装(另一个选择)。

目前,libigl还包含libigl/external/cork中的补丁版本,这极大地提高了鲁棒性。

在实现libigl的布尔运算时,我发现cork更快,但不总是产生正确的结果(特别是未能解决所有交点)。

与将网格转换为CGAL的Nef_polyhedron,进行CSG操作并转换回网格相比,使用CGAL作为后端的Libigl最为稳健且仍然快速。只有当结果是流形时,才会进行最终转换。相反,libigl仅使用CGAL进行精确的三角形相交和2D网格化。正确的、非流形输出没有问题。

Libigl的接口非常简单,对于Eigen用户来说非常熟悉。例如,要找到由VA行中具有顶点的实体网格和FA行中具有三角形索引的另一个网格(VB,FB)之间的交点,并将输出存储在新网格(VC,FC)中:

#include <igl/boolean/mesh_boolean.h>
...
igl::mesh_boolean(VA,FA,VB,FB,MESH_BOOLEAN_TYPE_UNION,VC,FC);

0

另一种可能性是使用开源的C++库MeshLib。它可以读写Wavefront格式(.obj)的网格,并在网格上稳健地执行布尔运算(交集、并集、差集):适当函数的文档

据我所知,MeshLib中的布尔运算比CGALlibigl更快,可以参考基于MeshLib的MeshInspector应用程序的视频


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接