• 4 光线/盒 相交


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

      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中较大的值。

         

  • 相关阅读:
    3、选择排序(最小值/最大值)
    2、冒泡排序
    1、快速排序
    Stream操作
    1. 两数之和
    Mysql修改字段类型修改
    获取节假日
    mysql 前缀 + 编号 补0
    一口气说出 6种@Transactional注解的失效场景
    Activiti最全入门教程(基于Eclipse插件开发)
  • 原文地址:https://www.cnblogs.com/TooYoungTsukasa/p/9252581.html
Copyright © 2020-2023  润新知