張 巖,聶永丹,趙建民,侯俊龍 (東北石油大學計算機與信息技術學院,黑龍江 大慶 163318)
Open Inventor是目前世界上使用最廣泛的面向對象的繪圖軟件接口,允許用戶通過搭積木的方式來構建復雜的三維場景,使得用戶只需花費很少的時間就可以構造出復雜的三維場景[1]。Open Inventor中根據不同行業的需求提供了若干擴展模塊,其中MeshViz XLM擴展模塊提供了強大的應用科學領域中模型網格繪制、提取和數據匹配功能,并且包含了高級的數據可視化設計組件、復雜曲面、三維統計圖等多種可視化對象,DialogViz擴展模塊提供了可以與場景交互的編程接口,使用DialogViz節點可以控制和操作場景中的對象,并且DialogViz節點的使用與其他Open Inventor的使用方式沒有區別[2]。下面,筆者對基于MeshViz的動態交互式圖例技術進行了研究。
MeshViz提供的圖例節點類型是MoLegend,它能以一個矩形的方式給出當前色譜的彩色圖例,在這個矩形圖例上可以設置圖例的名稱、最大值與最小值等,同時利用MoLegend提供的編程接口可以實現展示形狀、方向、顏色映射類型的動態設定等功能。
顏色映射節點會根據一個數值的大小計算該數值對應的顯示顏色,相應的顏色就會在一個數據集合對應的數據體表面上顯示出來,顏色映射節點實現了一種簡單的顏色參照表的定義方式,在MeshViz中提供了4種類型的顏色映射節點。
1)MoLevelColorMapping節點 該節點定義了具有N個數量級的數據集合和與之對應的N-1種顏色,它的映射方法是如果某個數據v值的在Vk≤v≤Vk+1范圍內,則該數據對應的屬性將被映射到顏色Ck上去。
2)MoLinearColorMapping節點 該節點為數據與顏色集合定義了一種線性映射的方式,假設某個數據v值的在Vk≤v≤Vk+1范圍內,它對應的顏色Ck取決于(Vk,Ck)和(Vk+1,Ck+1)的線性映射關系。
3)MoPredefinedColorMapping節點 該節點是一種預定義的色譜,使用MoPredefinedColorMapping色譜數值對應的顏色與預定義的顏色范圍相匹配,Open inventor根據不同業務的需要提供了9種預定義色譜類型,用戶可以直接從中選用合適色譜即可[3]。
4)MoCustomColorMapping節點 該節點是一個實現了MiColorMapping接口的類,必須實現的函數是getColor(),getColor()的作用是根據一個給定的數值轉成SbColorRGBA類型的數值,從而允許用戶實現任何方式的轉換函數。
在數據映射過程中,色譜上每一種顏色和每一種屬性值相對應,利用不同顏色可以展示出多種不同屬性的效果,相應的與某一種顏色對應的數值叫做等價數值。通過定義等價數值可以設定需要展示數據的范圍,MeshViz提供了PbIsovaluesList和PoIsovaluesList 2種定義等價數值的類型,因此可以使用下列2種方式定義等價數值:①定義一個繼承自PoIsovaluesList類的子類,將該類的對象添加到場景中;②定義一個繼承自PbIsovaluesList的對象,調用setIsovaluesList()函數和可視化對象相關聯。在MeshViz可以方便地使用上述方法。
DialogViz模塊中包括了SoTopLevelDialog、SoMenuBar和SoMenuPopup類型的節點,以及從SoDialogGroup派生的SoColumnDialog、SoRowDialog和SoTabDialog類型的節點。在交互接口程序中可以同時使用以上多種節點。DialogViz的初始化支持2種方式:既可以從程序中直接用代碼定義,也可以從已經定義好的文件中讀取。創建一個DialogViz窗口的步驟如下:①創建一個SoTopLevelDialog節點;②設置SoTopLevelDialog節點的屬性域;③創建窗口的子節點控件如按鈕,滑塊等;④將創建的子節點控件添加到SoTopLevelDialog節點中;⑤調用buildDialog()函數時,DialogViz窗口就會顯示到屏幕上。
Open Inventor中場景的交互采用回調函數方式[4],與之不同的是DialogViz采用Java語言類似的監聽機制,DialogViz中提供了一系列預定義的監聽類,通過監聽類就可以完成用戶事件的交互響應。建立一個監聽的步驟如下:①定義一個從預定義DialogViz接口類派生的監聽類;②在定義的監聽類中覆蓋父類的虛函數,如dialogPushButton()、dialogCheckBox()、menuRadioButtons()等函數;③將監聽類添加到場景中。
利用MeshViz模塊創建一個圖例需要進行如下步驟的操作:①初始化圖例節點,通過指定圖例大小、坐標以及標題和數值的位置來定義圖例節點;②在場景中插入PoDataMapping類型數據映射對象并與圖例節點關聯;③在場景中插入PoIsovaluesList類型等價數值對象并與圖例節點關聯 (可選);④指定圖例中所要顯示數據的最大值、最小值以及過渡數值。如果定義了數據映射節點對象或者等價數值節點對象,可以通過這2類節點圖例指定數值范圍;⑤將圖例節點添加到場景中。
采用模塊化程序設計思想,為方便其他模塊調用[4],筆者將動態交互圖例封裝在一個類mylegend中,圖例的初始化利用該類的默認構造函數實現,構造函數執行完畢后圖例保存在legendroot節點中。創建圖例關鍵代碼如下:


1)控件定義 采用滑塊控件實現邊界顏色對應的數據值調節控制,利用check控件實現顏色映射方式的動態交互,DialogViz設置定義在iv文件中,其中滑塊控件的設置如下:

2)創建監聽 創建監聽的相關代碼如下:

3)將控件與監聽類關聯 將控件與監聽類關聯的相關代碼如下:

MeshViz提供的第1種數據映射方式PredefColorMapping是將每個屬性值映射到預定義的顏色范圍的方式,其特點是實現簡單,無需用戶干預,缺點是在某些情況下屬性的顏色值分布的不靈活,用戶修改顏色分布的難度大。為了用戶能夠自定義不同的顏色模式以及設置數據體某些屬性的顏色表示方式,可以采用MoLinearColorMapping映射方式,由此實現一種用戶自定義的圖例范圍及映射方式的動態設定。筆者在mylegend類中提供一個供外部模塊調用的public方法setmapvalue,該方法通過傳入數據范圍參數min、max來動態改變數據映射范圍,通過參數order來判斷用戶的數據映射方式是順序還是倒序,以此來改變映射方式。該函數的代碼描述如下:

動態交互式圖例程序運行界面分別如圖1和圖2所示。

圖1 自定義數據范圍順序映射方式圖例

圖2 自定義數據范圍反序映射方式圖例
利用Open Inventor中MeshViz和DialogViz擴展模塊實現動態交互式圖例類,根據用戶需求可以自定義數據映射范圍與映射方式。該方法實現簡便,便于用戶直觀理解模型的結構和分析模型特性。此外,由于采用了模塊化的設計思想,因而具有較強的擴展性,可以方便地與用戶的其他業務模塊集成。
[1]滕貽健,柴山,荊旭,等 .基于Open Inventor的虛擬駕駛仿真系統 [J].計算機應用,2009,29(s1):323-325.
[2]閻鋒欣,候增選,張定華,等.Open Inventor程序設計從入門到精通 [M].北京:清華大學出版社,2007.
[3]Wernecke J.The Inventor Mentor:Programming Object-Oriented 3DGraphics with Open Inventor,Release 2 [M].London:Addison-Wesley Publishing Company,1994.
[4]Ezust A,Ezust P.An Introduction to Design Patterns in C++ with Qt4 [M].New york:Prentice Hall,2006.