顧灝



摘要:本文首先概括介紹了虛擬現實技術和OpenGL技術,然后給出了在Visual C++ 2019平臺下運用OpenGL實現三維虛擬現實系統的基本過程和方法,探討了構建過程中的一些技術問題。
關鍵詞:虛擬現實;OpenGL;三維建模
1 引言
隨著計算機技術的迅速發展,虛擬現實與我們的生活日益密切。它已成為當今計算機界廣泛關注的一個熱點,意指“計算機產生的三維交互環境,在使用中用戶是投入到這個環境中去并能體驗到‘身臨其境’的感覺,人與計算機之間的交互極為自然”,虛擬現實的出現改變了人們傳統的思維方式,使人、計算機和現實環境緊密的結合起來,現已延伸到娛樂、醫療、軍事、建筑、機械等各個領域。
目前,對虛擬現實技術的研究越來越廣泛,越來越深入。本文使用OpenGL和VC++工具,開發出一個虛擬現實系統。該系統實現的基本過程為:首先進行素材收集和處理,用數碼相機進行實景拍照、再利用Photoshop圖像處理軟件對其進行加工處理,然后在3dsMax中建模并進行優化處理,最后利用OpenGL和VC++進行三維編程實現虛擬現實。
2OpenGL技術
OpenGL是近幾年發展起來的一個性能卓越的三維圖形庫標準,是一個高性能的圖形開發軟件包。它是在SGI等多家世界聞名的計算機公司的倡導下,以SGI的GI三位圖形庫為基礎的制定的一個通用共享的開方式三維圖形標準。
OpenGL靈活方便地實現了二維和三維的高級圖形技術,在性能上表現的異常優越。它具有建模、變換、光線處理、色彩處理、動畫以及更先進的能力,如紋理映射、物體運動模糊效果和霧化效果等。OpenGL為實現逼真的三維繪制效果,建立交互的三維場景提供了優秀的軟件工具。
OpenGL為應用程序員提供了程序和圖形輸入輸出設備之間的功能接口,定義了一個獨立于語言的圖形核心系統。因此OpenGL可以與Visual C++緊密接口,該接口由幾百個函數組成,利用這些函數,把OpenGL嵌入Visual C++之中,用戶可創建出高質量的三維圖形。
3模型構建與優化
在實際的三維圖形程序中,需要構建的三維模型一般比較復雜,但OpenGL的建模功能并不是很強大,所以需與其它功能強大的三維建模軟件結合。3dsMax正是制作復雜三維建筑模型的理想工具。
下面介紹一下建筑物實例的實現過程:
(1)資料收集與準備
建筑物數據一般是利用現有的地圖等空間數據,主要包括地形圖和最新的規劃圖。建筑物紋理是建筑物三維模型的重要組成部分,紋理數據主要通過拍攝的數碼相片獲取,它直接影響著三維場景的顯示效果。
(2)在AutoCAD里進行二維平面建模
把收集到的規劃圖導入到AutoCAD軟件中,描出建筑物和道路等的平面位置,進行二維平面建模。
(3)在PhotoShop里制作材質貼圖
為了增強場景的真實感,要采用大量的紋理貼圖。模型的紋理來自建筑效果圖和使用數碼相機獲得的紋理照片,對紋理數據的采集,一般是數碼相機拍攝出各個面的正攝影像。當然,獲得的紋理照片需要經過PhotoShop軟件的進一步地修整和校正。
(4)在3DSMAX里進行幾何建模和場景材質貼圖
在3DSMAX里導入CAD平面圖,對其進行幾何建模,在此過程中用到的命令有描邊、擠出、拉伸、位移等。在建好簡單的三維立體模型之后,對其進行材質貼圖,以使模型具有較強的真實感。對于某些細節可以不必建模,直接用圖來模仿,比如花壇里植被的建模就是直接在一個矩形上貼上對應的圖片來近似生成的。在賦材質時候,可利用UV編輯器和透明貼圖通道的調節,來使模型達到更為真實的感覺。
(5) 把模型導出為3ds格式文件
整個場景模型完成后,在3DSMAX 中將模型用 Export命令導出為 3DS 文件格式。這樣,因為系統提供了可以導入3ds文件的接口,所以可以很方便地打開建好的模型。
下面為在3D Studio Max建立的模型效果圖:
4系統組成與功能模塊
本系統是在Windows XP 操作系統下,基于Visual C++6.0平臺,調用OpenGL 函數庫的函數設計實現的,在建立模型時采用了3dmax軟件。
系統可以導入3ds格式的三維模型,在系統中重繪,顯示不錯的三維效果。用戶可以對模型進行一定的處理和控制,這些處理和控制包括對象的材質編輯、場景中的燈光進行控制、利用鼠標來對視點進行控制和實現漫游功能等等。依照系統設計的功能可以將整個系統分為三個模塊,即:3DS文件的導入模塊、材質、光照處理模塊、多視點觀察模塊。
本系統的功能模塊框架如下圖所示。
5系統實現
5.1構建OpenGL圖形開發環境
(1)創建MFC界面,向工程中添加OpenGL編譯鏈接庫opengl32.lib、glu32.lib、glaux.lib、glut32.lib,并確保在系統的system32目錄下有下列動態鏈接庫文件的存在:glu.dll、glu32.dll、glut.dll、glut32.dll、opengl32.dll。
(2)編寫創建函數。因為OpenGL僅能在客戶窗口中繪圖而無法在該窗口的子窗口和兄弟窗口中繪圖,所以必須在客戶區域中加以去除。本程序在VIEW類的PreCreateWindow()函數中添加下面語句來實現:
cs.style |=WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
(3)設置像素格式,創建繪制描述表。這一過程在視圖類里的OnCreate函數中通過調用獨立出來的CreateOpenGL()來實現。OpenGL依賴繪制描述表操作顯示硬件,因此調用OpenGL命令前,必須創建繪制描述表并使其成為當前的繪制描述表,即m_hRC = wglCreateContext( hDC );wglMakeCurrent( hDC,m_hRC );
(4)定義當前視區及投影模式等。這些操作在對WM_SIZE消息的處理函數OnSize()中體現,在其中調用glViewport()函數對創建的窗口變換進行更改以適應窗口大小的改變。還可以通過gluPerspective()函數重新設置投影變換,使得當窗口的大小發生改變時,顯示在窗口中的場景不會發生扭曲。
(5)填充背景色,進行一些OpenGL繪制前的初始化工作。當需要重新設置窗口背景時,產生WM_ERASEBKGND消息。處理該消息的缺省操作是用當前背景色填充整個窗口。OpenGL用glClear()函數來執行類似操作,所以要對WM ERASEBKGND的消息處理函數做適當改變:注釋掉OnEraseBKgnd()函數中所有的語句,添加return TRUE語句,使該函數不執行操作,僅返回TRUE值。
(6)繪制場景,最后刪除繪制描述表。所有的OpenGL的繪制操作都必須放在OnDraw()函數中。在窗口銷毀時會觸發WM_DESTROY消息的處理函數,因此我們在該函數中刪除繪制描述表。
5.2功能模塊實現
(1) 3DS文件的導入模塊:主要用于從外部導入3DS格式的模型,還可以有選擇性的導入模型中的某些對象。系統對3DS文件中的有用數據進行了篩選,并依靠系統提供的函數將其導入系統自有的數據模型。另外,在將三維模型輸入的同時考慮到了模型本身的紋理,并開辟了紋理存儲空間來存儲對應的紋理。3DS的文件格式是分塊的層次結構,我們不需要讀出所有的這些塊信息,而是根據需要讀出其中某些塊。一般來說,3ds文件中的對象塊、顏色塊和材質塊信息是最重要的,所以要在程序中讀入。在本程序中定義一個類Import3ds用于3ds 文件的讀入。在這個類中,用到了read_chunk()、load_object()、load_material()、object3d等函數。這些函數將3DS中需要的塊數據讀出并存儲在自己組織的數據格式中。其中函數read_chunk()的主要功能是讀3ds文件中的塊,為了遍歷文件中的所有塊,使用了jump_chunk()函數來進行的塊讀取的跳轉,直至將所有塊的數據全部讀出來。
(2)材質和光照等處理模塊:包括修改光照和材質、背景修改、攝像機重置等功能,主要用于設置環境光、漫射光和鏡面光,使對象具有不同的材質特征,在編輯過程中,可以將編輯結果實時地反映到場景中的對象中。這個模塊用到的對話框均為無模對話框,首先構造一個對話框對象,然后調用成員函數Create來創建對話框窗口。此時對話框將出現在屏幕上,但Create函數已返回,在銷毀該對話框窗口時,調用DesrtoyWindow函數。
(3)多視點觀察模塊:借助這個模塊的功能,可以更好地觀察場景中的各個對象。這一模塊功能是通過設置一個可以變換位置的“攝像機”來完成的,這個攝像機在類Camera中定義,其中一些函數改變“攝像機”的狀態。攝像機視點控制要求系統可以利用系統輸入設備鼠標實現對視點控制。系統要求實時的監測鼠標的輸入信號,根據信號控制攝像機的狀態。主要控制方法有旋轉攝像機、繞一點旋轉攝像機、平移攝像機等。其中還實現了通過鼠標改變“攝像機”的狀態,從而可以多視點觀察整個場景。
5.3系統運行界面
本虛擬現實系統的運行效果如下圖所示。
6結束語
本文給出了一種構建桌面虛擬現實系統的基本過程和實現方法,OpenGL和3dsMax結合實現三維仿真既利用了3dsMax建立模型方便快捷的特點,又利用了OpenGL容易實現交互性的特點,可以方便地在不同平臺和系統間移植。同時,系統提供3ds導入接口,還能夠利用已有的3ds模型。這種方法系統實現起來簡單方便,通用性好,對于快速開發可視化系統具有現實意義。
參考文獻
[1]Grigore C.Burdea[美]Philippe Coiffet[法]:《虛擬現實技術(第二版)》.電子工業出版社,2005.7
[2]黃心淵等. 3DS MAX 5 標準教程[M].人民郵電出版社,2003年1月
[3]李長春等. 基于VC++與OpenGL的三維圖形環境的構建[J].電腦開發與應用,2004,17(6):10-13
[4]和平鴿工作室. OpenGL高級編程與可視化系統開發[M].中國水利水電出版社,2002