體繪制之光線投射算法(附源碼)


一、原理

Levoy在1988年提出了光線投射(ray-casting)算法[1],其基本原理是:從屏幕上每一個像素點出發,沿着視線方向發射出一條光線,當這條光線穿過體數據時,沿着光線方向等距離采樣,利用插值計算出采樣點的顏色值和不透明度;接着按照從前到后或從后到前的順序對光線上的采樣點進行合成,計算出這條光線對應的屏幕上像素點的顏色值。其原理如圖1所示。

圖1光線投射原理

 

該算法基於射線掃描過程,符合人類生活常識,容易理解可以達到較好的繪制效果。因此光線投射是目前應用最為廣泛的體繪制方法。然而當觀察方向發生變化時,采樣點的前后關系也必然變化,因此需要重新進行采樣,計算量極為龐大。針對算法所存在的問題,人們提出了不少優化方法,如光線提前終止、利用空間數據結構來跳過無用的體素,如八叉樹、金字塔、k-d樹等。

該算法的流程圖2所示。其中數據的分類主要是將體數據的標量值映射為顏色和不透明度,這需要構造合適的轉換函數。對體數據的采樣需要進行坐標系的變換,因為發射光線起點和方向是在圖像空間描述的,而采樣則是在物體空間進行的。圖像空間到物體空間的轉換可以通過旋轉和平移操作實現。將光線的描述轉換到物體空間后,沿着光線等間隔采樣,采樣點的顏色和不透明度通過插值獲得。最后需要沿着光線對所有采樣點的進行合成,得到光線對應的二維屏幕上像素點的顏色。

圖2 光線投射流程

二、實現

在實驗中,我們繪制了一個人工生成的體數據,該體數據是一個大正方體,內部包含一個球體,球體內又包含一個小正方體。繪制結果如圖3所示。

在數據分類階段,我們簡單地將三個幾何體分別賦為白色、紅色和黃色,並設置一定的透明度。我們選擇了平行投影的方式,這樣從圖像平面發出的所有光線的方向都一致,因此在進行坐標變換時,光線方向的變換只需要進行一次。另外需要將每條光線的起點進行旋轉和平移,以轉換到物體空間描述。對采樣點的插值采用的是三線性插值,這也是整個算法最耗時的部分。關於采樣點的合成,我們采用從前向后的合成方式,合成公式如下:

這樣可以利用提前終止條件以加速算法,即當累計不透明度超過1時就停止合成操作。

從實驗結果可以看出,光線投射法通過不透明度的設置可以得到半透明的繪制效果,這樣就能有效地反映出物體內部結構,這也是體繪制與面繪制的最大區別。光線投射法作為最為通用的體繪制方法,其繪圖質量最高,但相應的問題就是繪制速度較低,難以實時化。實際上,對於本實驗中的體積數據,使用簡單的最近鄰插值得到的結果與三線性插值並沒有差異,而且速度上能提高不少。因為在該體數據中,對大部分采樣點來說,與其鄰近的八個數據點的值都是相同的。

 

圖3 光線投射實驗結果

 

源碼下載

(注:核心代碼純C,圖像顯示部分使用了OpenGL)

參考:

 [1] Levoy M. Display of surfaces from volumedata[J]. Computer Graphics and Applications, IEEE, 1988, 8(3): 29-37.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM