先定義一個光線:函數
雖然不須要對光線方向進行標準化,可是,仍是建議進行標準化,不然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和反向法線