光线追踪中一个常用形式就是长方形的盒子。这个图元对象经常被用于边界体积-一个用于加快复杂对象相交测试的算法。

  Kay和Kajiya提出了一个基于slabs[9]来处理这些相交对象的方法。slab就是两个平行平面之间的空间。slab集的相交定义了边界体积。该方法依赖于每一对板的光线的交点,跟踪近距离和远距离的交点距离。如果最大的近值大于最小的远值,那么射线会错过边界体积。否则,会击中。

  最简单的有限边界体积之一是两个平行平面的交点,每个平面对齐,使得它们的法线与X,Y和Z轴的方向相同。 这个配置有很多属性,这使得它可以有效地测试交集。 以下算法使用这些属性来允许快速测试边界盒。 它被写入以便返回一个布尔值:如果该盒已经被命中则为TRUE,否则返回FALSE。

  用两个坐标定义正交盒:

    

  根据其原点和方向矢量定义光线:

    

  其中t > 0。 我们并不要求这些计算的射线方向被标准化,尽管如果需要相交距离,这种标准化是可取的。

    算法如下,如果击中盒,返回TRUE:

    依次判断X,Y,Z坐标,这里写的是X坐标的情况

    

    

  如果盒子被击中,相交距离等于tnear,射线的出口点是tfar。 可以按照公式(C8)中'射线/平面相交'部分公式计算交点。 图11显示了相交测试的两种情况。 对于更高效的算法,展开循环,将t1和t2交换为两个分支,然后将计算更改为乘以光线方向的倒数以避免分割。 展开回路允许消除比较t1和t2与X平面的tnear和tfar,因为tnear将始终设置为较小值,tfar则为t1和t1中较大的值。

     

 

posted on 2018-07-02 10:21  图样司  阅读(272)  评论(0编辑  收藏  举报