文章來自:http://www.c-cnc.com/dz/news/news.asp?id=18622
在進行3D場景渲染時,天空是必不可少的因素。對于3D天空的模擬在視景仿真系統、計算機游戲、三維動畫中有著廣泛的應用。但是,目前對于天空的仿真還存在很多不足,一些模擬方法中存在實現復雜、計算耗時、圖像分辨力不高,真實感不強且只能生成靜態圖像等問題。本文在研究了前人仿真天空算法的基礎上,利用目前3D圖形行業中流行的OpenGL技術和有被譽為"大自然的幾何學"美稱的分形理論,提出了一種更加簡單實用的仿真3D天空的方法,可以仿真出具有動態效果和不同天氣的3D天空,繪制速度快,真實感強。
l構造天空模型
1.1 OpenGL技術[1.2]
OpenGL作為一套圖形標準,由數百個功能函數組成,提供了訪問圖形硬件的所有特性,其嚴格按照計算機圖形學原理設計而成,符合光學和視覺的原理,非常適合可視化仿真系。其優勢在于:首先,在OpenGL中,允許視景對象用圖形方式表達;其次,OpenGL通過光照處理能表達出物體的三維特性,其光照模型是整體光照模型。可視化仿真圖像的顏色體現著物體與視點以及光源之間的空間位置關系,具有很強的三維效果。此外,為彌補圖形方法難于生成復雜自然背景的不足,OpenGL提供了對圖像數據的使用方法,即直接對圖像數據讀、寫和拷貝,或者把圖像數據定義為紋理與圖形方法結合在一起生成視景圖像以增強效果。本文研究了基于OpenGL技術的3D天空仿真,使得算法易于實現,并且有很好的可視化效果。
1.2 傳統模型
在傳統的3D游戲中,對于天空的仿真,程序員往往從實時簡單的角度出發,采用非常簡化的天空模型,通常包括以下3種方法[3-5]:用一種接近天空的淡藍色來清除背景;采用天空盒(skyBox)的方法:即首先繪制一個多邊形,然后進行立方體紋理貼圖;八棱錐天空模型:定義一個天頂,以這個頂點為中心繪制一圈三角形扇,然后進行紋理映射。
這3種方法都具備了實時性,方法簡單的優點,但同時也存在明顯的不足,第一種方法繪制的天空效果看起來太平面化,簡單粗糙,逼近度不高。第二種方法對紋理的要求非常高,如果紋理使用得不好,在一個比較大的多邊形上的紋理就容易產生拉伸變形的副作用。此外,霧化設置也會產生問題,如果霧的設置靠近觀察點,則天空的顏色會變淡甚至沒有。第三種方法有明顯的天頂。
顯然,在如今這種對3D場景仿真要求越來越高的時代,這些方法已經不適應時代的要求,需要尋求一種渲染速度快,真實感強,有一定交互能力的3D天空模型。
1.3 半球型天空模型
地球是球型的,所以天空像半個球一樣籠罩在大地之上。在用計算機仿真3D天空時,半球型天空模型顯然符合真實世界的天空模型。利用數學中的球面方程,可以建立如下模型:

P是球面上一點,R為球的半徑。在球面坐標系下方程改寫為:

對于一個半球.φ為緯度,其變化范圍是O≤φ≤90°;θ為經度,其變化范圍是O≤θ≤360°。采用球型(DOme)的方法,比起采用盒子(BOx)的方法,有很多優點。首先由于球形方法繪制的天空具有更多的頂點,霧化效果可以繪制得更加均勻[5]。同時也可以實時改變單個頂點的顏色,這樣可以獲得一些非常好的效果,如一天不同時刻的太陽光。
半球型天空模型也存在不足:
(1)頂點數目過多,影響渲染速度。

N為所需要繪制的頂點總數;△φ,△θ為繪制球型天頂的頂點經緯度間隔,值越小、網格越密,繪制越精細。由于采用OpenG技術中的三角形帶繪制(GL-TRIANGLE一STRIP),每次繪制4個頂點,每個頂點被繪制4次,故需要乘以4。
(2)三角函數的運算過多。
在單一場景的渲染中不會影響渲染速度,但在復雜的3D場景中,渲染速度的劣勢會體現出來。因為在計算機中三角函數的運算較之加、減、乘、除等運算要慢的多。
1.4 曲面天空模型
為保持球型天空模型的優勢并彌補該算法的不足,本文研究了一種渲染速度更快的曲面天空模型,該模型如圖1所示。

該模型類似于將一個經過細分的平面的4個角點向下拉,形狀看上去像一個撐開的降落傘,將他罩在場景之上,可以模擬3D天空。曲面的長度為S為:

頂點坐標(x,y,z)的計算公式為:

其中△s為曲面細分間隔;j,i為循環參數。
曲面天空模型仍然可以用OpenGL技術中的三角形帶((GLTRIANGLE_STRIP)繪制,但他避免了三角函數的運算,且頂點數目比相同精度的球型天空模型少,故增加了渲染速度。
2 天空云圖
2.1 分形云圖
分形[4]方法建造的物體模型結構精細、算法控制相對簡單,適合于描繪云、樹等結構精細的物體。本文利用分形理論中的插值算法產生靜態天空云圖紋理,算法如下:
(1)在平面上劃分正方形網格n×n,隨機給A1,A2,A3,A4這4個角點的顏色。如圖2所示。
(2)計算中點值,B1=(A1+A2+A3+A4)×0.25+ξ×scale,其中ξ是一個隨機量;Scale一(1/2)H(標度)H即Hurst指數,他也是分形維數D的度量:D一2一H,如圖3所示。

(3)根據A1,A4,B1點和網格外一虛擬點,重復第(2)節,得到邊中點c1的顏色值。同理,可計算出C2,C3,C4邊中點的顏色值。
(4)遞歸步驟(2),(3),使其正方形網格不斷細化,直到達到預期的遞歸深度。
以上步驟中,正方形初始點的顏色是隨機賦予的,但正方形網格內的所有點不是隨機分布的。通過采用分形插值算法,使得網格內相鄰點之間建立了某種聯系,從而使生成體內部過渡得更加自然。這樣,通過分形插值算法,得到一個2維數組,將數組中的每一個元素值看成是云的不透明度數據。最小數組值代表最藍色,天空中云最少的部分,最大的值代表最白色,天空中云最重的部分。分析數組并生成藍天白云紋理圖如圖4所示。

2.2 紋理映射
紋理映射技術[1.2]也叫紋理貼圖技術(Texture Map-ping),與建造模型的方法相比,在摸擬物體表面細節方面,紋理映射是一個較有效的方法。景物表面紋理細節的模擬在真實感圖形合成技術中起著非常重要的作用,這種將景物表面紋理細節的模擬稱為紋理映射技術。現在,紋理映射已經成為三維圖形世界中最為常用的技術之一,其數學過程十分復雜,但OpenGL已對其進行處理,于是編程者可以利用幾個函數就可以完成紋理貼圖。
執行紋理貼圖的步驟可以概括為:定義紋理貼圖;控制紋理;說明紋理貼圖方式;激活紋理映射;定義紋理坐標等。在一個球面上進行紋理映射是比較復雜的,采用不同的映射方式將產生不同的問題。如果采用平面映射的方式將在連續處產生紋理拉伸現象,如果采用球面映射,最大的問題是在球面的極點產生紋理的聚集現象,對于好的紋理,這種現象可以縮減到最小。根據球面幾何知識,可以得到紋理坐標的具體計算公式:

加上1/2的原因是為了使U,V坐標的值處于(0.0,1.0)范圍內。
3 動態仿真
本文采用定時器技術和改變紋理矩陣坐標的方法實現云的流動效果。首先定義一個100 ms的定時器,每隔100ms紋理坐標改變一次。其次,使用多重紋理來添加一個單獨的云彩貼圖,通過變換紋理矩陣坐標實現流動。變換紋理坐標的方法是先將當前矩陣類型設置為紋理矩陣(GL-TEXTURE),然后調用glTranslate(),glRotate()和glScale()函數實現坐標的平移、旋轉和縮放。這樣,云就可以緩慢地在天空中移動。此外,通過添加按鍵響應函數,在函數體中利用()penGL的模型變換函數,如glRotate(),可以以任意角度旋轉3D天空,達到用戶與3D場景的交互的效果。
4仿真結果
本仿真實驗在CPU為P4,主頻為1.7 GHz,內存為256 M,集成顯卡上完成。仿真結果如圖5~圖8所示。天空中的云彩可以沿球形天空緩慢移動,客戶可以通過上下左右鍵旋轉3D天空。該模型在實時3D場景仿真中可以籠罩在場景之上,有很好的3D效果,并且真實感強。采用半球型天空模型的幀速率為250~285 f/s;采用曲面型天空模型的幀速率為324~340 f/s,在保證真實感和交互性的前提下,從渲染速度上看曲面天空模型優于半球型天空模型。


5 結 語
本仿真系統的軟件平臺為VC++6.O,通過OpenGL圖形庫函數實現可視化仿真。利用球形方程、平面方程、三角函數等幾何原理建立各種3D天空模型,運用分形理論中的插值算法編寫天空紋理,并通過OpenGL函數進行三角形帶繪制天空框架,紋理映射技術,映射出具有真實效果的3D天空。從仿真結果來看,真實感強,實時性好,此外,通過按鍵響應函數,可以以任意角度旋轉,任意高度升降3D天空,交互性強,非常適合3D游戲的戶外場景仿真。