現在,一個簡單的球體相交例子已經被概述。這里有一些關於計算效率的概念。
一個普遍的看法是,應該盡可能地避免使用平方根函數。檢查計時:sqrt()耗時通常是乘法的15~30倍。類似的,除法比乘法耗時更長,所以除法可以用乘以逆來代替。
另一個觀察的結果是,計算往往會被縮短。在球體情況下,許多測試檢測了球體相交問題,這些測試的目的是避免非必要的計算。
通過研究幾何,問題的其他性質就變得明了了。
例如,光線通常指向球外,這種不相交。通過研究這個可能,我們發現了另一種測試光線和球面相交的策略。
1) 找出光線原點是否在球面外
2) 找出光線最接近球體中心的地方
3) 如果光線在球體外且指向遠離球的方向,那么光線一定會錯過球體
4) 另外,求出離球體面最近的距離的平方
5) 如果值為負,光線會錯過球面
6) 另外,從上面找出射線/表面距離
7) 計算觸點坐標[xi yi zi]
8) 計算交點法線
該策略將方程(A5)和(A6)分解成更短的表達式,並根據需要進行計算。條件3,5將檢測射線偏離球面狀況。並允許提前停止。
以上內容將被充實和解釋。從原始的射線(A1)和球面(A2)方程開始。首先,通過計算確定光線的來源是否在球內。
如果L2oc<Sr2,則光源在球內。若L2oc>=Sr2,則光源點在球外或者球內。然后有可能不與球相交。效率起見,可以提前計算並保存Sr2
注意,起源於球體的光線不算擊中球體。這是ray tracing的標准,反擊和折射來自之前的相交處。在"精度問題"章節會討論如何規避。
在任何情況下,下一步都是計算球心到離他最近的線點的距離。這就等於求出射線與垂直於它的平面(穿過球心)的交點。
tca<0,光線在球后。對於來自外部的光線,這意味着光線不能擊中球體,另一種說法是,tca<0,射線指向原理球心,如圖2
一旦tca確定,從垂直點到球面的距離也就確定了。
方程的幾何意義展示在圖3.這個計算引出了另一個關於關於光線是否擊中球體的測試。如果t2hc<0,光線會錯過球面,當然,以上都是建立在光源不在球內的基礎上。
使用A7,A8之前會使用到前面的方程。
總結:
1,找出球心到光源的距離
2,找出球心最近的光源上的點
3,測試光線是否在球外且指向球外
4,找出thc
5,判斷thc2是否為負
6,計算交距t
7,找出交點
8,計算交點和法線