3.1 光线/平面相交

  先定义一个光线:函数

    

    

  虽然不须要对光线方向进行标准化,可是,仍是建议进行标准化,不然t将表明长度的距离。  测试

  再定义一个平面:spa

    

    

  而后坐标系统原点到平面的距离是D, D的符号决定了系统原点在平面的哪一边。这是平面的隐式函数。3d

  经过将方程(C1)的展开式代入平面方程(C2),获得射线原点到平面P的交点的距离:对象

    

  以向量表示,点积代数式。方程为:blog

    

  为了更有效地使用(C3),首先计算点积:内存

    

  若是Vd=0,说明Pn垂直Rd,即光线平行于平面,光线和平面不发生相交。诚然,光线可能位于次平面上,但这种状况是没有意义的;击中多边形边缘对渲染没有影响。一样,若是Vd<0,Pn和Rd的夹角大于90°,这种状况下平面的法线远离光线。若是建模系统使用的是单面平面对象,光线没法透过平面,那么测试将在这里结束,由于平面已经被剔除。若是光线经过这些测试,计算第二个点积。渲染

     

  如今计算点积的比值:im

    

  若是t<0,在光源后,没有实际的交点。不然,计算交点:d3

    

  一般,须要曲面法向量的是面向光线的法向量,所以能够根据其与方向向量Rd的关系来调整法向量Pn的符号。为了指向射线源,正常的符号应该被反转。(平面双面,因此可选相交面)

    

  对于那些须要烧内存的,能够预先计算并保存反向正常。

  总结来看,步骤是:

    1,计算Vd而后判断是否为0

    2,计算V0和t,而后比较t和0

    3,计算交点

    4,计算v0到0和反向法线

相关文章
相关标签/搜索