2011-11-01 153 views
10

我正在寻找一个库或描述如何确定一个三角形网格与另一个相交的纸张。网格网格交叉点

有趣的是,我来了空。如果有一些方法可以在CGAL中完成,它就会避开我。

看起来似乎应该是可能的,因为三角形相交是可能的,因为每个网格包含有限数量的三角形。但是我认为一定有更好的办法来做到这一点,而不是明显的O(n * m)方法,其中一个网格有n个三角形,另一个网格有m个三角形。

+0

的“明显”的做法会给假阴性,如果网格的一个完全是另一内。 – cmannett85

+0

我感兴趣的网格之间的碰撞作为零厚度表面。我看到如果我感兴趣的解释为多面体的网格之间的碰撞会如何发生。 –

+1

[另请参阅三角形 - 三角形](http://www.realtimerendering.com/intersections.html) – bobobobo

回答

2

本书Real-Time Collision Detection对实现这样的算法有一些很好的建议。基本方法是使用空间分区或边界体积来减少需要执行的三边相交测试的数量。

有一些很好的学术软件包可以解决这个问题,包括Proximity Query PackageGAMMA research group at University of North Carolina的其他工作,SWIFT,I-COLLIDE和RAPID都是众所周知的。检查这些库上的许可证是否可以接受。

开放动态引擎(ODE)是一个物理引擎,它包含大量相交原语的优化实现。您可以查看他们的wiki上的三角形 - 三角形相交测试的文档。

虽然它不是你寻找什么,我认为,这也可能与CGAL - Tree of Triangles, for Intersection and Distance Queries

+0

伟大的书籍推荐 – Fattie

7

我们通常做使用CGAL的方法是用CGAL::box_intersection_d

您可以通过将此example与此one混合。

+0

考试4和5对初学者非常有用。但是,如何创建AABB的树形结构以加速整个过程尚不清楚。此外,这些例子对于自相交情况更为明显。在两个单独的网格的情况下,它不是很清楚(我猜想把所有的三角形/方块扔在一个矢量中并不是最优的)。以上任何建议? –

+1

您需要为每个网格使用一个矢量并使用[CGAL :: box_intersection_d()](http://doc.cgal.org/latest/Box_intersection_d/group__PkgBoxIntersectionD__box__intersection__d.html)。 – sloriot

1

要添加到其他答案,还有技术涉及三维Minkowski和凸多面体 - 凹多面体可以分解为凸部分。检出this

1

libigl,我们结束CGAL的CGAL::box_intersection_d到相交顶点V网状并面对F与顶点U另一个网和面向G,存储对相交面作为行中IF

igl::intersect_other(V,F,U,G,false,IF); 

这将忽略自交。为了完整起见,我会提到,我们也支持自相交在一个单独的功能:

igl::self_intersect(V,F,...,IF);