3d 无限锥面*AABB相交测试

3d 无限锥面*AABB相交测试,3d,geometry,collision-detection,intersection,3d,Geometry,Collision Detection,Intersection,我试图找到一种更快的算法来测试轴对齐是否与轴对齐边界框的体积相交 我开发的当前算法如下: x=0 对于AABB的任何4条平行边: 将其直线与圆锥体相交 如果交点位于AABB内: 返回true 如果交点位于AABB的特定一侧: x+=1 如果x==0或x==4(所有交叉点都位于AABB的一侧): 返回false 返回true 有人能想出一个更有效的吗?通过计算每条线的交点,这似乎做了很多额外的工作 编辑: 上述算法不好,例如: 圆锥体只能与长方体的一条边相交,所有轴线的交点

我试图找到一种更快的算法来测试轴对齐是否与轴对齐边界框的体积相交

我开发的当前算法如下:

  • x=0
  • 对于AABB的任何4条平行边:
    • 将其直线与圆锥体相交
    • 如果交点位于AABB内:
      • 返回true
    • 如果交点位于AABB的特定一侧:
      • x+=1
  • 如果x==0或x==4(所有交叉点都位于AABB的一侧):
    • 返回false
  • 返回true
有人能想出一个更有效的吗?通过计算每条线的交点,这似乎做了很多额外的工作

编辑:

上述算法不好,例如:

圆锥体只能与长方体的一条边相交,所有轴线的交点都在一侧,因此,除非所有边都经过测试或要测试的边都经过智能选择(可能是最靠近圆锥体的边?),否则上述算法不起作用

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

看看它,似乎没有众所周知的圆锥/AABB交点测试。恐怕你只能靠自己了

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

来自@Gareth Rees的是一个很好的例子,但如果您将所有内容拆分为三角形,您将最终检查冗余顶点和边。我认为这将很有效:

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

  • 检查8个顶点中的每一个,看看它是否在圆锥体内。如果存在任何顶点,则圆锥体和AABB相交。这是非常严格的,但在链接的第4页有解释

  • 检查12条边中的每条边,看它们是否与圆锥体相交。如果有任何边相交,则圆锥体和AABB相交。这在链接的第4-5页上

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

  • 实际上,交换面和边检查的顺序可能更好;我希望面部检查比边缘检查更快,因此您可以更早退出


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

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

    沿+-z轴的单位右锥体开口的方程式为
    x^2+y^2-z^2=0

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

    • 如果生成的间隔完全为负,则长方体完全位于圆锥体内部
    • 如果生成的间隔包含0,则长方体与圆锥体的曲面相交
    • 如果生成的间隔完全为正,则长方体完全位于圆锥体之外

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

    我在另一个帖子中描述了它:

    有点明显,首先检查边界球体(在本例中为长方体)通常更快。此外-您的算法是否可能失败-例如,如果圆锥体的点只穿透一个面,没有长方体边缘相交?除其他原因(见上文)外,是的。希望您不介意我在回答中引用了您的链接。如果这是一个问题,我会把它转移到一个评论。不,继续。在参考网站上有一个圆锥体和定向边界框之间的交叉测试,它确实依赖于圆锥体AABB测试。这不是小事,但值得一读。有些优化是可能的,例如通过只计算上限或下限来扩展计算,以便提前转义,并使用它完全返回内部或外部。事实上,如果只需要一个真/假结果,只需要计算下限。啊,酷!看起来你的答案至少比我对这个具体案例的回答慢了一个数量级。我的答案大约需要10个浮点运算。我还怀疑我在这里介绍的技术(基于区间算术)可以应用于一般情况。此后,我对我的解决方案进行了大量优化。你的速度更快,但在这一点上,我知道,这可能意味着你错过了案例,因为这是一个非常复杂的问题。如果圆锥体紧挨着盒子,圆锥体的底部靠近盒子的中间,情况会怎样?想象一下,圆锥体的边缘没有接触到盒子,直到它在圆锥底部的中间相交。啊,标题是“无限”圆锥,哈。在这种情况下,您的解决方案非常有效。即便如此,我上面所说的证明了你的方法,按现状来看,并不适用于一般情况。