我需要计算3D三角网格(例如.obj格式)之间的体积交和穿透深度,但我对计算几何还比较陌生。
在之前的帖子中 (Mesh to mesh intersections) 和通过谷歌搜索,我找到了一些C ++库可能适合这项工作:
- CGAL
- PQP
- libigl
- SWIFT
虽然我不确定哪一个对初学者来说最合适。有什么建议吗?
我需要计算3D三角网格(例如.obj格式)之间的体积交和穿透深度,但我对计算几何还比较陌生。
在之前的帖子中 (Mesh to mesh intersections) 和通过谷歌搜索,我找到了一些C ++库可能适合这项工作:
虽然我不确定哪一个对初学者来说最合适。有什么建议吗?
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);