我希望在我的跟踪管道中有一个碰撞检测模块,检测两个不同的网格何时碰撞/穿透,或者是否存在铰接网格的自穿透。根据渗透的深度,应该有惩罚来对抗这种现象。我应该得到一个碰撞面/顶点的列表,以便这样做。
在检查了几个选项后,我决定开始使用CGAL。
在this link中,有一个有趣的答案指向了一些例子。 (this和this)。这些示例使用AABB(轴对齐边界框),这是非刚性网格的建议方法,因为需要频繁更新它们。对于自相交案例,这些例子很清楚,但以下内容对我来说并不是很清楚:
请注意,此组件不适合查找所有相交的对象对的问题。我们引用组件Intersecting Sequences of dD Iso-oriented Boxes,它可以找到所有相交的iso导向框对。
答案 0 :(得分:3)
答案 1 :(得分:0)
我的回答实际上是对lrineau信息量丰富的答案的评论,但是它有点长,所以我将其发布为我自己的答案。 CGAL的Polygon Mesh Processing软件包具有一个名为CGAL::Polygon_mesh_processing::do_intersect()
的函数,该函数接受两个三角形网格作为输入,并返回一个布尔值,该布尔值描述网格是否相交。不幸的是,它并没有告诉您那双相交的面孔。
但是,do_intersect()
内部调用了一个未记录的函数CGAL::Polygon_mesh_processing::internal::compute_face_face_intersection()
(又调用了CGAL::box_intersection_d()
),该函数将成对的相交面返回为向量。这是一些示例代码,展示了如何调用它:
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Surface_mesh<K::Point_3> Mesh;
typedef boost::graph_traits<Mesh>::face_descriptor face_descriptor;
typedef std::pair<face_descriptor, face_descriptor> face_descriptor_pair;
namespace PMP = CGAL::Polygon_mesh_processing;
Mesh mesh_a, mesh_b;
std::vector<face_descriptor_pair> tri_pairs;
PMP::internal::compute_face_face_intersection(
mesh_a,
mesh_b,
std::back_inserter(tri_pairs),
PMP::parameters::vertex_point_map(get(CGAL::vertex_point, mesh_a)),
PMP::parameters::vertex_point_map(get(CGAL::vertex_point, mesh_b))
);