无限锥面* AABB交点测试

时间:2010-12-08 06:04:04

标签: 3d geometry collision-detection intersection

我正在尝试发现一种更快的算法,用于测试轴对齐conical surface是否与轴对齐边界框的体积相交。

我开发的当前算法如下:

cone, AABB, lines along 4 parallel edges, and intersection points

  • x = 0
  • 对于AABB的任何4个平行边缘中的每一个:
    • 将其线与锥体相交。
    • 如果交叉点在AABB内:
      • 返回true。
    • 如果交叉点位于AABB的特定一侧:
      • x + = 1
  • 如果x == 0或x == 4(所有交叉点都位于AABB的一侧):
    • 返回false。
  • 返回true。

有人能想到效率更高的吗?这似乎通过计算每个线路交叉点做了很多额外的工作。

编辑:

以上算法不好,例如:

cone hits untested axis of box

圆锥体只能与盒子的一个边缘交叉,使得所有轴线交叉点都在一侧,因此除非测试所有边缘或智能选择要测试的边缘,否则上述算法不起作用(也许最靠近圆锥的边缘?)。

编辑编辑:请参阅下面我自己的答案,我后来发现这个解决方案对我来说似乎是最优的。

4 个答案:

答案 0 :(得分:3)

我找到了一个可能的最佳解决方案:

沿+ -z轴的单位右锥开口的等式是x^2 + y^2 - z^2 = 0

使用interval arithmatic在AABB上查找x^2 + y^2 - z^2的最大值和最小值。提示:对于x^2,最小值为clamp(0, [xmin, xmax])^2,最大值为max(xmin^2, xmax^2)

  • 如果生成的间隔完全为负,则框完全位于圆锥内。
  • 如果生成的间隔包含0,则框与锥体的表面相交。
  • 如果生成的间隔完全为正,则框完全位于圆锥体外。

答案 1 :(得分:2)

this table of object/object intersection tests,似乎没有众所周知的锥/ AABB交叉测试。所以你是独自一人,我很害怕!

您可以从David Eberly的文章“Intersection of a Triangle and a Cone”开始,看看您能够适应多少情况。 (在最坏的情况下,AABB由12个三角形组成,但我希望你能做得更好。)

答案 2 :(得分:1)

来自@Gareth Rees的link to the David Eberly article是一个很好的,但是如果你把所有东西都分成三角形,你最终会检查多余的顶点和边缘。我认为这样做会很好:

  1. (可选)检查AABB是否完全位于垂直于锥轴的平面的另一侧。如果是这样,就没有交集了。

  2. 检查8个顶点中的每个顶点,看它是否在锥体内。如果有任何顶点,则圆锥和AABB相交。这非常简单,但链接的第4页对此进行了解释。

  3. 检查12个边缘中的每个边缘,看它们是否与锥体相交。如果有任何边缘,锥体和AABB相交。这是在链接的第4-5页。

  4. 检查6个面中的每个面,看它们是否与圆锥相交。如果有任何边缘,锥体和AABB相交。由锥轴对AABB形成的检查射线就足够了;这是一个非常标准的交叉测试。

  5. 交换面部和边缘检查的顺序实际上可能更好;我希望面部检查比边缘检查更快,所以你可以提前退出。

    SIMD优化可能有一些很好的机会,因为顶点和边的数量都是4的倍数,而圆锥是轴对齐的,但这超出了这个答案的范围:)

答案 3 :(得分:1)

我提出了一种算法来解决任意锥体和aabb的一般情况,但它仍能有效地处理你的特定情况。

我在另一个帖子中描述过: Detect if a cube and a cone intersect each other?