正确的平截头体aabb交叉点

时间:2015-08-03 13:41:17

标签: opengl graphics directx lwjgl opentk

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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