球体/平截头体重叠测试的选择

时间:2016-05-29 16:31:21

标签: graphics 3d frustum culling

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

我知道如果球体完全位于3D中的六个平截头体平面中的至少一个(左,右,底部,顶部,近远),则球体位于视锥体之外。对于下面示例中具有中心c2的圆,这是完全正确的,该圆完全在左平面之外。重叠测试只需将球体的中心坐标插入平面方程中,即可得到从中心到平面的距离,然后将其与球体半径进行比较。

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

Spheres and viewing frustum

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

所以如果给出一组正交视图体积的规则,即0≤x≤20,-5≤15,-5≤z≤18,并且x,y,z坐标+球体的半径和告诉他们确定球体是在球体内部还是外部。如何选择使用哪种方法才能真正获得正确的答案?

1 个答案:

答案 0 :(得分:1)

实际上你需要两者:

  1. 您必须检查测试球体是否与截头体(6个平面)相交/是您的first approach
  2. 然后(如果1为真)并且距离<1。 -R - 球体完全在里面。
  3. 否则,您必须检查飞机上的交叉路口坐标(如果您的red路段上至少有一个black交叉路口,则: enter image description here
  4. 3的实现可能很棘手,所以这里有两个链接:

      

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

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

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