【摘 要】本文以廣西理工職業(yè)技術(shù)學(xué)院為例,論述三維虛擬校園建設(shè)和漫游的設(shè)計(jì)與實(shí)現(xiàn),提出通過谷歌地球獲取校園整體地形地貌,采用Photoshop對(duì)實(shí)拍圖片進(jìn)行處理,利用3DsMAX作為建模工具創(chuàng)建教學(xué)樓、辦公樓、宿舍、綜合樓等,運(yùn)用Unity3D制作校園地形并實(shí)現(xiàn)第一人稱校園漫游的交互制作,其逼真的校園環(huán)境模擬和良好的交互性給用戶身臨其境的漫游體驗(yàn)感。
【關(guān)鍵詞】虛擬校園 第一人稱虛擬漫游 3DSMAX Unity3D
【中圖分類號(hào)】G 【文獻(xiàn)標(biāo)識(shí)碼】A
【文章編號(hào)】0450-9889(2018)06C-0187-04
近年來,虛擬現(xiàn)實(shí)技術(shù)發(fā)展迅猛,它作為一個(gè)體驗(yàn)平臺(tái)和設(shè)計(jì)工具的共同體,通過計(jì)算機(jī)融合多源信息、交互式的三維動(dòng)態(tài)視景和實(shí)體,創(chuàng)造出一個(gè)讓用戶“身處其中”的模擬環(huán)境,使用戶足不出戶就能獲得“身臨其境”的體驗(yàn)感。三維虛擬校園漫游是通過對(duì)校園環(huán)境、建筑物、基礎(chǔ)設(shè)施等的仿真,以漫游的形式再現(xiàn)一個(gè)三維可視化的、有聲有色的虛擬校園,它基于虛擬現(xiàn)實(shí)技術(shù),以真實(shí)校園為藍(lán)本,通過三維實(shí)景模擬的方式構(gòu)建一個(gè)逼真的三維虛擬立體校園空間,實(shí)現(xiàn)了第一人稱的自主漫游,體現(xiàn)了環(huán)境的藝術(shù)性與真實(shí)性,使得學(xué)生和家長(zhǎng)能夠提前了解校園教學(xué)和生活環(huán)境,提高學(xué)校的形象和聲譽(yù),拓展了學(xué)校對(duì)外宣傳、招生、校容校貌展示水平,提升了學(xué)校文化建設(shè)的對(duì)外影響力和知名度,使得學(xué)校在日益激烈的高職生源競(jìng)爭(zhēng)中脫穎而出。本文以廣西理工職業(yè)技術(shù)學(xué)院的三維虛擬校園漫游為例,通過3DsMAX進(jìn)行建模和貼圖,使用Unity3D平臺(tái)制作校園地形,結(jié)合C#語言實(shí)現(xiàn)對(duì)三維虛擬校園第一人稱漫游的交互控制。
一、三維虛擬校園漫游開發(fā)流程與設(shè)計(jì)
(一)三維虛擬校園漫游開發(fā)流程。三維虛擬校園漫游的實(shí)現(xiàn)主要分為三大部分:數(shù)據(jù)采集、模型構(gòu)建、第一人稱漫游制作。
1.數(shù)據(jù)采集。從谷歌地球獲取校園平面布局圖,為校園地形環(huán)境的制作、道路設(shè)置、建筑物布局提供依據(jù);從學(xué)院后勤獲取各樓棟CAD設(shè)計(jì)圖,為校園建筑建模提供數(shù)據(jù);拍攝校園中各建筑物細(xì)節(jié)圖,拍攝草坪、花圃、林地、天鵝湖、道路等校園環(huán)境景觀,現(xiàn)場(chǎng)測(cè)量門窗等獲取實(shí)景數(shù)據(jù)信息,為后期制作高仿真虛擬校園提供參考。
2.模型構(gòu)建。包括模型創(chuàng)建、優(yōu)化及紋理貼圖處理三個(gè)方面。導(dǎo)入處理好的CAD圖,使用3DMAX軟件創(chuàng)建校園各建筑物模型;刪除建筑物模型中的不可見面,對(duì)同一個(gè)面中多余的線和點(diǎn)進(jìn)行移除,優(yōu)化模型;使用Photoshop軟件裁剪圖片、處理貼圖和繪制建筑物紋理等;依據(jù)校園平面圖,使用Unity3D軟件制作校園地形、道路等。
3.第一人稱漫游制作。使用Unity3D軟件進(jìn)行登錄界面設(shè)計(jì)、場(chǎng)景組建、碰撞設(shè)計(jì)、第一人稱設(shè)計(jì)、漫游設(shè)計(jì)、交互設(shè)計(jì)等。
具體流程如圖1所示。
(二)三維虛擬校園漫游設(shè)計(jì)。三維虛擬校園漫游的設(shè)計(jì)目標(biāo)是使用戶在交互的過程中進(jìn)行視覺、聽覺、觸覺的觸碰,足不出戶就能感受到濃烈的校園氣氛,獲得身臨其境的體驗(yàn)。因此,我們將從以下幾個(gè)方面對(duì)三維虛擬校園漫游進(jìn)行設(shè)計(jì)。
1.資源優(yōu)化。為了避免場(chǎng)景過大而增加網(wǎng)絡(luò)環(huán)境和設(shè)備的負(fù)擔(dān),本文所有建筑模型在主場(chǎng)景漫游時(shí)均以只顯示建筑物外觀的形式展現(xiàn),并通過跳轉(zhuǎn)方式進(jìn)入建筑物內(nèi)部漫游,解決了主場(chǎng)景載入時(shí)負(fù)擔(dān)過大的問題,使得可以通過網(wǎng)絡(luò)訪問和瀏覽。
2.三維虛擬校園的展示。校園地形、建筑物等均以外觀95%相似度的精細(xì)模型展示,與真實(shí)校園環(huán)境基本吻合。
3.三維虛擬校園漫游。用戶可以通過鼠標(biāo)、鍵盤在虛擬校園內(nèi)自由游覽,并通過小地圖了解用戶在虛擬校園中的位置。
4.多媒體展示。用戶在進(jìn)入建筑物內(nèi)部巡游時(shí),可通過點(diǎn)播視頻、音頻的方式了解該建筑物主要功能及相關(guān)宣傳資料,增強(qiáng)體驗(yàn)感。
二、三維虛擬校園漫游的實(shí)現(xiàn)
(一)三維虛擬校園模型的構(gòu)建。三維虛擬校園模型主要包括大門、教學(xué)樓、宿舍樓、運(yùn)動(dòng)場(chǎng)、路燈、花草樹木、人工湖、道路、地形模型等,可歸為建筑模型、環(huán)境模型、地表模型三大類。
建筑模型的構(gòu)建,首先根據(jù)學(xué)院后勤處提供CAD圖在3DMAX中繪制建筑物二維圖形輪廓,再將其擠出、轉(zhuǎn)換為可編輯多邊形,然后對(duì)該可編輯多邊形進(jìn)行擠出、倒角、橋、調(diào)整頂點(diǎn)等操作得到三維建筑物模型,最后對(duì)建筑物模型進(jìn)行優(yōu)化處理,通過減面、移除多余的邊和頂點(diǎn)、壓縮材質(zhì)貼圖和對(duì)建筑物表面的細(xì)節(jié)如外墻瓷磚、門窗、裝飾物等以紋理貼圖代替等方法達(dá)到優(yōu)化和減少模型所占內(nèi)存空間的目的。
三維虛擬校園的環(huán)境模型中包含大量的花草樹木,為了減少場(chǎng)景所占內(nèi)存空間,樹木均采用十字交叉面制作,花圃花卉采用立面體添加透明貼圖制作,草坪等植被則使用紋理映射的方法。
構(gòu)建地表模型,需要將從谷歌地球上獲取的校園地形圖在CAD上進(jìn)行處理,使用Unity3D的地形(Terrain)繪制高地、人工湖、山坡、平地、道路等,創(chuàng)建出廣西理工職業(yè)技術(shù)學(xué)院校園依山而建的地貌形態(tài)。
(二)場(chǎng)景構(gòu)建。場(chǎng)景的構(gòu)建包括登錄界面制作、模型載入、燈光設(shè)置、小地圖制作等。登錄界面以廣西理工職業(yè)技術(shù)學(xué)院正門照片作為背景,使用Unity3D軟件中UI的Text和Button制作標(biāo)題和按鈕,如圖2所示。
主場(chǎng)景則是將所有在3DsMAX創(chuàng)建的模型導(dǎo)入到Unity3D系統(tǒng)中并擺放到相應(yīng)的位置,調(diào)整大小和方向,在每個(gè)有宣傳展示功能的建筑物邊上設(shè)置進(jìn)入建筑物的引導(dǎo)按鈕,使得能夠跳轉(zhuǎn)進(jìn)入建筑物內(nèi)部漫游和瀏覽。
為了使得場(chǎng)景看起來更逼真,需要為場(chǎng)景進(jìn)行布光設(shè)置,使用Directional Light方向光充當(dāng)太陽光,在需要的地方適當(dāng)添加Point Light點(diǎn)光源以增強(qiáng)效果。設(shè)置主角外的所有模型為Static靜態(tài)模式,使用Lightmapping技術(shù)將光線效果預(yù)渲染成為貼圖模擬物體上的光影效果,減少光影對(duì)性能的開銷。添加天空盒子skybox,使得虛擬校園更美觀。
小地圖的制作需要添加新的攝像機(jī)作為小地圖專用攝像機(jī),從上往下垂直拍攝校園道路層。創(chuàng)建一個(gè)球體,去掉其Sphere Collider屬性,放置在第一人稱膠囊體的層級(jí)之下作為第一人稱的替代體,跟隨主攝像機(jī)移動(dòng)并在小地圖中顯示出來。保持小地圖視圖是正方形的攝像機(jī)主要代碼為:
float px=(float)Screen.width/(float)Screen.height;//獲取分辨率比例
this.camera.rect=new Rect((1-0.2f),(1-0.2f*px),0.2f,0.2f*px);//保持?jǐn)z像機(jī)視圖為正方形
(三)第一人稱漫游設(shè)計(jì)與實(shí)現(xiàn)。本部分主要分為第一人稱移動(dòng)控制、場(chǎng)景切換設(shè)置、媒體播放設(shè)置三個(gè)部分。
1.第一人稱移動(dòng)控制。首先,選中場(chǎng)景中的所有物體,為它們添加Mesh Collider多邊形碰撞組件設(shè)置為不可穿越的對(duì)象,取消Is Trigger屬性使其僅作為觸發(fā)器使用。使用Cretate Empty創(chuàng)建空游戲體作為第一人稱的替代體,為其添加Character Controller角色控制器組件使其變?yōu)槟z囊體以模擬人體的大致形狀。為膠囊體添加Rigidbody剛體組件,使其在移動(dòng)的過程中與環(huán)境產(chǎn)生碰撞交互,避免發(fā)生穿墻撞樹的行為。使用鍵盤、鼠標(biāo)控制攝像機(jī)跟隨第一人稱移動(dòng)的代碼分別如下。
(1)使用鍵盤WSAD鍵控制第一人稱替代體移動(dòng)的C#腳本代碼。
void Control() {
//獲取鼠標(biāo)移動(dòng)距離
float m_h=Input.GetAxis(“Mouse X”);
float m_v=Input.GetAxis(“Mouse Y”);
//旋轉(zhuǎn)攝像機(jī)
m_camRot.x-=m_v;
m_camRot.y+=m_h;
m_camTransform.eulerAngles=m_camRot;
//使主角的面向方向與攝像機(jī)一致
Vector3 camrot=m_camTransform.eulerAngles;
camrot.x=0; camrot.z=0;
m_transform.eulerAngles=camrot;
if (Input.GetKey(KeyCode.W))
{ m_Transform.Translate(Vector3.forward * 0.1f, Space.Self); }
if (Input.GetKey(KeyCode.S))
{ m_Transform.Translate(Vector3.back * 0.1f, Space.Self); }
if (Input.GetKey(KeyCode.A))
{ m_Transform.Translate(Vector3.left * 0.1f, Space.Self); }
if (Input.GetKey(KeyCode.D))
{ m_Transform.Translate(Vector3.right * 0.1f, Space.Self); }
}
(2)使用鼠標(biāo)控制第一人稱替代體移動(dòng)的C#代碼。
protected Transform m_transform;
protected Vector3 targetPos;//目標(biāo)位置
void Start() {
m_transform = this.transform;
targetPos = this.m_transform.position; }
void MoveTo() {
if (Input.GetMouseButton(0))
{ Vector3 mousePos = Input.mousePosition; //獲得鼠標(biāo)屏幕位置
Ray ray = Camera.main.ScreenPointToRay(mousePos); //將屏幕位置轉(zhuǎn)為射線
RaycastHit hitInfo; //用來記錄射線碰撞記錄
bool isCast = Physics.Raycast(ray, out hitInfo, 1000, inputMask); //產(chǎn)生射線
if (isCast) {
targetPos = hitInfo.point; //如果射中目標(biāo),記錄射線碰撞點(diǎn)
}
}
//使用Vector3提供的MoveTowards函數(shù),獲得朝目標(biāo)移動(dòng)的位置
Vector3 pos = Vector3.MoveTowards(this.m_transform.position, targetPos, speed * Time.deltaTime);
this.m_transform.position = pos; //更新當(dāng)前位置
}
2.場(chǎng)景切換設(shè)置。為了減少虛擬校園主場(chǎng)景載入負(fù)擔(dān),本次設(shè)計(jì)將進(jìn)入建筑物內(nèi)部的漫游采用場(chǎng)景跳轉(zhuǎn)切換的方式進(jìn)行,在相應(yīng)的建筑物邊上加入U(xiǎn)I控件Button設(shè)置進(jìn)入內(nèi)部漫游指示牌,使用代碼Application.LoadLevel(“scence_n”);跳轉(zhuǎn)切換場(chǎng)景。
3.媒體播放設(shè)置。在游覽時(shí)播放相應(yīng)的音樂,可以增加漫游的趣味性。在主場(chǎng)景中為地面或主攝像機(jī)添加audio source組件,在其屬性面板的AudioClip項(xiàng)中添加背景音樂文件,保持play on Awake和Loop選項(xiàng)的選擇以保證在運(yùn)行場(chǎng)景時(shí)循環(huán)播放音樂即可實(shí)現(xiàn)背景音樂的添加。
當(dāng)進(jìn)入建筑物內(nèi)部瀏覽時(shí),可以選擇播放相關(guān)的講解音頻或宣傳視頻,增強(qiáng)宣傳效果。添加講解音頻主要代碼如下:
public AudioClip audioClip; //定義聲音文件
private AudioSource m_audioSource; //定義聲音源
void Awake() {
m_audioSource = this.gameObject.AddComponent
m_audioSource.loop = true; //設(shè)置聲音的循環(huán)播放
m_audioSource.volume = 1.0f; //設(shè)置最大音量值
m_audioSource.clip = audioClip;
}
void OnGUI() {
if(GUI.Button(new Rect(10, 10, 80, 30),"播放")) {
m_audioSource.Play(); }
if(GUI.Button(new Rect(10,50,80,30),"停止")) {
m_audioSource.Stop(); }
}
目前比較流行的視頻播放方式有兩種,一種是直接在場(chǎng)景的物體上播放,另一種是在GUI層面上播放。不管哪一種視頻播放方式,其主要代碼如下:
public MovieTexture m_movTexture; //定義視頻紋理
void Start () {
……
M_movTexture.loop = true; //設(shè)置視頻紋理的播放方式為循環(huán)播放
}
void OnGUI(){
if (GUILayout.Button ("播放")) {
if(!m_movTexture.isPlaying)
m_movTexture.Play(); }
if (GUILayout.Button ("停止"))
m_movTexture.Stop ();
}
三、測(cè)試與分析
在完成所有功能后運(yùn)行場(chǎng)景測(cè)試其流暢性,觀察模型、貼圖與實(shí)際是否相符等,修改并重復(fù)測(cè)試,最后導(dǎo)出為EXE格式。測(cè)試證明,采用上述的設(shè)計(jì)理念和方法實(shí)現(xiàn)了基于3DSMAX和Unity3D的三維虛擬校園漫游,其運(yùn)行流暢、逼真程度高、交互性強(qiáng),能夠滿足不同用戶的需求。
總之,本次漫游設(shè)計(jì)使用了AutoCAD、Photoshop、3DMAX、Unity3D等軟件,以廣西理工職業(yè)技術(shù)學(xué)院實(shí)景校園為藍(lán)本進(jìn)行了設(shè)計(jì)和制作,實(shí)現(xiàn)了三維虛擬校園的漫游。在后續(xù)還可對(duì)漫游設(shè)計(jì)進(jìn)行二次開發(fā),加入更多元素以豐富虛擬校園漫游,使漫游更真實(shí);同時(shí)開發(fā)適用于多平臺(tái)的版本,以增強(qiáng)對(duì)外宣傳的效果。
【參考文獻(xiàn)】
[1]王彩玲,劉瑞香,宋釗.基于Unity3D的虛擬校園漫游的設(shè)計(jì)與實(shí)現(xiàn)[J].科技視界,2015(5)
[2]郭仁春,霍西寶,玉錦宏,等.基于3DMAX及Unity3D技術(shù)實(shí)現(xiàn)數(shù)字化虛擬校園的網(wǎng)絡(luò)建設(shè)[J].信息系統(tǒng)工程,2017(5)
[3]劉發(fā)久.基于Unity3D的虛擬校園[J].電子設(shè)計(jì)工程,2016(6)
[4]李吉鋒.基于3DS MAX及UNITY 3D的虛擬校園系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].廈門:華僑大學(xué),2016
[5]董春俠,司占軍.基于Unity3D的虛擬校園App設(shè)計(jì)與開發(fā)[J].軟件導(dǎo)刊,2017(2)
[6]王星捷,李春花.基于Unity3D平臺(tái)的三維虛擬城市研究與應(yīng)用[J].計(jì)算機(jī)技術(shù)與發(fā)展,2013(4)
【作者簡(jiǎn)介】蒙秋瓊(1984— ),廣西理工職業(yè)技術(shù)學(xué)院計(jì)算機(jī)應(yīng)用專業(yè)教研室主任,講師。
(責(zé)編 盧 雯)