我正在尝试发现一种更快的算法,用于测试轴对齐conical surface是否与轴对齐边界框的体积相交。
我开发的当前算法如下:
有人能想到效率更高的吗?这似乎通过计算每个线路交叉点做了很多额外的工作。
编辑:
以上算法不好,例如:
圆锥体只能与盒子的一个边缘交叉,使得所有轴线交叉点都在一侧,因此除非测试所有边缘或智能选择要测试的边缘,否则上述算法不起作用(也许最靠近圆锥的边缘?)。
编辑编辑:请参阅下面我自己的答案,我后来发现这个解决方案对我来说似乎是最优的。
答案 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)
。
答案 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是一个很好的,但是如果你把所有东西都分成三角形,你最终会检查多余的顶点和边缘。我认为这样做会很好:
(可选)检查AABB是否完全位于垂直于锥轴的平面的另一侧。如果是这样,就没有交集了。
检查8个顶点中的每个顶点,看它是否在锥体内。如果有任何顶点,则圆锥和AABB相交。这非常简单,但链接的第4页对此进行了解释。
检查12个边缘中的每个边缘,看它们是否与锥体相交。如果有任何边缘,锥体和AABB相交。这是在链接的第4-5页。
检查6个面中的每个面,看它们是否与圆锥相交。如果有任何边缘,锥体和AABB相交。由锥轴对AABB形成的检查射线就足够了;这是一个非常标准的交叉测试。
交换面部和边缘检查的顺序实际上可能更好;我希望面部检查比边缘检查更快,所以你可以提前退出。
SIMD优化可能有一些很好的机会,因为顶点和边的数量都是4的倍数,而圆锥是轴对齐的,但这超出了这个答案的范围:)
答案 3 :(得分:1)
我提出了一种算法来解决任意锥体和aabb的一般情况,但它仍能有效地处理你的特定情况。
我在另一个帖子中描述过: Detect if a cube and a cone intersect each other?