張繼超,馬洋洋,董塞漠
(1.遼寧工程技術(shù)大學(xué) 測繪與地理科學(xué)學(xué)院,遼寧 阜新123000;2.中國伊斯蘭教協(xié)會,北京100053)
隨著虛擬現(xiàn)實技術(shù)的發(fā)展和“數(shù)字地球”概念的提出與廣泛實踐,對三維虛擬校園的構(gòu)建研究也越來越多。三維虛擬校園可提供校園的虛擬環(huán)境,讓人足不出戶就能實現(xiàn)對該場景的漫游與交互,從而達(dá)到身臨其境的主觀感受。
Direct X自從1995年出現(xiàn)以來,己成為目前計算機(jī)領(lǐng)域中最廣泛的3D標(biāo)準(zhǔn)規(guī)范,在眾多3D開發(fā)領(lǐng)域得以應(yīng)用。而C#開發(fā)語言,不僅能夠?qū)崿F(xiàn)對Direct X自身強(qiáng)大的渲染功能的調(diào)用,而且能將操作者的意圖運用圖像界面流暢地表現(xiàn)出來[1]。3DSMax是由Autodesk旗下的公司開發(fā)的三維建模和動畫制作軟件,具有強(qiáng)大、完美的三維建模功能,是當(dāng)今世界上最流行的三維建模、動畫制作及渲染軟件。本文利用 C#調(diào)用 Direct X[2-3],結(jié)合3DSMax建模工具,對三維虛擬校園的構(gòu)建方法進(jìn)行探討,并以遼寧工程技術(shù)大學(xué)(中華路校區(qū))為例,實現(xiàn)了三維虛擬校園的初步構(gòu)建。
三維模型是物體的三維多邊形表示,通常用計算機(jī)或者其它視頻設(shè)備進(jìn)行顯示。顯示的物體可以是現(xiàn)實世界的實體,也可以是虛構(gòu)的東西,既可以小到原子,也可以大到很大的尺寸。任何自然界存在的物體都可以用三維模型表示[4]。
三維模型廣泛用于任何使用三維圖形的地方。實際上,它們的應(yīng)用早于個人電腦上三維圖形的流行。許多計算機(jī)游戲使用預(yù)先渲染的三維模型圖像作為sprite用于實時計算機(jī)渲染
近年來,隨著數(shù)字城市的發(fā)展,三維模型也在地球科學(xué)領(lǐng)域得到廣泛應(yīng)用,如建立數(shù)字高程模型、三維地質(zhì)模型、數(shù)字小區(qū)、數(shù)字校園[6]等。
三維模型本身是不可見的,為增加模型的真實效果,常采用紋理映射或其他方法(如調(diào)整曲面法線、立體渲染等)來增強(qiáng)模型。
為了將真實世界的對象以三維模型的形式表達(dá)出來,需要將世界空間的對象先轉(zhuǎn)換為模型自身的空間坐標(biāo)系,然后利用攝像機(jī)空間展示顯示區(qū)域,其轉(zhuǎn)換過程如圖1所示。
圖1 三維坐標(biāo)轉(zhuǎn)換過程
攝像機(jī)空間轉(zhuǎn)換的過程需要3個參數(shù):即攝像機(jī)位置、目標(biāo)位置以及攝像機(jī)上下方向,這3個參數(shù)又稱為攝像機(jī)矩陣,都為空間向量[7]。在Direct X中可以通過這3個向量形成一個視圖矩陣。即以攝像機(jī)位置為起點、攝像機(jī)目標(biāo)位置為終點的單位向量作為攝像機(jī)空間的Z′軸坐標(biāo)(相對于世界空間),然后根據(jù)左手法則或右手法則計算出攝像機(jī)空間的X′軸坐標(biāo),最后計算出攝像機(jī)空間的Y′軸坐標(biāo)。所以視圖矩陣中保存攝像機(jī)空間X′,Y′,Z′軸坐標(biāo)在X,Y,Z方向上的分量,以及在攝像機(jī)空間中世界坐標(biāo)原點的位置,如圖2所示。
圖2 視圖矩陣
利用C#調(diào)用Direct X接口,完成場景的搭建、材質(zhì)燈光的導(dǎo)入、場景整體渲染、攝像機(jī)導(dǎo)入等功能。
1)新建項目并添加新建項。新建一個Visual C#空項目,設(shè)置其項目名稱,在解決方案資源管理器中選擇項目名稱并添加新建項。
2)添加窗體及引用。在 “添加新項”窗體上選擇“Windows窗體”模板,完成窗體添加,并在主菜單上選擇“項目—添加引用”,在.NET中添加Direct X和 Direct X.Direct3D(X)等組件,完成 Direct X的調(diào)用。
在全局中定義頂點變量,設(shè)置貼圖圖片上的水平和垂直位置的坐標(biāo)分別為Tu和Tv,其中貼圖坐標(biāo)(0,0)表示圖片左上角,貼圖坐標(biāo)(1,1)表示右下角。在全局中定義貼圖變量texture及材質(zhì)變量material,分別用于保存貼圖圖片對象和材質(zhì)對象,通過指定材質(zhì)類型可以設(shè)置三角形表面的反射等方式。將場景圖片文件復(fù)制到項目目錄下作為場景的底圖,并修改渲染函數(shù),導(dǎo)入貼圖和材質(zhì)函數(shù)的相關(guān)代碼,進(jìn)行渲染,然后以上述類似的方式繪制三角形,將兩三角形拼接到一起,構(gòu)建整個場景底圖。
調(diào)整三角形頂點坐標(biāo)及攝像機(jī)位置,然后修改攝像機(jī)函數(shù)Set Up Ca mera()中視圖矩陣的代碼,對攝像機(jī)進(jìn)行旋轉(zhuǎn)[8]。以圍繞Y軸選擇為例,首先在全局中定義旋轉(zhuǎn)角度及攝像機(jī)位置等變量,然后修改攝像機(jī)函數(shù),設(shè)置鍵盤輸入的Left和Right鍵來控制攝像機(jī)的左右旋轉(zhuǎn),并通過直接添加窗體的On Key Down()重載函數(shù)來實現(xiàn)。
值得注意的是,上述過程實現(xiàn)了攝像機(jī)左右旋轉(zhuǎn)的功能,但是這個旋轉(zhuǎn)是相對于世界坐標(biāo)系的Y軸,如果攝像機(jī)空間坐標(biāo)系的Y軸和世界坐標(biāo)系的Y軸不為同一個方向,這將導(dǎo)致旋轉(zhuǎn)功能無法完全實現(xiàn)。因此在定義旋轉(zhuǎn)軸時,應(yīng)以攝像機(jī)空間坐標(biāo)系的Y軸方向為旋轉(zhuǎn)軸。除了左右旋轉(zhuǎn)外,攝像機(jī)還應(yīng)具有上下旋轉(zhuǎn)來調(diào)整視角的功能,此時,其旋轉(zhuǎn)軸為攝像機(jī)空間坐標(biāo)系的X軸。
攝像機(jī)縮放的控制,可以通過設(shè)置攝像機(jī)位置的比例函數(shù)Scale()來實現(xiàn)。在窗體的 On-Key Down()重載函數(shù)中添加縮放攝像機(jī)代碼,并可設(shè)置鍵盤快捷鍵(如鍵盤加號(+ 表示放大、減號(-)表示縮?。┛刂茢z像機(jī)的放大和縮小操作。
通過Direct3D繪制的每個對象都是由三角形組成的,一個三角形由3個點組成,而每個點都定義成一個向量來指定點的X,Y,Z坐標(biāo)。所有基本體,主要是由長方體和球體組成[9]。對于任意一個六面體,其各頂點坐標(biāo)編號如圖3所示。
圖3 六面體頂點坐標(biāo)編號
通過繪制12個三角形即可形成圖3所示的六面體,將該六面體的頂部和底部面、四周的面進(jìn)行展開。值得注意的是,為了使頂面的法線向外(即頂點序號按順時針排列),對于底部的面采用序號反向使得繪制的三角形可見。其結(jié)果如圖4所示。
圖4 立方體繪制結(jié)果
在Direct X中,幾何模型對象基本上都是通過Mesh來表示,它也是組成三維場景的基本元素之一。Mesh類具有一個Clone()方法用于復(fù)制網(wǎng)格對象至另外一個網(wǎng)格對象中,修改全局變量、初始化函數(shù)及渲染函數(shù)的相關(guān)代碼,復(fù)制長方體,將之前建立的場景與幾何體結(jié)合到一起,合并相關(guān)代碼,進(jìn)行整體三維場景的搭建[9]。將相關(guān)幾何體進(jìn)行材質(zhì)貼圖,使其變成完整樓體。
Direct X雖然可實現(xiàn)用戶交互功能,運用鼠標(biāo)與鍵盤的輸入,多角度觀測整體場景,但該軟件的精度不高,對三維模型細(xì)節(jié)的渲染不夠完善。因此,本文應(yīng)用3DSMax軟件對部分三維模型進(jìn)行制作及渲染。
建模過程包括:三角網(wǎng)搭建、元素的對齊、線條的擠出、布爾運算、圖形的縮放、空間坐標(biāo)的選定、材質(zhì)編輯以及渲染參數(shù)的設(shè)定等。
下面以致遠(yuǎn)樓為例,闡述3DSMax模型的構(gòu)建過程。
1)繪制長方體,并設(shè)置其長、寬、高及材質(zhì),作為部分樓體輪廓,如圖5所示。
圖5 樓體輪廓
2)建立指定長方體,與樓體輪廓相交,運用布爾運算、復(fù)制陣列等,對樓體輪廓進(jìn)行摳圖,作為門窗的位置。
3)制作門窗,運用多個尺寸不同的長方體,按固定位置進(jìn)行擺放,作為窗框、門框和玻璃,然后找到相關(guān)元素的材質(zhì)參數(shù),編輯材質(zhì),如圖6所示。
圖6 窗戶制作
4)以同樣的方式制作樓體輪廓的中心部分。運用鏡像功能將樓體輪廓的右側(cè)部分鏡像并作為樓體的左側(cè)部分,最后運用3DS的“倒角”和“擠出”功能,制作樓體的頂部及側(cè)面元素并設(shè)置材質(zhì),如圖7所示。
圖7 鏡像后模型
5)將所有制作完成的模型進(jìn)行拼接,增加天光,設(shè)置高級照明參數(shù)并進(jìn)行映射紋理,對模型進(jìn)行渲染,如圖8所示。
圖8 渲染后“致遠(yuǎn)樓”模型
本文以遼寧工程技術(shù)大學(xué)(中華路校區(qū))為例,結(jié)合校園遙感影像圖和建筑物側(cè)面照片紋理數(shù)據(jù),進(jìn)行了三維虛擬校園的構(gòu)建。
將校園遙感影像文件復(fù)制到項目目錄下作為場景底圖,修改渲染函數(shù),導(dǎo)入貼圖和材質(zhì)函數(shù)的相關(guān)代碼,進(jìn)行渲染。然后,修改鼠標(biāo)控制相關(guān)代碼,得到校園3 D場景互動平臺,如圖9所示。
圖9 校園3D場景互動平臺
在3DSMax下,選擇具有普遍性、代表性以及真實場景的特殊性地物,完成典型地物要素的三維精確建模。主要包括:編輯地形、水泥地面及主要建筑物的導(dǎo)入、花壇的設(shè)計、草坪的渲染,并增加樹木、垃圾箱、路燈等地物,提高虛擬校園的視覺效果。部分效果如圖10所示。
本文基于C#調(diào)用Direct X,輔以3DSMax實現(xiàn)了三維虛擬校園的構(gòu)建,包括三維場景的搭建;樓體元素的構(gòu)建及導(dǎo)入;樓體貼圖函數(shù)的運用及場景圖的渲染;其他實體模型構(gòu)建與導(dǎo)入;燈光及材質(zhì)代碼的編寫;攝像機(jī)位置設(shè)置等。用戶能夠通過鼠標(biāo)鍵盤等設(shè)備輸入相關(guān)消息,并可以對三維場景進(jìn)行多角度操作,真正實現(xiàn)了系統(tǒng)的用戶交互功能。此外,通過3DMAX軟件制作的模型場景,補(bǔ)償了Direct X的表現(xiàn)效果,完善了三維虛擬校園的元素細(xì)節(jié),增加了真實感。
[1] 肖澤云.基于Visual C#的Direct X開發(fā)實例[M].宜昌:三峽大學(xué)出版社,2010.
[2] 吳昊.關(guān)于C++BUILDER語言的Direct X開發(fā)問題的研究[J].軟件導(dǎo)刊,2006,5(6):67-69.
[3] 李震宇.游戲開發(fā)之路——在C++Builder中進(jìn)行Direct X編程[J].電腦編程技巧與維護(hù),2000,6(3):72-86.
[4] 馬萍.三維虛擬校園立體場景的設(shè)計與實現(xiàn)[D].濟(jì)南:山東師范大學(xué),2013.
[5] 孫明杰,韓超.用C++6.0和Direct X實現(xiàn)太空射擊游戲引擎[J].科技廣場,2006,18(5):77-79.
[6] 王建敏,王凱,孟凡帥.校園三維景觀設(shè)計與實現(xiàn)[J],測繪工程,2011,20(3):62-64.
[7] 徐黎明.Visual C++下Direct3D坐標(biāo)變換的實現(xiàn) [J].軟件導(dǎo)刊,2008,7(2):77-79.
[8] LAH SAU MENG,KELVIN.Design and Development of a Peer-to-Peer Online Multiplayer Game Using Direct X and C#[A].TENCON 2004 IEEE Region 10 Conference,Singapore,2004:278-281.
[9] FENGHUA SHI.Visualization Modeling of Mine Road way based on Visual C#[J].Co mputer Society,2008,18(5):271-275.