选择 sphere/frustum 重叠测试

Choice of sphere/frustum overlap test

我正在尝试理解一些可能比我现在想的要容易得多的东西,所以希望有人能够帮助我理解我下面描述的内容。

我知道,如果球体完全位于 3D 中六个截锥体平面中的至少一个平面(左、右、下、上、近远)之后,则该球体位于视锥体外。对于下例中圆心为 c2 的圆,情况也是如此,它完全位于左平面之外。重叠测试很简单,就是把球体的中心坐标代入平面方程,得到球心到平面的距离,然后与球体的半径进行比较。

但是,在以 c1 为中心的球体上使用这种方法会给我们一个误报,因为测试会告诉我们球体在右平面和远平面内(如果从上方看)。然后解决方案是通过确定从球体中心到最接近它的视锥角的距离来使用更精确的重叠测试。如果这个距离大于半径,则球体在截头锥体外等

我不明白的是,如果我们使用第二种方法,在一个类似于中心 c3 的球体上查看角而不是平面会怎样。测试不会告诉我们距球体中心的距离减去半径大于 0,因此在观察体积之外吗?

因此,如果给定一组正交视图体积规则,即 0 ≤ x ≤ 20,-5 ≤ 15,-5 ≤ z ≤ 18,以及 x、y、z 坐标 + a 的半径sphere 并告诉确定球体是在它内部还是外部。如何选择使用什么方法才能真正得到正确答案?

事实上你需要两者:

  1. 您必须检查测试球体是否 intersects/inside 截头体(6 个平面)- 您的 first approach.
  2. 然后(如果 1 为真)并且距离 < -R - 球体完全位于内部。
  3. 否则你必须检查平面上的交点坐标(如果你的 black 线段上至少有一个 red 十字,你就有交点):

3 的实施可能很棘手,所以这里有两个链接:

http://www.realtimerendering.com/intersections.html http://www.geometrictools.com/Source/Intersection3D.html

在哪里可以找到 Frustrum-Sphere 交叉算法。

但是 geometrictools 实现使用了 FindMinDistance 更复杂的算法。您可以检查它们的实现 (Wm5DistPoint3Frustum3.cpp) 并使其仅适用于迭代。