正确的一块 aabb 交集

Correct frustum aabb intersection

我需要 100% 正确的平截头体 aabb 相交测试以用于平截头体剔除。以下 link 解释了为什么大多数实现在 100% 正确测试时失败并提供了解决方案。

http://iquilezles.org/www/articles/frustumcorrect/frustumcorrect.htm

但是,这个解决方案不是 100% 正确吗?你能想到一个失败的案例吗?我想我可以,但很难解释。如果您认为这不起作用,您能否提供更好的解决方案?

你是对的,给定的解决方案不是 100% 正确。

他试图做的是所谓的分离轴定理(或Hyperplane separation theorem)。

在上半部分,他正在测试由平截头体平面定义的轴,在下半部分,他正在测试由 AABB 定义的轴。这既正确又是 SAT 考试所必需的。

他遗漏的是由一对边的叉积定义的轴,每个多面体一个边。 AABB 有 3 条独特的边(具有独特的边方向)和一个平截头体有 6 个独特的边缘。所以代码缺少对 3*6=18 个可能的分离轴的重叠测试。

给定轴的单个重叠测试如下所示:

  • 将对象 A 的所有点投影到该轴上。这将导致间隔 I1.
  • 将对象 B 的所有点投影到该轴上。这将导致间隔 I2。
  • 如果 I1 不与 I2 重叠,则找到分离轴并且 A 不与 B 相交。
  • 如果 I1 与 I2 重叠,则这不是分离轴 -> 测试下一个轴。