李頂峰 孔國梁
(鐵道第三勘察設計院集團有限公司,天津 300142)
傳統的工程設計往往是在二維紙質圖或電子地圖上進行,設計成果不直觀,缺乏真實感。工程三維仿真是一門將工程設計成果數據轉化為三維立體圖形,模擬現實環境,建立虛擬仿真場景的技術。應用這一技術,可以在工程設計、施工過程中,建立三維仿真景觀系統,真實呈現工程建成后的逼真場景,讓設計、決策人員對工程設計成果有直觀的三維立體印象,從而為工程設計的整體協調、合理性等提供決策依據,并做出更科學的分析和評判,在很大程度上提高了設計的質量和效率。隨著計算機軟硬件水平的提高,三維仿真技術在工程設計領域越來越得到廣泛應用,相關院校及設計施工單位對各種工程三維仿真系統也進行了相關研究開發。由于各類工程既具有一定的共性,又具有一定的差異性,應用需求變化較大,沒有合適的統一平臺,都需要定制開發。這樣造成了很大程度上的重復開發,生產開發效率和質量受到制約。
軟件開發平臺是指用來構建、支撐應用軟件開發的獨立軟件系統,通常是一個封裝了各種底層模型、特定功能模塊的更加方便實用的高級API函數庫或工具包,它是開發、部署、定制特定軟件的基礎[1]。一個應用軟件,往往是一個復雜的系統,降低其復雜度和提高效率的最好辦法就是將系統分層實現,每一個層次實現自身的功能模塊,并屏蔽其以下層次的技術細節,這些層次模塊具有相對獨立的功能,可在不同的應用系統開發中復用和擴展。
為了簡便、高效、快速地開發各種工程三維仿真應用系統,本文深入分析工程三維仿真需求及特點,基于OpenGL技術,設計了一種適用于開發各類工程三維虛擬仿真系統的通用平臺。文中重點介紹了該平臺的層次結構、各模塊的功能及關鍵技術特點、應用方法以及開發實例。
工程三維仿真系統通用開發平臺是用來快速構建、開發工程三維虛擬仿真應用系統的高級軟件工具包。平臺分三層設計,提供可重用的類庫,支持系統框架結構的自動生成,全部源程序開放,用戶可自由修改內核,在各層次各模塊的基礎上都能加以擴展和定制,以滿足不同的系統應用需求,具有很好的開發性和擴展性。經過反復使用驗證,自身具有較高的質量,基于平臺開發的新系統也就具有較高的質量保證。
工程三維仿真系統通用開發平臺架構分為三層,包括底層基礎類庫、中間層通用模塊及系統應用層,如圖1所示。

圖1 平臺層次結構
底層包括各種基礎類庫,如Windows API、OpenGL(Open Graphics Library)圖形庫及Visual C++MFC類庫,這些是本文三維仿真平臺得以實現和應用的必要基礎,處在平臺的最底層。其中,OpenGL是繪制高真實感三維圖形,實現交互式視景仿真和虛擬現實的高性能三維圖形庫,是目前應用最廣泛的三維圖形應用程序設計接口之一,也是行業領域中最廣為接納的計算機圖形標準[2]。作為圖形硬件的軟件接口,OpenGL包括了超過700個圖形操作函數,它們分別屬于OpenGL的核心庫(gl)、實用庫(glu)、輔助庫(aux)、實用工具集(glut)、窗口庫(glx、agl、wgl)和擴展函數庫等不同的庫。OpenGL的一個長處就是其靈活的擴展機制,擴展函數庫正是硬件廠商為實現硬件更新,利用OpenGL的擴展機制開發的函數,軟件開發人員可以通過OpenGL擴展使用最新的硬件功能。Visual C++MFC(Microsoft Foundation Classes),是微軟公司提供的基礎類庫,是一種應用程序框架,隨Visual C++開發工具發布,MFC提供了應用程序向導自動生成框架,大大簡化了應用程序初始框架的構建和界面的設計。
中間層包括各種通用模塊、功能件和眾多高級API。OpenGL是比較低級的繪圖函數庫,僅限于生成簡單的幾何圖元(點、直線和多邊形),無法直接創建更為復雜的三維物體,同時OpenGL也沒有包含應用程序窗口及鍵盤鼠標事件處理的函數,要創建完整的圖形應用程序,必須利用底層函數,整合包裝成更加實用的高級API或擴展功能模塊,如常用幾何圖元繪制模塊、高級圖元繪制模塊、視圖窗口模塊等。工程三維仿真系統在建模、渲染、操作、計算等方面具有較大的共性,在中間層通過對底層模塊加以擴展封裝,形成更加通用的模塊,如紋理映射模塊、文字模塊、幾何運算模塊、相機模塊等。由于源程序全部開放,用戶也可以在必要時使用底層函數進行二次開發,擴展或添加新的功能模塊。
應用層是面向具體的工程三維仿真應用搭建的系統框架,包括常用的工程仿真應用模塊,如工程數據管理模塊、場景構建繪制模塊、場景顯示控制模塊、場景漫游控制模塊等,可廣泛應用于工程數據可視化、虛擬現實、三維輔助設計、演示匯報等領域,用戶只需要在此平臺基礎上進行一定的功能擴展和改造,即可快速定制開發出一套仿真應用系統,從而大大減少由最原始的基礎開發一個仿真應用系統的成本和難度。
該平臺對各主要功能都進行了封裝,使之成為通用的開發模塊,各接口規范統一。平臺主要由基礎功能模塊和應用功能模塊兩大部分構成,如圖2所示。

圖2 平臺功能模塊結構
基礎部分涉及三維仿真最基礎的功能模塊,包括紋理映射模塊、文字模塊、幾何運算模塊、高級圖元繪制模塊、對象拾取模塊、視圖窗口模塊、渲染控制模塊和相機模塊。應用部分是常用的工程仿真應用模塊,包括工程數據管理模塊、場景構建繪制模塊、場景漫游控制模塊、場景顯示控制模塊、信息查詢顯示模塊、場景輸出模塊。這些模塊都可以直接使用,快速實現系統相關功能,也可以對各模塊進行調整改造,滿足更加特殊的應用要求。
以下分別介紹各模塊的主要功能,同時就其中的關鍵技術進行深入研究。
紋理映射模塊主要解決各種紋理圖像的加載及紋理對象、紋理緩沖區對象的創建。
紋理貼圖是把一幅紋理圖像加載映射到一個多邊形的表面,可以增強場景渲染真實感。該模塊采用GDI的方式包裝了紋理圖像的加載及紋理函數的指定,可以統一處理 bmp、jpg、gif、tga等紋理資源的加載以及透明紋理的貼圖。
紋理對象通過一個單獨的數字來標識紋理,能夠在內存中保存多個紋理,而不需每次使用的時候再去加載,從而減少了運算量,提高了速度。紋理緩沖區對象把像素數據存儲在OpenGL服務器端,可以消除每一幀渲染時把數據從客戶機內存傳輸到服務器的開銷,以提高應用程序的性能。該模塊封裝了紋理對象以及紋理緩沖區對象的創建。
文字模塊主要解決各種字體2D、3D文字的繪制。
OpenGL通常只能處理英文字體的繪制,對于漢字及字體設置都比較麻煩。該模塊通過字符位圖等方式,包裝了2D、3D中英文字符的繪制、字體的設置及字體顯示列表的創建,簡化了文字的處理工作,提高了開發效率。
幾何運算模塊主要處理各種幾何元素及幾何變換的運算。
該模塊定義了點、矢量等基本幾何元素的數據結構,實現了相應的C++類,可供其他模塊開發時用來定義更復雜的數據結構和幾何運算。
高級圖元繪制模塊主要實現各種高級圖元的繪制。
OpenGL是比較低級的繪圖函數庫,僅限于生成簡單的幾何圖元(點、直線和多邊形),無法直接創建更為復雜的幾何圖元或更高級的三維實體。該模塊包裝了多種直線樣式的繪制、多種四邊形樣式的繪制、凹多邊形,以及內部有孔多邊形、復雜鑲嵌多邊形、圓柱體、圓錐體等的繪制,實現了3DS等模型的加載繪制,使各種工程構造物及三維實體的模型構建更加簡便、高效。
對象拾取模塊主要實現三維仿真環境下實體對象的選擇。
對象拾取是指在視圖窗口中用鼠標選擇物體的過程,涉及用戶和圖形之間的交互操作,是交互式三維仿真系統必要的組成部分之一[3]。對于二維繪圖程序,一般通過計算二維線框與鼠標拾取框的交叉關系來實現,相對比較容易。但對于三維應用程序,由于場景繪制時,幾何對象都經過了空間的多次旋轉、平移和投影變換,直接設計算法來計算拾取的對象會非常困難。OpenGL的選擇模式為用戶提供了一種拾取物體的機制,它通過在繪制前命名對象,拾取時可返回特定區域的對象名稱,從而獲得拾取的對象。該模塊包裝了對象拾取的相關操作,簡單實用。
視圖窗口模塊主要處理 Windows視圖窗口與OpenGL圖形繪制的連接,是在Windows環境下使用OpenGL進行三維圖形繪制的基礎。
Visual C++中沒有提供現成的視圖類可直接用OpenGL進行圖形繪制,OpenGL本身也不包括任何Windows窗口管理和用戶交互的函數,它使用渲染場景(Rendering Context)進行圖形繪制,因此使用OpenGL在Windows窗口中繪制圖形時,需要在每個窗口中嵌入一個渲染場景,通過渲染場景與設備場景的關聯,實現OpenGL與窗口的關聯。渲染場景保存了與OpenGL發生聯系的信息,負責處理應用程序發出的OpenGL命令。像素格式為設備場景設置一些與OpenGL相關的屬性,如實現圖形動畫效果的雙緩存、像素的顏色模式、顏色的位數、深度緩存的位數等,在創建一個渲染場景之前,需要為窗口的設備場景設置一個合適的像素格式[4]。該模塊在 MFC視圖類CView的基礎上創建了一個封裝OpenGL的視圖基類,實現了渲染場景的自動設置,使Windows窗口與OpenGL相關聯,可直接調用OpenGL的命令進行圖形繪制。
渲染控制模塊主要包裝渲染繪圖模式的控制。該模塊通過相關函數,統一實現了多邊形填充模式切換、開啟關閉紋理貼圖、打開關閉光照等功能。
相機模塊主要處理三維視景體的設置及操作,類似于照相機的取景功能,包括視點坐標系設置、模型視圖變換、投影變換和視口變換。
在三維仿真系統中,屏幕所顯示的景物范圍是由OpenGL的取景設置決定的。取景操作是OpenGL圖形顯示繪制的一個關鍵技術,它通過設定視點坐標系,確定視點的位置及視線的方向,經過模型視圖變換及投影變換,定義出要觀察的景物空間,并將三維景物投影成二維圖像,最后利用視口變換將圖像輸出到對應的窗口區域中。該模塊設計了一個相機類,封裝了OpenGL取景操作的基本功能,使開發人員更方便地在應用程序中實現場景的設置。
工程數據管理模塊是工程設計數據庫與三維仿真系統緊密聯系的部分,是系統與數據及文件的接口,包括數據的輸入輸出、格式轉化及相關計算。
工程設計數據是工程三維仿真系統的基礎數據來源,在此基礎上可以進行各種場景及實體模型的構建、計算。該模塊設計了一個數據管理類,包裝了設計數據的加載、工程構造物模板的初始化,漫游路徑的引入,以及場景數據的分塊索引功能。系統開發人員可以在此類的基礎上加以修改,以適應各自工程設計數據的導入導出及相關計算應用。
場景構建繪制模塊是三維仿真系統的核心模塊之一,其中搭建了場景實體構建繪制的統一程序框架,封裝了各種通用場景的構建繪制,如背景天空、三維地形、地物等。
該模塊通過場景對象基類搭建了場景實體構建繪制的程序框架,使其過程完全規范化與統一,開發人員可以根據需要在此基類的基礎上派生新的場景對象類,修改其中對應函數,最大化減少重復勞動,把精力集中在具體的構建及繪制細節需求上,該框架特別適合各種工程構造物模型的構建與繪制。其框架圖如圖3所示。

圖3 場景實體構建繪制的程序框架
該模塊采用搭積木的方式構建場景,先將整個工程場景劃分為苦干個結構特征各異的子場景或實體,各部分具有較強的功能性和獨立性,分別采用合適的實體造型技術構建模型,選用有利的渲染技術繪制場景,最后將各子實體搭建在一起顯示,形成整體統一的仿真場景。該方法使復雜的場景簡單化,問題處理有的放矢,是一種分而治之的基本策略,非常有利于程序開發的編制、測試及功能擴充。圖4為基于此平臺開發的某工程三維仿真系統場景實體類層次結構示意。

圖4 場景實體類層次結構示意
場景漫游控制模塊主要用于場景的靜態交互瀏覽和動態漫游控制。靜態交互瀏覽是一種重要的虛擬觀測手段,主要是通過界面、鍵盤、鼠標等工具,實現對三維空間的交互操作,讓用戶可以從不同側面、不同角度、方位進行實時的觀測或瀏覽,給人以身臨其境的感覺。交互控制包括平移、旋轉、縮放等操作。動態漫游控制統一了漫游視點、漫游路徑等相關參數的設置,實現了三維仿真場景的動態演示。
場景顯示控制模塊主要實現三維仿真場景對象的分類顯示控制。該模塊統一設定場景對象的顯示控制參數,界面采用帶檢查框的樹型控件分類顯示各場景對象,并關聯對應屬性,實現場景對象的按需加載顯示。
信息查詢顯示模塊主要實現三維仿真系統中各種數據信息的查詢、計算及顯示功能。該模塊封裝了坐標查詢、空間距離查詢、對象屬性查詢、視點信息查詢以及相應信息顯示功能。
場景輸出模塊包裝了屏幕圖形的輸出及動畫錄制功能,極大的方便了工程三維仿真效果圖的制作及漫游動畫的輸出,使用戶可以脫離系統查看工程三維仿真成果。
工程三維仿真系統通用開發平臺是一個高級軟件開發工具包,提供了Visual Studio工程模板,實現了平臺與Visual Studio的緊密結合,用戶可根據需要自動生成三維仿真系統的VC解決方案和工程,也可直接以平臺作為系統的基礎框架,快速構建工程三維虛擬仿真應用系統的原型,最大化的復用軟件代碼和各功能模塊,減少重復開發。以此基礎上,修改相關函數的源代碼,自定義各自工程數據的加載及相關計算的引入,組織具體工程實體對象的模型構建與仿真渲染。也可以對平臺加以擴展,改造或添加新的功能模塊,實現特定的應用需求,快速搭建適應具體工程的仿真應用系統。
目前,使用基于OpenGL的工程三維仿真系統通用開發平臺研發了多套直接面向工程實際應用的系統,如“高速磁懸浮鐵路軌道梁三維效果圖系統[5]”、公路三維實時動態仿真系統、鐵路三維虛擬仿真系統、城市虛擬景觀系統等,如圖5所示。

圖5 基于該平臺開發的仿真系統實例
上述實踐應用表明,該平臺的方法及技術切實可行,結構清晰,簡化了三維仿真系統的開發過程,減少了重復開發和總的工作量,降低了編程和代碼維護難度,可以縮短系統的研發周期,節約軟件的研發成本和提高生產效率。平臺擴展性強,執行效率高,仿真效果好,運行穩定可靠。
[1]羅昔軍,馬征.定制軟件開發平臺的研究與設計[J].計算機技術與自動化,2006,6(2):108-110
[2]呂???,周小平.實戰OpenGL三維可視化系統開發與源碼精解[M].北京:電子工業出版社,2009:10-16
[3]雷鳴,錢世洋,等.基于OpenGL的核心可視化交互功能實現[J].計算機與數字工程,2006(12):138-142
[4]王清輝,王彪.Visual C++CAD應用程序開發技術[M].北京:機械工業出版社,2003:52-61
[5]李頂峰,伍衛凡.基于OpenGL的磁浮鐵路實時三維可視化技術研究與實現[J].鐵道勘察,2008(2):39-43