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
可能存在一些很好的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测试。这不是小事,但值得一读。有些优化是可能的,例如通过只计算上限或下限来扩展计算,以便提前转义,并使用它完全返回内部或外部。事实上,如果只需要一个真/假结果,只需要计算下限。啊,酷!看起来你的答案至少比我对这个具体案例的回答慢了一个数量级。我的答案大约需要10个浮点运算。我还怀疑我在这里介绍的技术(基于区间算术)可以应用于一般情况。此后,我对我的解决方案进行了大量优化。你的速度更快,但在这一点上,我知道,这可能意味着你错过了案例,因为这是一个非常复杂的问题。如果圆锥体紧挨着盒子,圆锥体的底部靠近盒子的中间,情况会怎样?想象一下,圆锥体的边缘没有接触到盒子,直到它在圆锥底部的中间相交。啊,标题是“无限”圆锥,哈。在这种情况下,您的解决方案非常有效。即便如此,我上面所说的证明了你的方法,按现状来看,并不适用于一般情况。