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

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

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

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

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

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

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

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

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

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


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