李秀玲
(忻州職業(yè)技術(shù)學(xué)院計(jì)算機(jī)系,山西 忻州 034000)
研究和實(shí)驗(yàn)三維虛擬環(huán)境,實(shí)現(xiàn)虛擬校園的意義在于:
(1)通過(guò)虛擬校園,用戶(hù)可以直觀、詳細(xì)地了解校園的景觀和環(huán)境,能感受到栩栩如生的校園建筑,對(duì)校園環(huán)境產(chǎn)生身臨其境的感覺(jué)。
(2)能夠完善學(xué)校的網(wǎng)站功能,用戶(hù)可以通過(guò)瀏覽器來(lái)體驗(yàn)校園逼真的視覺(jué)效果,并配以許多信息查詢(xún)功能,有助于學(xué)校宣傳,并提高學(xué)校的知名度。
(3)有利于學(xué)校招生,借助網(wǎng)絡(luò)平臺(tái),建立虛擬校園,可以提高校園的美譽(yù)度幫助學(xué)校大范圍的招生,從而增強(qiáng)學(xué)校的影響力和競(jìng)爭(zhēng)力。
(4)優(yōu)化學(xué)校建設(shè),通過(guò)虛擬校園,學(xué)校可以方便的對(duì)學(xué)校結(jié)構(gòu)進(jìn)行分析,并做出合理的布局規(guī)劃[3];另一方面設(shè)計(jì)者們可以首先在系統(tǒng)中對(duì)規(guī)劃方案進(jìn)行預(yù)設(shè)計(jì),并通過(guò)虛擬導(dǎo)游員進(jìn)行預(yù)覽,得到合適的方案,這樣就避免了盲目施工所帶來(lái)的資源浪費(fèi)。
由此,虛擬校園可認(rèn)為包括學(xué)?,F(xiàn)實(shí)的虛擬化和過(guò)程教學(xué)[5]。其虛擬校園包括模擬真實(shí)的校園景觀,它的建筑可以是現(xiàn)有的建筑,也可以是正在建設(shè)的或準(zhǔn)備建設(shè)的建筑。這個(gè)課題主要服務(wù)于現(xiàn)實(shí)的學(xué)校[2]。
根據(jù)作者自身的實(shí)際情況和綜合能力,準(zhǔn)備從程序底層開(kāi)發(fā),既運(yùn)用 VC++和 OpenGL編程技術(shù)來(lái)實(shí)現(xiàn)整個(gè)虛擬校園系統(tǒng)[6],校園三維場(chǎng)景的建模主要采用3ds max這個(gè)軟件,對(duì)建筑物表面紋理圖片的處理主要使用Photoshop這個(gè)軟件。
虛擬校園開(kāi)發(fā)系統(tǒng)的總體構(gòu)建如圖1所示。
根據(jù)虛擬校園的總體構(gòu)建圖,將虛擬校園的功能分為設(shè)計(jì)界面、輸入數(shù)據(jù)、建立模型和交互系統(tǒng)四大模塊。如圖2所示。
圖1 系統(tǒng)開(kāi)發(fā)的總體構(gòu)建圖Fig.1 The overall structure of system development
圖2 虛擬校園系統(tǒng)的功能模塊圖Fig.2 Functional module diagram of virtual campus system
在該系統(tǒng)中幾何建模的主要數(shù)據(jù)來(lái)自設(shè)計(jì)圖紙和實(shí)際測(cè)量的數(shù)據(jù)。圖片主要來(lái)自數(shù)碼相機(jī)對(duì)一些標(biāo)志性建筑拍照得到的;紋理數(shù)據(jù)通過(guò)數(shù)碼相片及素材庫(kù)中的圖片經(jīng)過(guò)處理得到的。針對(duì)結(jié)構(gòu)外觀比較簡(jiǎn)單的建筑采用 OpenGL直接建模[1],如果建筑物較復(fù)雜,首先把模型進(jìn)行拆分,拆成多個(gè)簡(jiǎn)單的模型,再進(jìn)行建模[7]。
采用OpenGL建模的方法是,對(duì)于建筑物的模型首先建立如下所示的統(tǒng)一的數(shù)據(jù)結(jié)構(gòu):
typedef struct Object_Type
{
int nObject_Type;int nNumPoint;
float dWidth_Direct;
float dHeights;
Point3DArray points;
}Object;
在OpenGL中墻面由面片來(lái)組成,首先根據(jù)攝影測(cè)量工具對(duì)墻面所收集的頂點(diǎn)進(jìn)行處理,即把所有的頂點(diǎn)依次連接成一系列的四邊形。具體生成的面片圖3所示。
對(duì)于建筑物頂部的建模,可以通過(guò)其所有的頂點(diǎn)坐標(biāo)生成。通常校園建筑物頂部都是平頂建筑,所以其模型能看作是頂部與墻面的組合[9]。這樣就把一個(gè)復(fù)雜的建筑物簡(jiǎn)單化了。
還有校園中如果有如階梯教室、實(shí)習(xí)實(shí)訓(xùn)場(chǎng)所等復(fù)雜的建筑物,可以根據(jù)這些建筑物外在的特點(diǎn)對(duì)其進(jìn)行分解,分成若干形態(tài)簡(jiǎn)單的幾何體,然后在定義這些幾何體的數(shù)據(jù)模型[4]。
通常對(duì)于建筑物表面材質(zhì)和顏色采用紋理映射的方法進(jìn)行建模。具體的實(shí)現(xiàn)方法是:通過(guò)采集加工把建筑物上各個(gè)面的紋理數(shù)據(jù)轉(zhuǎn)換成圖形圖像格式,在繪制每個(gè)面時(shí)在分別對(duì)每個(gè)面進(jìn)行紋理映射。通過(guò)紋理映射得到的場(chǎng)景對(duì)象仿真度高,而且栩栩如生。下面的校園景觀圖4就是通過(guò)紋理映射得到的。
圖3 墻面四邊形結(jié)構(gòu)圖Fig.3 Wall quadrilateral structure
圖4 紋理映射后的景觀Fig.4 Texture-mapped landscape
(1)通過(guò)鍵盤(pán)鼠標(biāo)獲取
用戶(hù)通過(guò)鍵盤(pán)的上下左右鍵來(lái)完成相應(yīng)的動(dòng)作控制。每次完成一個(gè)動(dòng)作按鍵系統(tǒng)就會(huì)產(chǎn)生一個(gè)事件,在系統(tǒng)中控制場(chǎng)景的變換主要是通過(guò)用戶(hù)先點(diǎn)擊相應(yīng)的按鍵,然后系統(tǒng)程序把這個(gè)動(dòng)作轉(zhuǎn)換為控制命令,最后實(shí)現(xiàn)虛擬場(chǎng)景的變換。
在三維虛擬場(chǎng)景中大部分操作是由鼠標(biāo)來(lái)完成的,如:三維場(chǎng)景的視角、旋轉(zhuǎn)及定位等操作。所以在三維校園系統(tǒng)中實(shí)現(xiàn)用戶(hù)的動(dòng)作輸入時(shí)常常是鍵盤(pán)鼠標(biāo)配合起來(lái)使用共同來(lái)完成用戶(hù)的操作。
(2)漫游的控制
在虛擬漫游系統(tǒng)中如果用戶(hù)的視角發(fā)生改變時(shí),場(chǎng)景中的對(duì)象也發(fā)生了相應(yīng)的改變。這樣就需要通過(guò)下面的方法來(lái)實(shí)現(xiàn):一是通過(guò)場(chǎng)景中改變?nèi)S對(duì)象的坐標(biāo)來(lái)完成,二是通過(guò)三維場(chǎng)景視點(diǎn)的變換來(lái)完成場(chǎng)景的改變。這種方法是通過(guò)對(duì)用戶(hù)視點(diǎn)的變換來(lái)完成場(chǎng)景中對(duì)象的重新繪制。
當(dāng)場(chǎng)景的建模完成后,通常要選擇一個(gè)合適的視角作為觀察點(diǎn),或者來(lái)回不停地變換視角,來(lái)對(duì)場(chǎng)景進(jìn)行觀察。OpenGL中專(zhuān)門(mén)提供了函數(shù)gluLookAt( )用于視點(diǎn)的變換[10]。
void gluLookAt(GLdouble eyex,GLdouble eyey,
GLdouble eyez,
GLdouble centerx, GLdouble centery,
GLdouble centerz,
GLdouble upx, GLdouble upy, GLdouble
upz);
其中:eyex,eyez,eyez是指定視點(diǎn)位置
Centerx,centerz,centery指定參考點(diǎn)位置
Upx, upy,upz,指定視口向上的方向
具體如圖5所示。
圖5 函數(shù)gluLookAt()的坐標(biāo)系Fig.5 Coordinates of the function glulookat
在虛擬校園漫游系統(tǒng)中人所處的位置的坐標(biāo)方向始終向上,其中視點(diǎn)坐標(biāo)的方向即向量坐標(biāo)(upx,upy,upz)固定為(0.0f,1.0f,0.0f),然后通過(guò)鍵盤(pán)鼠標(biāo)的操作,即提前設(shè)定一個(gè)變量然后通過(guò)鍵盤(pán)來(lái)調(diào)整速度,通過(guò)鼠標(biāo)操作來(lái)確定相關(guān)的位移量。利用三維幾何學(xué)知識(shí)計(jì)算出參考點(diǎn)與人眼之間的變化,最后通過(guò)函數(shù)gluLookAt()自動(dòng)生成相應(yīng)的三維場(chǎng)景。
所謂動(dòng)態(tài)漫游指用戶(hù)在下圖的三維正交投影圖上點(diǎn)擊,選定一條路線(xiàn)來(lái)實(shí)現(xiàn)場(chǎng)景漫游。
圖6 三維正交投影示意圖Fig.6 Three-dimensional orthogonal projection diagram
在三維校園場(chǎng)景中,通過(guò)點(diǎn)擊鼠標(biāo)確定一條路線(xiàn),系統(tǒng)會(huì)自動(dòng)獲取點(diǎn)擊點(diǎn)的坐標(biāo),然后計(jì)算出這條路線(xiàn)視點(diǎn)參數(shù)、目標(biāo)點(diǎn)參數(shù),然后把這些參數(shù)帶入函數(shù)gluLookAt()中,來(lái)回地繪制場(chǎng)景,這樣就完成了三維場(chǎng)景的路線(xiàn)漫游。在Windows下編程時(shí),用計(jì)時(shí)器來(lái)實(shí)現(xiàn)時(shí)間間隔。在編程環(huán)境下創(chuàng)建一個(gè)計(jì)時(shí)器,該計(jì)時(shí)器就隔一定時(shí)間通知Windows向窗口發(fā)送信息,Windows通過(guò)響應(yīng)這個(gè)信息就能以一定的時(shí)間間隔來(lái)完成任務(wù)。
在本文中實(shí)現(xiàn)碰撞檢測(cè)采用的是層次包圍盒法,這種方法的具體做法是:首先給場(chǎng)景中的對(duì)象建立方體包圍盒,屬性參數(shù)設(shè)置為隱藏;然后在用戶(hù)指定路線(xiàn)上的模型時(shí)給每個(gè)對(duì)象添加包圍盒,最后在場(chǎng)景中進(jìn)行漫游時(shí)添加碰撞檢測(cè)。實(shí)現(xiàn)碰撞檢測(cè)的具體流程圖如下。
圖7 碰撞檢測(cè)的流程圖Fig.7 Flow chart of collision detection
根據(jù)上面的流程圖,首先為每個(gè)模型定義包圍盒,包圍盒其實(shí)就是一個(gè)正六面體,其屬性參數(shù)設(shè)為隱藏,具體碰撞檢測(cè)的初始化代碼如下:
stuct OBJPOSI
{
float x, h, z;
float sizew;
float sizel;
float sizeh;
float showscale;
int objnum;
float angle;
};
其中 float x,h,z設(shè)對(duì)象的位置;float sizew設(shè)置包圍盒的寬,float sizel設(shè)置包圍盒的長(zhǎng),float sizeh設(shè)置包圍盒高;float showscale設(shè)置對(duì)象的縮放倍數(shù);float angle設(shè)置對(duì)象的角度。
碰撞檢測(cè)時(shí)首先判斷這兩個(gè)對(duì)象的包圍盒是否發(fā)生了碰撞這樣做不僅程序簡(jiǎn)單,而且計(jì)算準(zhǔn)確。
通過(guò)上面的研究工作,為了達(dá)到與周?chē)h(huán)境的交互效果,還需要增加數(shù)據(jù)庫(kù)的功能,即把三維校園中的對(duì)象都收入到數(shù)據(jù)庫(kù)中,當(dāng)用戶(hù)任意選擇建筑物時(shí),選擇到的建筑物為參數(shù)可以到數(shù)據(jù)庫(kù)中查找,并將建筑物的名稱(chēng)及面積實(shí)時(shí)地顯示在桌面上。具體實(shí)現(xiàn)過(guò)程是:首先獲取用戶(hù)點(diǎn)擊對(duì)象的名稱(chēng);然后在數(shù)據(jù)庫(kù)中根據(jù)對(duì)象的名稱(chēng)查找相關(guān)的信息;最后將信息輸出到桌面上。
由于這個(gè)三維場(chǎng)景的數(shù)據(jù)量不太,選擇Access數(shù)據(jù)庫(kù)就可以了。首先編寫(xiě)dll文件實(shí)現(xiàn)必要的函數(shù)接口。
boolg_open_db(); //初始化數(shù)據(jù)庫(kù)
voidg_get_value(const char*valuename, const
char*id, const char*value);
//設(shè)置數(shù)據(jù)標(biāo)注的腳本
支持
boolg_close_db(); //關(guān)閉數(shù)據(jù)庫(kù)
這樣數(shù)據(jù)庫(kù)中的信息可以隨時(shí)隨軍地更新,這樣用戶(hù)在交互式漫游時(shí),可以隨意點(diǎn)擊觸發(fā),同時(shí)對(duì)于場(chǎng)景中出現(xiàn)的建筑物通過(guò)數(shù)據(jù)庫(kù)查找更加詳細(xì)的信息。
為了實(shí)現(xiàn)能在虛擬場(chǎng)景中漫游,而且與周?chē)鷪?chǎng)景發(fā)生交互,產(chǎn)生身臨其境的感覺(jué)。需要在場(chǎng)景中添加背景音樂(lè)增強(qiáng)場(chǎng)景的沉浸感,首先選擇一個(gè)適合場(chǎng)景的音樂(lè)作為背景音樂(lè),這時(shí)需要應(yīng)用腳本編輯器,在數(shù)據(jù)庫(kù)函數(shù)類(lèi)型中創(chuàng)建函數(shù)的初始化,然后添加背景音樂(lè)腳本,并插入語(yǔ)句設(shè)置其相關(guān)屬性[8]。
經(jīng)過(guò)以上過(guò)程的創(chuàng)建包括創(chuàng)建三維場(chǎng)景的構(gòu)造、自然現(xiàn)象的模擬、數(shù)據(jù)庫(kù)的設(shè)計(jì)、交互場(chǎng)景的構(gòu)造及碰撞檢測(cè)的實(shí)現(xiàn)等工作的完成,校園虛擬漫游系統(tǒng)的開(kāi)發(fā)基本完成,其實(shí)現(xiàn)的效果圖如圖8所示。
圖8 校園虛擬系統(tǒng)效果圖Fig.8 Virtual system on campus
高職院校作為以職業(yè)技能為主,我們需要的不是高科技,而是更為先進(jìn)的理念和創(chuàng)新?;ヂ?lián)網(wǎng)高速發(fā)展正在改變著人們的生活,虛擬現(xiàn)實(shí)技術(shù)正把越來(lái)越多的網(wǎng)上場(chǎng)景改造成真正的 3D場(chǎng)景,所以虛擬現(xiàn)實(shí)的明天在網(wǎng)絡(luò),網(wǎng)絡(luò)的明天在虛擬現(xiàn)實(shí)。本系統(tǒng)可以推廣到其它的虛擬系統(tǒng)應(yīng)用和實(shí)現(xiàn)中,如“虛擬城市、虛擬小區(qū)”的研究和實(shí)現(xiàn)中。