喬要賓, 朱定強(qiáng), 鄭才浪
(北京航空航天大學(xué)宇航學(xué)院,北京 100191)
科學(xué)可視化的目標(biāo)是把由實驗或數(shù)值計算獲得的大量數(shù)據(jù)轉(zhuǎn)變成人的視覺可以感受到的計算機(jī)圖像[1]。通過可視化技術(shù),將探測或計算得到的火箭發(fā)動機(jī)噴流輻射場數(shù)據(jù)進(jìn)行處理,得到等值線,云圖和等值面等計算機(jī)圖像,可以對火箭發(fā)動機(jī)噴流輻射場有直觀、形象和全面的理解。這對于導(dǎo)彈目標(biāo)探測、識別研究和突防技術(shù)研究等具有十分重要的意義。
可視化技術(shù)雖然發(fā)展時間較短,但是隨著計算機(jī)技術(shù)的迅速發(fā)展,可視化技術(shù)也發(fā)展迅速,目前已經(jīng)廣泛應(yīng)用于醫(yī)學(xué)、地理、氣象、航天、軍事等領(lǐng)域。等值線和云圖是流場可視化的重要方法,目前常用的等值線的繪制算法有網(wǎng)格追蹤法,網(wǎng)格序列法等,云圖的填充算法有四叉樹算法,局部填充法等。
網(wǎng)格跟蹤法是通過給定等值線的一個起始點,計算求出該點相鄰的下一個等值點,重復(fù)計算直至等值線完成[2]。網(wǎng)格序列法是對網(wǎng)格進(jìn)行自上而下自左向右逐一提取,并尋找和處理該網(wǎng)格內(nèi)對應(yīng)的等值點和線段,在處理完所有的網(wǎng)格單元后,就自然生成了數(shù)據(jù)場的等值線分布[3]。但是網(wǎng)格追蹤法算法復(fù)雜,通用性差,不易編程。網(wǎng)格序列法存在等值線拓?fù)溥B接的二義性。
四叉樹算法基本思想是基于網(wǎng)格無限細(xì)分,根據(jù)矩形網(wǎng)格頂點值以矩形顏色塊來填充[4]。
但是該算法要想獲得光滑的云圖邊界,計算量太大。局部多邊形填充法的基本思想是[5]:在每個小矩形中按照填充顏色的級別將網(wǎng)格矩形單元分割為多個多邊形,然后用相應(yīng)的顏色進(jìn)行填充,在進(jìn)行網(wǎng)格范圍內(nèi)的循環(huán)完成整個區(qū)域的填充。但是該方法需要討論多達(dá) 12種情況,太過繁瑣,而且劃分的多邊形也不是最簡多邊形。
本文采用將網(wǎng)格的矩形單元劃分為4個三角形的方法,對網(wǎng)格序列法和局部多邊形填充法進(jìn)行了改進(jìn),結(jié)合OpenGL實現(xiàn)了火箭發(fā)動機(jī)噴流輻射場的等值線和云圖的繪制,同時導(dǎo)入 3DS格式的火箭發(fā)動機(jī)三維模型,利用OpenGL的三維顯示技術(shù)與輻射云圖結(jié)合進(jìn)行3D顯示。
無論是等值線,云圖還是等值面的繪制,首先要對數(shù)據(jù)文件進(jìn)行讀取并對數(shù)據(jù)進(jìn)行網(wǎng)格化處理。例如某火箭發(fā)動機(jī)40km高度的噴流輻射場數(shù)據(jù)是由程序計算,并按照 Tecplot軟件的數(shù)據(jù)格式進(jìn)行輸出得到,其具體文件格式如下:
前3行為文件頭,包含文件標(biāo)題,數(shù)據(jù)變量名稱和X,Y,Z坐標(biāo)的個數(shù)。第4行開始為數(shù)據(jù)部分,第一列為X坐標(biāo),第二列為Y坐標(biāo),第三列為Z坐標(biāo),第四列為坐標(biāo)點的數(shù)據(jù)值(如溫度,輻射亮度等)。
針對上述 DAT格式的文件,首先設(shè)置結(jié)構(gòu)體讀取文件頭信息:
讀取了文件頭后,就需要定義結(jié)構(gòu)體對文件數(shù)據(jù)進(jìn)行存儲和網(wǎng)格化:
結(jié)構(gòu)體FileData中包含了網(wǎng)格點的坐標(biāo)值(x,y,z)和輻射亮度(v)。
對流場數(shù)據(jù)進(jìn)行網(wǎng)格化后,整個流場數(shù)據(jù)就是由一系列的矩形網(wǎng)格單元組成。如圖1所示,連接4個頂點和中心點,就可以將矩形網(wǎng)格劃分為4個三角形網(wǎng)格。
定義 FileData a[m_x*m_y*m_z]存儲網(wǎng)格數(shù)據(jù),并保存數(shù)據(jù)中的最大值和最小值,通過等值線的數(shù)目N來計算需要顯示的等值線值序列,存儲于數(shù)組fv[N]中。定義FileData Ma存儲矩形網(wǎng)格單元中心點的數(shù)據(jù)。
圖1 矩形單元三角化
假設(shè)矩形網(wǎng)格4個頂點的數(shù)據(jù)為fv1,fv2,fv3,fv4,網(wǎng)格中心點的坐標(biāo)值及數(shù)值可以通過式(1)插值求得:
對于劃分后的三角形,首先要進(jìn)行等值點的查找。通過式(2)可以由兩個頂點值(fv1,fv2)和等值點的值fv判斷該邊上是否有等值點:
滿足式(2)表示該邊有等值點。假設(shè)等值點坐標(biāo)為(p.x, p.y, p.z),兩個頂點坐標(biāo)分別為(p1.x,p1.y, p1.z)、(p2.x, p2.y, p2.z),則利用式(3)-(5)進(jìn)行線性插值,得到等值點坐標(biāo),并保存。
在插值計算時,為了避免等值線從網(wǎng)格頂點經(jīng)過,即等值點與網(wǎng)格頂點重合的情況發(fā)生,可以在插值計算前對網(wǎng)格頂點值與等值線值進(jìn)行比較,如果兩者相等,則對網(wǎng)格頂點值進(jìn)行微量偏移。
要實現(xiàn)填充云圖,首先建立一張基于線性變化的顏色查找表,建立顏色與物理量(標(biāo)量)之間線性的一一對應(yīng)關(guān)系。
顏色的選定,影響到渲染效果,為了使系統(tǒng)能夠?qū)?shù)據(jù)的變化有層次的顯示出來,所以顏色表定義范圍要足夠大[6]。人們的視覺感官上將顏色分為3個色調(diào):冷色、中性色、暖色。其中冷色包括藍(lán)、青;中性色包括綠、紫;暖色包括紅、橙、黃[3]。在RGB模式下,我們可以通過調(diào)節(jié)R、G、B分量的比重,來構(gòu)成這些顏色[7]。為了滿足層次鮮明的需要,顏色線性表包含3個色調(diào),顏色表從冷色到暖色線性分布。
顏色線性表的顏色各個分量(R, G, B),具體分布如圖2所示。
其中,紅色線條表示紅色分量R的變化規(guī)律,綠色線條表示綠色分量G的分布規(guī)律,藍(lán)色線條表示藍(lán)色分量B的分布規(guī)律。R,G,B的值都隨對應(yīng)物理量的變化而變化(從0到1)。
圖2 各個顏色分量的分布圖
顏色線性表的結(jié)果如圖3所示,按物理量從最大值到最小值線性劃分為 12個值域,對應(yīng)從紅到藍(lán) 12種顏色。在進(jìn)行云圖填充時就可以按照物理量所在的值域,從顏色線性表選取對應(yīng)的顏色進(jìn)行填充。
圖3 物理量——顏色線性映射方法
遍歷整個網(wǎng)格,將矩形單元格逐一劃分為4個三角形,對三角形的三條邊進(jìn)行插值。等值線從網(wǎng)格單元內(nèi)經(jīng)過,有一個進(jìn)口就肯定有一個出口,所以等值點的數(shù)只可能是偶數(shù)[8],而且對于三角形來說,一條等值線與其交點的個數(shù)只能為0或 2。所以插值得到三角形三條邊上的等值點坐標(biāo),將這兩個等值點坐標(biāo)連接起來就形成了三角形內(nèi)的一條等值線。按照fv[N]中等值線值的存儲順序,逐一插值就可以得到三角形內(nèi)全部等值線。具體算法如下:
1) 首先提取一個矩形單元格,將其分割為4個三角形網(wǎng)格。
2) 提取一個三角形網(wǎng)格,由式(2)判斷 3條邊上是否有等值線。如果沒有,直接提取下一個三角形。否則進(jìn)行下一步。
3) 從等值線值數(shù)值fv[N]中提取一個值,根據(jù)式(3)計算三角形三條邊上的等值點坐標(biāo),然后將其直接連接,并根據(jù)等值線的值從顏色線性表中選取對應(yīng)的顏色賦給該等值線。
4) 從fv[N]中提取下一個值重復(fù)步驟3,直至所有的等值線都繪制完畢。
根據(jù)以上步驟可以繪制完成一個三角形內(nèi)的等值線,處理完4個三角形后就可以得到矩形單元格內(nèi)的等值線,遍歷整個流場的所有網(wǎng)格后就可以完成整個流場的等值線繪制。
對于每個三角形,按照其頂點標(biāo)量值的大小將頂點排序,最大值頂點為A,最小值頂點為C,中間值頂點為B。如果有等值線經(jīng)過,三角形內(nèi)部等值線的分布情況可分為3種情況,如圖4所示。
圖4 三角網(wǎng)格內(nèi)等值線分布情況
分別沿著ABC和AC兩條路徑計算等值點坐標(biāo),記錄每條邊上的等值點個數(shù),假設(shè)AB上有m1個等值點,BC上有m2個等值點,因為每條等值線在三角形內(nèi)有一個進(jìn)口,就有一個出口[8],所以AC上等值點個數(shù)n就等于m1+m2。記ABC路徑上的等值點為P11,P12,…,P1n;AC路徑上的等值點為P21,P22,…,P2n。然后將三角形頂點與等值點所構(gòu)成的多邊形按照順序依次進(jìn)行填充,就可以得到三角形內(nèi)的云圖。具體算法步驟如下:
1) 首先提取一個矩形單元格,將其分割為四個三角形網(wǎng)格。
2) 提取一個三角形網(wǎng)格,對其3個頂點按標(biāo)量值的大小進(jìn)行排序,由大到小為A,B,C。
3) 根據(jù)頂點值進(jìn)行判斷三角形內(nèi)是否有等值線經(jīng)過(即根據(jù)式(2)判斷AC上是否存在等值點),如果沒有等值線經(jīng)過,則根據(jù)頂點值的大小,從顏色線性表中選取對應(yīng)的顏色填充整個三角形。否則進(jìn)行下一步。
4) 分別沿著ABC和AC兩條路徑計算等值點坐標(biāo),記錄每條邊上的等值點個數(shù),假設(shè)AB上等值點數(shù)為m1,BC上等值點數(shù)為m2,AC上等值點個數(shù)n=m1+m2。記ABC路徑上的等值點為P11,P12,…,P1n,AC路徑上的等值點為P21,P22,…,P2n。
5) 根據(jù)m1,m2的值判斷等值線的分布情況。如果m2=0,即圖4中(a)所示的情況,則依次填充多邊形AP11P21,P11P21P22P12,…,P1nP2nCB;如果m1=0,即圖4中(b)所示的情況,則依次填充多邊形ABP11P21,P11P21P22P12,…,P1nP2nC;如果m1,m2都不為零,即圖4中(c)所示的情況,則先依次填充多邊形AP11P21,P11P21P22P12,…,P1nP2nC,然后填充三角形BP1m1P1m1+1。
根據(jù)以上步驟處理完4個三角形網(wǎng)格后即得到三角形內(nèi)的云圖,重復(fù)步驟2到步驟5即可完成矩形單元格內(nèi)的云圖填充,然后遍歷所有的單元格就可以得到整個流場的云圖。
在VC++6.0環(huán)境下,結(jié)合OpenGL,利用上述將矩形網(wǎng)格三角化的方法編制的可視化軟件,實現(xiàn)的火箭發(fā)動機(jī)噴流輻射場的輻射亮度等值線圖和云圖,如圖5~圖7所示。
圖5 輻射亮度等值線圖
圖6 火箭發(fā)動機(jī)噴流輻射亮度云圖
圖7 局部輻射亮度云圖
為了增強(qiáng)可視化軟件的顯示效果,需要將火箭發(fā)動機(jī)的3D模型與其噴流輻射場的云圖結(jié)合顯示。但是直接用OpenGL的圖元繪制命令進(jìn)行復(fù)雜的建模不太現(xiàn)實,所以本文采用專業(yè)的建模軟件SolidWorks進(jìn)行建模,然后利用軟件Deep Exploration將模型轉(zhuǎn)化為 3DS格式的文件,在VC++6.0環(huán)境下編寫程序讀取3DS文件數(shù)據(jù),再利用OpenGL對模型進(jìn)行繪制交互控制。
3DS文件有許多塊組成,至今為止,沒有任何一個官方文件完全說明3DS的文件格式,但是我們可以忽略掉那些不管興趣或未知的塊,只在程序中讀入我們需要的塊[9],表1中列舉了3DS文件中一些主要的塊。
表1 3DS模型文件中幾個主要的塊ID及信息
一般情況下,3DS文件中對象塊、顏色塊和材質(zhì)信息是最重要的,對三維模型的繪制起著決定性的作用,我們在可視化程序中定義一個類CLoad3DS來讀入3DS文件,在這個類中,主要有兩個函數(shù)處理 3DS文件::Load3DS()(打開3DS文件,并根據(jù)塊ID選擇需要的塊進(jìn)行讀取),ObjCalcNormals()(計算面和點的法向量)。CLoad3DS類主要用來讀取3DS文件中的數(shù)據(jù)信息并計算面和點的法向量,將這些數(shù)據(jù)存儲在自己定義的數(shù)據(jù)結(jié)構(gòu)中。這些數(shù)據(jù)可以直接用OpenGL進(jìn)行重繪。
CLoad3DS類中定義的數(shù)據(jù)模型源碼如下:
讀取了模型數(shù)據(jù)后,可以用OpenGL編寫程序?qū)δP瓦M(jìn)行重繪。
首先利用OpenGL繪制基本圖元的函數(shù)對模型進(jìn)行繪制,3DS模型是由一系列的三角面組成的,根據(jù)模型結(jié)構(gòu)體存儲的頂點信息和對應(yīng)的法向量與紋理信息,利用 GL_TRIANGLES(三角形圖元模式)就可以將一系列的三角面繪制出來,添加材質(zhì)紋理,就可以繪制出3DS模型。模型重繪的源碼如下:
繪制完模型后,還要進(jìn)行光照的設(shè)置,在CView類的初始化函數(shù)中加入代碼:
來開啟光照,在繪制模型的時候,OpenGL就可以根據(jù)模型的材質(zhì)紋理和表面各點法向量對模型進(jìn)行渲染,可以使模型具有3D的顯示效果。
在VC++6.0環(huán)境下,利用本文所述的算法,結(jié)合OpenGL編寫的可視化軟件,繪制云圖并導(dǎo)入3DS模型,實現(xiàn)了火箭發(fā)動機(jī)模型與噴流輻射場云圖的結(jié)合顯示,如圖8所示。
圖8 噴管模型與輻射場云圖結(jié)合3D顯示效果
為了更好的顯示三維流場的輻射云圖,在可視化軟件中添加繪制了一個可控制移動的圓形徑向截面云圖和圓柱形的流場表面透視圖,結(jié)合3D火箭發(fā)動機(jī)噴管模型達(dá)到3D顯示效果。
1) 用將矩形網(wǎng)格分成4個三角形的方法,對網(wǎng)格序列法和局部多邊形填充法進(jìn)行了改進(jìn),基于三角網(wǎng)格進(jìn)行等值線的繪制和填充,實現(xiàn)了火箭發(fā)動機(jī)噴流輻射場的等值線和云圖的繪制。
2) 針對3DS文件的格式,編寫程序?qū)肓?DS格式的三維模型數(shù)據(jù),利用OpenGL對模型進(jìn)行重繪,完成了火箭發(fā)動機(jī)噴管3D模型的導(dǎo)入。
3) 液體火箭發(fā)動機(jī)噴流形成的激波處溫度較高,輻射亮度值也相應(yīng)較大。如圖5和圖7所示,云圖能夠清晰的顯示出輻射場的激波,說明利用本文所述算法得到的輻射場云圖能夠很好的噴流輻射亮度的分布規(guī)律。
[1]唐衛(wèi)清, 劉慎權(quán), 余盛明, 李 華. 科學(xué)計算可視化[J].軟件世界, 1996, 5:74-77.
[2]郭新奇, 嚴(yán)建鋼, 楊士鋒, 沈賠志. 基于 VC++的等值線追蹤與填充算法[J]. 兵工自動化, 2011, 30(4):81-84.
[3]姚麗嬌. 科學(xué)計算中的標(biāo)量場可視化技術(shù)[D]. 遼寧:東北大學(xué), 2009.
[4]王家華, 黃本宇. 油氣藏等值線圖跟蹤和填充算法[J]. 特種油氣藏, 2006, 13(6): 95-98.
[5]龐世明, 蔡玉華, 靳文芳. 等值線圖的彩色填充方法[J]. 計算機(jī)應(yīng)用, 2004, 24(1): 60-62.
[6]呂 珍. 基于 OpenGL的流場數(shù)據(jù)可視化技術(shù)[D].武漢: 武漢理工大學(xué), 2007.
[7]Shreiner D. OpenGL編程指南(第7版)[J]. 北京: 機(jī)械工業(yè)出版社, 2009, 113-121.
[8]爨 瑩, 朱航洲. 一種新的等值線繪制方法研究[J].圖像與多媒體, 2012, 31(3): 46-49.
[9]李 新, 李珊珊. 3ds模型在OpenGL中的讀取和重繪[J]. 首都師范大學(xué)學(xué)報(自然科學(xué)版), 2008, 29(2):101-104.