喬要賓, 朱定強, 鄭才浪
(北京航空航天大學宇航學院,北京 100191)
科學可視化的目標是把由實驗或數值計算獲得的大量數據轉變成人的視覺可以感受到的計算機圖像[1]。通過可視化技術,將探測或計算得到的火箭發動機噴流輻射場數據進行處理,得到等值線,云圖和等值面等計算機圖像,可以對火箭發動機噴流輻射場有直觀、形象和全面的理解。這對于導彈目標探測、識別研究和突防技術研究等具有十分重要的意義。
可視化技術雖然發展時間較短,但是隨著計算機技術的迅速發展,可視化技術也發展迅速,目前已經廣泛應用于醫學、地理、氣象、航天、軍事等領域。等值線和云圖是流場可視化的重要方法,目前常用的等值線的繪制算法有網格追蹤法,網格序列法等,云圖的填充算法有四叉樹算法,局部填充法等。
網格跟蹤法是通過給定等值線的一個起始點,計算求出該點相鄰的下一個等值點,重復計算直至等值線完成[2]。網格序列法是對網格進行自上而下自左向右逐一提取,并尋找和處理該網格內對應的等值點和線段,在處理完所有的網格單元后,就自然生成了數據場的等值線分布[3]。但是網格追蹤法算法復雜,通用性差,不易編程。網格序列法存在等值線拓撲連接的二義性。
四叉樹算法基本思想是基于網格無限細分,根據矩形網格頂點值以矩形顏色塊來填充[4]。
但是該算法要想獲得光滑的云圖邊界,計算量太大。局部多邊形填充法的基本思想是[5]:在每個小矩形中按照填充顏色的級別將網格矩形單元分割為多個多邊形,然后用相應的顏色進行填充,在進行網格范圍內的循環完成整個區域的填充。但是該方法需要討論多達 12種情況,太過繁瑣,而且劃分的多邊形也不是最簡多邊形。
本文采用將網格的矩形單元劃分為4個三角形的方法,對網格序列法和局部多邊形填充法進行了改進,結合OpenGL實現了火箭發動機噴流輻射場的等值線和云圖的繪制,同時導入 3DS格式的火箭發動機三維模型,利用OpenGL的三維顯示技術與輻射云圖結合進行3D顯示。
無論是等值線,云圖還是等值面的繪制,首先要對數據文件進行讀取并對數據進行網格化處理。例如某火箭發動機40km高度的噴流輻射場數據是由程序計算,并按照 Tecplot軟件的數據格式進行輸出得到,其具體文件格式如下:


前3行為文件頭,包含文件標題,數據變量名稱和X,Y,Z坐標的個數。第4行開始為數據部分,第一列為X坐標,第二列為Y坐標,第三列為Z坐標,第四列為坐標點的數據值(如溫度,輻射亮度等)。
針對上述 DAT格式的文件,首先設置結構體讀取文件頭信息:

讀取了文件頭后,就需要定義結構體對文件數據進行存儲和網格化:

結構體FileData中包含了網格點的坐標值(x,y,z)和輻射亮度(v)。
對流場數據進行網格化后,整個流場數據就是由一系列的矩形網格單元組成。如圖1所示,連接4個頂點和中心點,就可以將矩形網格劃分為4個三角形網格。
定義 FileData a[m_x*m_y*m_z]存儲網格數據,并保存數據中的最大值和最小值,通過等值線的數目N來計算需要顯示的等值線值序列,存儲于數組fv[N]中。定義FileData Ma存儲矩形網格單元中心點的數據。

圖1 矩形單元三角化
假設矩形網格4個頂點的數據為fv1,fv2,fv3,fv4,網格中心點的坐標值及數值可以通過式(1)插值求得:

對于劃分后的三角形,首先要進行等值點的查找。通過式(2)可以由兩個頂點值(fv1,fv2)和等值點的值fv判斷該邊上是否有等值點:

滿足式(2)表示該邊有等值點。假設等值點坐標為(p.x, p.y, p.z),兩個頂點坐標分別為(p1.x,p1.y, p1.z)、(p2.x, p2.y, p2.z),則利用式(3)-(5)進行線性插值,得到等值點坐標,并保存。

在插值計算時,為了避免等值線從網格頂點經過,即等值點與網格頂點重合的情況發生,可以在插值計算前對網格頂點值與等值線值進行比較,如果兩者相等,則對網格頂點值進行微量偏移。
要實現填充云圖,首先建立一張基于線性變化的顏色查找表,建立顏色與物理量(標量)之間線性的一一對應關系。
顏色的選定,影響到渲染效果,為了使系統能夠將數據的變化有層次的顯示出來,所以顏色表定義范圍要足夠大[6]。人們的視覺感官上將顏色分為3個色調:冷色、中性色、暖色。其中冷色包括藍、青;中性色包括綠、紫;暖色包括紅、橙、黃[3]。在RGB模式下,我們可以通過調節R、G、B分量的比重,來構成這些顏色[7]。為了滿足層次鮮明的需要,顏色線性表包含3個色調,顏色表從冷色到暖色線性分布。
顏色線性表的顏色各個分量(R, G, B),具體分布如圖2所示。
其中,紅色線條表示紅色分量R的變化規律,綠色線條表示綠色分量G的分布規律,藍色線條表示藍色分量B的分布規律。R,G,B的值都隨對應物理量的變化而變化(從0到1)。

圖2 各個顏色分量的分布圖
顏色線性表的結果如圖3所示,按物理量從最大值到最小值線性劃分為 12個值域,對應從紅到藍 12種顏色。在進行云圖填充時就可以按照物理量所在的值域,從顏色線性表選取對應的顏色進行填充。

圖3 物理量——顏色線性映射方法
遍歷整個網格,將矩形單元格逐一劃分為4個三角形,對三角形的三條邊進行插值。等值線從網格單元內經過,有一個進口就肯定有一個出口,所以等值點的數只可能是偶數[8],而且對于三角形來說,一條等值線與其交點的個數只能為0或 2。所以插值得到三角形三條邊上的等值點坐標,將這兩個等值點坐標連接起來就形成了三角形內的一條等值線。按照fv[N]中等值線值的存儲順序,逐一插值就可以得到三角形內全部等值線。具體算法如下:
1) 首先提取一個矩形單元格,將其分割為4個三角形網格。
2) 提取一個三角形網格,由式(2)判斷 3條邊上是否有等值線。如果沒有,直接提取下一個三角形。否則進行下一步。
3) 從等值線值數值fv[N]中提取一個值,根據式(3)計算三角形三條邊上的等值點坐標,然后將其直接連接,并根據等值線的值從顏色線性表中選取對應的顏色賦給該等值線。
4) 從fv[N]中提取下一個值重復步驟3,直至所有的等值線都繪制完畢。
根據以上步驟可以繪制完成一個三角形內的等值線,處理完4個三角形后就可以得到矩形單元格內的等值線,遍歷整個流場的所有網格后就可以完成整個流場的等值線繪制。
對于每個三角形,按照其頂點標量值的大小將頂點排序,最大值頂點為A,最小值頂點為C,中間值頂點為B。如果有等值線經過,三角形內部等值線的分布情況可分為3種情況,如圖4所示。

圖4 三角網格內等值線分布情況
分別沿著ABC和AC兩條路徑計算等值點坐標,記錄每條邊上的等值點個數,假設AB上有m1個等值點,BC上有m2個等值點,因為每條等值線在三角形內有一個進口,就有一個出口[8],所以AC上等值點個數n就等于m1+m2。記ABC路徑上的等值點為P11,P12,…,P1n;AC路徑上的等值點為P21,P22,…,P2n。然后將三角形頂點與等值點所構成的多邊形按照順序依次進行填充,就可以得到三角形內的云圖。具體算法步驟如下:
1) 首先提取一個矩形單元格,將其分割為四個三角形網格。
2) 提取一個三角形網格,對其3個頂點按標量值的大小進行排序,由大到小為A,B,C。
3) 根據頂點值進行判斷三角形內是否有等值線經過(即根據式(2)判斷AC上是否存在等值點),如果沒有等值線經過,則根據頂點值的大小,從顏色線性表中選取對應的顏色填充整個三角形。否則進行下一步。
4) 分別沿著ABC和AC兩條路徑計算等值點坐標,記錄每條邊上的等值點個數,假設AB上等值點數為m1,BC上等值點數為m2,AC上等值點個數n=m1+m2。記ABC路徑上的等值點為P11,P12,…,P1n,AC路徑上的等值點為P21,P22,…,P2n。
5) 根據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。
根據以上步驟處理完4個三角形網格后即得到三角形內的云圖,重復步驟2到步驟5即可完成矩形單元格內的云圖填充,然后遍歷所有的單元格就可以得到整個流場的云圖。
在VC++6.0環境下,結合OpenGL,利用上述將矩形網格三角化的方法編制的可視化軟件,實現的火箭發動機噴流輻射場的輻射亮度等值線圖和云圖,如圖5~圖7所示。

圖5 輻射亮度等值線圖

圖6 火箭發動機噴流輻射亮度云圖

圖7 局部輻射亮度云圖
為了增強可視化軟件的顯示效果,需要將火箭發動機的3D模型與其噴流輻射場的云圖結合顯示。但是直接用OpenGL的圖元繪制命令進行復雜的建模不太現實,所以本文采用專業的建模軟件SolidWorks進行建模,然后利用軟件Deep Exploration將模型轉化為 3DS格式的文件,在VC++6.0環境下編寫程序讀取3DS文件數據,再利用OpenGL對模型進行繪制交互控制。
3DS文件有許多塊組成,至今為止,沒有任何一個官方文件完全說明3DS的文件格式,但是我們可以忽略掉那些不管興趣或未知的塊,只在程序中讀入我們需要的塊[9],表1中列舉了3DS文件中一些主要的塊。

表1 3DS模型文件中幾個主要的塊ID及信息
一般情況下,3DS文件中對象塊、顏色塊和材質信息是最重要的,對三維模型的繪制起著決定性的作用,我們在可視化程序中定義一個類CLoad3DS來讀入3DS文件,在這個類中,主要有兩個函數處理 3DS文件::Load3DS()(打開3DS文件,并根據塊ID選擇需要的塊進行讀取),ObjCalcNormals()(計算面和點的法向量)。CLoad3DS類主要用來讀取3DS文件中的數據信息并計算面和點的法向量,將這些數據存儲在自己定義的數據結構中。這些數據可以直接用OpenGL進行重繪。
CLoad3DS類中定義的數據模型源碼如下:


讀取了模型數據后,可以用OpenGL編寫程序對模型進行重繪。
首先利用OpenGL繪制基本圖元的函數對模型進行繪制,3DS模型是由一系列的三角面組成的,根據模型結構體存儲的頂點信息和對應的法向量與紋理信息,利用 GL_TRIANGLES(三角形圖元模式)就可以將一系列的三角面繪制出來,添加材質紋理,就可以繪制出3DS模型。模型重繪的源碼如下:

繪制完模型后,還要進行光照的設置,在CView類的初始化函數中加入代碼:

來開啟光照,在繪制模型的時候,OpenGL就可以根據模型的材質紋理和表面各點法向量對模型進行渲染,可以使模型具有3D的顯示效果。
在VC++6.0環境下,利用本文所述的算法,結合OpenGL編寫的可視化軟件,繪制云圖并導入3DS模型,實現了火箭發動機模型與噴流輻射場云圖的結合顯示,如圖8所示。

圖8 噴管模型與輻射場云圖結合3D顯示效果
為了更好的顯示三維流場的輻射云圖,在可視化軟件中添加繪制了一個可控制移動的圓形徑向截面云圖和圓柱形的流場表面透視圖,結合3D火箭發動機噴管模型達到3D顯示效果。
1) 用將矩形網格分成4個三角形的方法,對網格序列法和局部多邊形填充法進行了改進,基于三角網格進行等值線的繪制和填充,實現了火箭發動機噴流輻射場的等值線和云圖的繪制。
2) 針對3DS文件的格式,編寫程序導入了3DS格式的三維模型數據,利用OpenGL對模型進行重繪,完成了火箭發動機噴管3D模型的導入。
3) 液體火箭發動機噴流形成的激波處溫度較高,輻射亮度值也相應較大。如圖5和圖7所示,云圖能夠清晰的顯示出輻射場的激波,說明利用本文所述算法得到的輻射場云圖能夠很好的噴流輻射亮度的分布規律。
[1]唐衛清, 劉慎權, 余盛明, 李 華. 科學計算可視化[J].軟件世界, 1996, 5:74-77.
[2]郭新奇, 嚴建鋼, 楊士鋒, 沈賠志. 基于 VC++的等值線追蹤與填充算法[J]. 兵工自動化, 2011, 30(4):81-84.
[3]姚麗嬌. 科學計算中的標量場可視化技術[D]. 遼寧:東北大學, 2009.
[4]王家華, 黃本宇. 油氣藏等值線圖跟蹤和填充算法[J]. 特種油氣藏, 2006, 13(6): 95-98.
[5]龐世明, 蔡玉華, 靳文芳. 等值線圖的彩色填充方法[J]. 計算機應用, 2004, 24(1): 60-62.
[6]呂 珍. 基于 OpenGL的流場數據可視化技術[D].武漢: 武漢理工大學, 2007.
[7]Shreiner D. OpenGL編程指南(第7版)[J]. 北京: 機械工業出版社, 2009, 113-121.
[8]爨 瑩, 朱航洲. 一種新的等值線繪制方法研究[J].圖像與多媒體, 2012, 31(3): 46-49.
[9]李 新, 李珊珊. 3ds模型在OpenGL中的讀取和重繪[J]. 首都師范大學學報(自然科學版), 2008, 29(2):101-104.