摘 要: 以GPS、北斗等為主的室外導(dǎo)航系統(tǒng)的研究進(jìn)行得如火如荼,但是室內(nèi)導(dǎo)航的研究卻進(jìn)行得不如人意。以Unity3D為引擎,結(jié)合3DS MAX建模,開發(fā)室內(nèi)離線3D仿真尋路系統(tǒng)。該系統(tǒng)完全按照室內(nèi)樣貌建造模型,以最真實(shí)的虛擬場(chǎng)景還原室內(nèi)樣貌,供導(dǎo)航者更好地完成室內(nèi)尋路。最后介紹了場(chǎng)景優(yōu)化的方法,以便在PC、智能手機(jī)等平臺(tái)上使用。
關(guān)鍵詞: 仿真;室內(nèi)尋路;Unity3D;虛擬現(xiàn)實(shí)
0 引言
虛擬現(xiàn)實(shí)(Virtual Reality,VR)[1]是一項(xiàng)綜合集成技術(shù),涉及計(jì)算機(jī)圖形學(xué)、人機(jī)交互技術(shù)、傳感技術(shù)、人工智能等領(lǐng)域,它利用計(jì)算機(jī)生成逼真的三維視、聽、嗅覺等,使人作為參與者通過(guò)適當(dāng)裝置,自然地對(duì)虛擬世界有更完美的體驗(yàn)和交互作用。虛擬現(xiàn)實(shí)具有很好的交互性、沉浸性和想象性,這三個(gè)特性合稱為虛擬現(xiàn)實(shí)鐵三角,如圖1所示。
其中沉浸性是虛擬現(xiàn)實(shí)技術(shù)的最主要的特征。體驗(yàn)者在外部硬件的幫助下將表達(dá)傳遞到虛擬現(xiàn)實(shí)中,在虛擬現(xiàn)實(shí)中產(chǎn)生相應(yīng)反應(yīng),這些刺激能積極調(diào)動(dòng)體驗(yàn)者的感官系統(tǒng),從而讓體驗(yàn)者更易于沉浸虛擬世界,如圖2所示。
現(xiàn)如今人們?nèi)粘;顒?dòng)范圍主要還是在室內(nèi),且伴隨著我國(guó)建筑行業(yè)的快速發(fā)展,結(jié)構(gòu)復(fù)雜的巨型建筑如上海世貿(mào)大廈等逐漸進(jìn)入人們的日常生活,室內(nèi)尋路問題亟需解決。而近年來(lái)關(guān)于虛擬現(xiàn)實(shí)及Unity3D的研究越來(lái)越熱,通過(guò)建模并完成貼圖后導(dǎo)入U(xiǎn)nity3D,在Unity3D中完成腳本語(yǔ)言的編寫,從而實(shí)現(xiàn)交互及尋路系統(tǒng)。由于虛擬場(chǎng)景具有較強(qiáng)的真實(shí)性,尋路者在極具復(fù)雜的室內(nèi)環(huán)境中也能找到目標(biāo)位置。
1 概述
本文討論的是基于Unity3D[2]的室內(nèi)導(dǎo)航系統(tǒng),應(yīng)用到軟件工程思想,從需求入手,設(shè)計(jì)室內(nèi)尋路導(dǎo)航系統(tǒng)的各個(gè)功能模塊。由于室內(nèi)場(chǎng)景極其復(fù)雜,室內(nèi)導(dǎo)航系統(tǒng)的開發(fā)步驟如下:
?。?)數(shù)據(jù)采集:采用CAD圖紙和場(chǎng)景圖片,應(yīng)用Photoshop優(yōu)化場(chǎng)景圖片信息;
?。?)數(shù)據(jù)處理:結(jié)合3Dsmax建模應(yīng)用,在Mari中完成模型貼圖;
(3)開發(fā)應(yīng)用:將完成貼圖的模型導(dǎo)成.FBX格式后導(dǎo)入到Unity3D,在Unity3D中添加相機(jī)、燈光、碰撞體、尋路組件等,利用NGUI進(jìn)行尋路系統(tǒng)交互界面設(shè)計(jì)等完成場(chǎng)景交互,最終實(shí)現(xiàn)室內(nèi)自動(dòng)尋路系統(tǒng)。其中包括輸入目的地,以最優(yōu)算法實(shí)現(xiàn)最短路途,到達(dá)目的地,到達(dá)目的地后可以接著實(shí)現(xiàn)二次尋路;在尋路過(guò)程中遇到門、燈等組件,進(jìn)行碰撞檢測(cè),門、燈等自動(dòng)打開[3]。其制作流程如圖3所示。
2 室內(nèi)導(dǎo)航系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
2.1 前期工作
由于現(xiàn)代建筑其場(chǎng)景巨大室內(nèi)場(chǎng)景復(fù)雜,在建模前,要搜集完整的數(shù)據(jù),否則將會(huì)影響后續(xù)建模的進(jìn)展及模型的使用。對(duì)要建模的物體進(jìn)行照片采集并且利用PS處理,擁有一整套的從內(nèi)到外的照片,此照片不僅用來(lái)幫助建模還用來(lái)完成模型貼圖;將CAD圖紙導(dǎo)入AutoCAD軟件,刪除不需要的部分,并且添加上建模所需要的補(bǔ)測(cè)數(shù)據(jù),導(dǎo)出.DWG格式。
2.2 建模技術(shù)
將.DWG格式的文件導(dǎo)入3DSMAX[4],根據(jù)左視圖、頂視圖等將CAD文件按照其實(shí)際位置放好。選擇全部的CAD文件,使其凍結(jié),然后根據(jù)制作順序暫時(shí)隱藏其他不需要的CAD。建模過(guò)程中可以參照采集的圖片保證模型的真實(shí)性。為了保證打包出的軟件運(yùn)行流暢,在這里可以制作兩套模型,一套低模,一套高模,實(shí)現(xiàn)高模轉(zhuǎn)低模而低模擁有高模的效果。利用3DS MAX高效的建模技巧將模型建成之后,選擇UV展開,將模型展開UV,UV展開的好壞直接決定貼圖的效果,按照比例展開。將展好UV的模型導(dǎo)入Mari進(jìn)行貼圖繪制,而一個(gè)場(chǎng)景的逼真度往往由貼圖所決定,因此,在進(jìn)行貼圖繪制時(shí)統(tǒng)一采用1 024×1 024的照片進(jìn)行,且在Mari中進(jìn)行繪制時(shí)要細(xì)心。此時(shí),模型已經(jīng)建成,物體表面貼圖也已完成,導(dǎo)出.FBX文件。
2.3 Unity3D場(chǎng)景搭建技術(shù)
在Unity3D中實(shí)現(xiàn)尋路系統(tǒng)[5],由于本文討論的是在離線狀況下實(shí)現(xiàn)室內(nèi)導(dǎo)航,而現(xiàn)在的建筑物往往有多個(gè)入口,因此需要選擇建筑物入口。此時(shí)進(jìn)入交互界面,輸入需要導(dǎo)航的目標(biāo)點(diǎn),通過(guò)Find尋找該點(diǎn)是否存在,如果存在虛擬人物就會(huì)根據(jù)最優(yōu)路徑自動(dòng)到達(dá),尋路結(jié)束,提醒是否再次尋路。場(chǎng)景制作流程如圖4所示。
2.3.1 尋路組件
使用Unity實(shí)現(xiàn)室內(nèi)自動(dòng)尋路,其有多種方式。第一種比較傳統(tǒng)的是使用A*尋路,它是一種比較傳統(tǒng)的人工智能算法,在游戲開發(fā)中比較常用到。A*的原理并不復(fù)雜,不過(guò)由于不是Unity3D自帶的功能,因此在設(shè)定網(wǎng)格和烘焙的過(guò)程中難免會(huì)出現(xiàn)問題。而NavMesh作為Unity自帶的功能,用法與之前的LightMapping烘焙或者遮擋剔除Occlusion Culling有很多相似之處,最主要是它用起來(lái)很方便。
將制作好的場(chǎng)景導(dǎo)入U(xiǎn)nity3D,選擇場(chǎng)景模型,然后將Navigation Static選中,對(duì)于與場(chǎng)景無(wú)關(guān)的模型確定其不被選中。打開Navigation,根據(jù)場(chǎng)景需要調(diào)整尋路者半徑、高度以及尋路者能行走的最大坡度和高度,完成后烘焙場(chǎng)景[6]。
2.3.2 第三人稱物體設(shè)置
將預(yù)先設(shè)置好的人物prefab拖入場(chǎng)景,為其添加上Nav Mesh Agent組件,由于尋路者可能需要多次尋路,因此通過(guò)編寫C#代碼在Update函數(shù)中實(shí)現(xiàn)二次尋路。部分代碼如下:
public NavMeshAgent man;
public Transform target;
GameObject go;
void Start(){
man=gameObject.GetComponent<NavMeshAgent>();
go=GameObject.Find(Xinan.rukou);}
target=go.transform;
void Update(){
if(Xunlu. roomNum != null){
go=GameObject.Find(Xunlu.roomNum);
target=go.transform;
man.SetDestination(target.position); }}
由于使用角色為第三人稱,角色所處的狀態(tài)即為等待或行走,通過(guò)將事先導(dǎo)入的動(dòng)畫進(jìn)行設(shè)置進(jìn)而實(shí)現(xiàn)。創(chuàng)造兩個(gè)bool類型數(shù)值,分別為idel與walk,實(shí)現(xiàn)其與動(dòng)畫過(guò)度關(guān)聯(lián),并通過(guò)腳本進(jìn)行控制。部分腳本如下:
void Start() {
m_ani=this.GetComponent<Animator>();}
void Update(){
AnimatorStateInfo stateInfo=m_ani.GetCurrentAnimatorStateInfo(0);
…..
m_ani.SetBool("idle",true);
…….
m_ani.SetBool("idel",false);
…..
m_ani.SetBool("walk",true);
…….
m_ani.SetBool("walk",false);}}
2.3.3 相機(jī)設(shè)置
需要將相機(jī)設(shè)置成伴隨角色的移動(dòng)。通過(guò)設(shè)置相機(jī)相對(duì)角色位置并且每幀都去檢測(cè)相機(jī)相對(duì)角色位置,即保證相機(jī)相對(duì)角色為靜止?fàn)顟B(tài)。部分實(shí)現(xiàn)代碼如下:
public Transform m_transform;
float m_camHeight=1.4f;
Transform m_camTransform;
CharacterController m_ch;
void Update(){
m_transform=this.transform;
m_camTransform=Camera.main.transform;
Vector3 pos=m_transform.position;
pos.y+=m_camHeight;
m_camTransform.position=pos;
m_camTransform.rotation=m_transform.rotation;
m_camTransform.eulerAngles=m_transform. eulerAngles}
2.3.4 交互界面
對(duì)于交互界面[7]的設(shè)計(jì),采用了NGUI,大大方便了界面設(shè)計(jì),提高了效率。對(duì)于交互界面,分為兩部分,即建筑物入口選擇界面和目標(biāo)點(diǎn)輸入界面。
建筑物入口選擇部分交互界面,單獨(dú)放到一個(gè)場(chǎng)景中,將使用說(shuō)明等與之組合在一起。如果用戶點(diǎn)擊某一入口,則將值傳遞給角色,角色切換到相應(yīng)入口處。實(shí)現(xiàn)主要代碼如下:
void OnClick()
{Application.LoadLevel(2);
rukou="easterndoor";
M=true;}
場(chǎng)景二中人物添加代碼如下:
void Start(){
go=GameObject.Find(Xinan.rukou);
target=go.transform;
man.transform.position=target.position;}
交互界面效果圖如圖5所示。
通過(guò)在尋路代碼中添加設(shè)置虛擬人物與目標(biāo)點(diǎn)的距離來(lái)判讀是否出現(xiàn)輸入目標(biāo)點(diǎn)的交互界面[8]:
float dist=Vector3.Distance(man.transform.position,target.transform.position);
if(dist<=1.0){UI.SetActive(true);}
對(duì)于目標(biāo)點(diǎn)的輸入采用獲取輸入框的值,如果輸入的地點(diǎn)不存在,則返回提醒輸入正確的目標(biāo)點(diǎn);否則,需找目標(biāo)點(diǎn),效果如圖6所示。
public GameObject errorUI;
public static string classroomNum;
……
classroomNum=GuiInput.value;
在角色代碼中添加如下代碼:
if(xunlu.flag==1)
{errorUI.SetActive(true);}
else
{errorUI.SetActive(false);}
2.3.5 檢測(cè)碰撞
當(dāng)角色經(jīng)過(guò)門時(shí),如果門是關(guān)閉的,則此時(shí)門應(yīng)該打開,若燈是關(guān)閉的則也需打開,這需要在燈和門上添加剛體碰撞檢測(cè)[8],雖然實(shí)現(xiàn)不是很容易,但增加了交互性[9],場(chǎng)景真實(shí)感加強(qiáng)。對(duì)于門的檢測(cè),需要在腳本代碼中分別實(shí)現(xiàn)OnTriggerEnter和OnTriggerExit函數(shù),在OnTriggerEnter中播放門打開的動(dòng)畫,在OnTriggerExit中停止門打開的動(dòng)畫。燈的檢測(cè)直接利用OnTriggerEnter,當(dāng)角色與燈組件發(fā)生碰撞時(shí),燈的組件被喚醒。
3 場(chǎng)景優(yōu)化
本導(dǎo)航系統(tǒng)基于智能手機(jī)開發(fā),雖然現(xiàn)在的智能手機(jī)處理器、內(nèi)存等都有大的提升,但是如果場(chǎng)景較大,模型點(diǎn)面較多,代碼優(yōu)化不合理,在智能機(jī)上的運(yùn)行將會(huì)受影響。因此,本文認(rèn)為應(yīng)該從以下幾個(gè)方面進(jìn)行場(chǎng)景優(yōu)化[9]:
(1)對(duì)于場(chǎng)景內(nèi)的點(diǎn)面,最好控制在10萬(wàn)以內(nèi),看不見的點(diǎn)面將其刪除;
?。?)盡可能減少角色骨骼數(shù)量;
?。?)多張貼圖共享一張材質(zhì)球;
?。?)保證代碼邏輯正確,刪除腳本中未使用的Update函數(shù);
(5)盡可能減少像素?zé)艄?、反射、陰影等的使用,這些操作會(huì)導(dǎo)致模型被多次渲染,加重CPU的負(fù)擔(dān)。
4 結(jié)論
本文介紹了虛擬現(xiàn)實(shí)技術(shù)在室內(nèi)導(dǎo)航方面應(yīng)用的關(guān)鍵技術(shù)。通過(guò)數(shù)據(jù)采集、模型繪制、Unity3D場(chǎng)景開發(fā),模擬出最真實(shí)的虛幻場(chǎng)景,讓使用者擁有身臨其境的感覺,幫助其更好地完成室內(nèi)導(dǎo)航。本系統(tǒng)適合各種大中型室內(nèi)場(chǎng)所導(dǎo)航,如醫(yī)院場(chǎng)所導(dǎo)航、大型超市貨物導(dǎo)航等。當(dāng)然,由于開發(fā)場(chǎng)景的過(guò)程過(guò)于繁瑣,開發(fā)所需成本目前還較高,但是隨著虛擬現(xiàn)實(shí)技術(shù)、計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)、虛擬現(xiàn)實(shí)眼鏡技術(shù)等的發(fā)展,在未來(lái)成本等問題會(huì)得到解決,屆時(shí)虛擬現(xiàn)實(shí)3D仿真導(dǎo)航系統(tǒng)將會(huì)取代傳統(tǒng)的二維平面導(dǎo)航系統(tǒng)。
參考文獻(xiàn)
[1] 馮俊杰.基于UML的三維漫游系統(tǒng)的分析與設(shè)計(jì)[D].大連:遼寧師范大學(xué),2011.
[2] 朱惠娟.基于Unity3D的虛擬漫游系統(tǒng)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2012,21(10):36-39,65.
[3] 干建松.基于Unity3d的室內(nèi)漫游仿真系統(tǒng)[J].淮陰師范學(xué)院學(xué)報(bào)(自然科學(xué)版),2011,10(6):515-518.
[4] 祝敏嬌.基于Unity3D的虛擬漫游技術(shù)的研究[J].硅谷.2012(20):77,102.
[5] 黃健柏,鄒崢嶸,朱學(xué)紅.虛擬校園及其在校園規(guī)劃管理中的應(yīng)用[J].教育信息化,2002(6):7-8.
[6] 吳鳳娟,刁永鋒.虛擬校園漫游系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)[J].蘇州科技學(xué)院學(xué)報(bào)(工程技術(shù)版),2005,18(2):78-80.
[7] 李峻峰.虛擬現(xiàn)實(shí)技術(shù)與虛擬校園的研究與實(shí)踐——以濰坊學(xué)院虛擬校園建設(shè)為例[J].工程圖學(xué)學(xué)報(bào),2011,32(3):62-68.
[8] 金漢均,王曉榮,徐星,等.一種基于DirectX的碰撞檢測(cè)算法[J].電子技術(shù)應(yīng)用,2006,32(1):56-58.
[9] 雷忠誠(chéng),胡文山,鄔靜陽(yáng),等.基于Web的3D智能家居系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].電子技術(shù)應(yīng)用,2014,40(9):114-117.
[10] 金璽曾.Unity3D手機(jī)游戲開發(fā)[M].北京:清華大學(xué)出版社,2013.