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