简单的三维空间碰撞检查算法

时间:2018-01-24 01:35:33

标签: algorithm 3d geometry collision-detection computational-geometry

我有一个连续的3d空间,由4个平面的内部空间定义,它们在平行线上相遇(一个无限长的矩形) - 让我们称之为'A'。然后在模型中我有一堆封闭的凸3d形状,它们可能会或可能不会重叠到空间'A'中 - 让我们称之为'B'。我正在寻找的是一种计算效率尽可能高的算法过程来破译任何'B'形状是否与'A'重叠。

*每个'B'形状都由它的顶点,边和面以及平面等定义......以及它们之间的链接。

*如果其中一些没有意义,我可以做一些涂鸦......

到目前为止,我检查每个'B'形状与'A'的过程如下:

  1. 检查B的所有4个平面中是否有任何b点 - 如果是这样的话=>重叠(如果它们全部落在相同的空间=>没有重叠)

  2. 检查任何一条平行线是否与b的任何面相交 - 如果是这样=>重叠。

  3. 检查b的任何边缘是否与A的4个面中的任何一个相交 - 如果是这样=>重叠。

  4. 我还想我可以为每个'B'形状创建一个具有中心点和半径的近似边界圆,以便首先检查以快速消除远处'B'形状...

    **对于第2部分和第3部分,我使用一个函数来检查边是否与3d对象相交。这可以通过比较构成对象的每个平面的2个点来查看它们是否是相对的边,然后如果是这样找到平面交叉点并检查该交叉点是否在3d对象内。

    这似乎有效,但我想知道是否有更好或更快的方法来破解同样的坚果?也许我错过了一些明显的东西......

    由于

2 个答案:

答案 0 :(得分:3)

请注意,对于无限矩形“管”,您可以将问题减少到2D情况:只需将所有点和边投影到平面上,垂直于管。

现在你必须寻找具有矩形的折线(多边形)的交叉点(如果你使用管的母线上的点作为基点和矢量,则轴对齐) - 这个任务肯定更简单。

如果你的形状是凸的,那么多边形也是凸的,SAT方法(分离轴定理)非常好(当然,对于形状之间的链接,情况并非如此,它们应该单独处理)。

答案 1 :(得分:1)

继续MBo的回答,你可以通过取顶点的(2D)凸面来找到B形状的有用轮廓,这是一个凸多边形。

http://www.algorithmist.com/index.php/Monotone_Chain_Convex_Hull

然后应用Sutherland-Hodgman裁剪算法,看看是否还有非空交叉点。

https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm