《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 模擬設(shè)計(jì) > 設(shè)計(jì)應(yīng)用 > 基于虛擬現(xiàn)實(shí)技術(shù)的室內(nèi)導(dǎo)航系統(tǒng)
基于虛擬現(xiàn)實(shí)技術(shù)的室內(nèi)導(dǎo)航系統(tǒng)
2015年微型機(jī)與應(yīng)用第20期
武 勝,白江波,姚浩浩,吳 浩
合肥工業(yè)大學(xué)宣城校區(qū) 商學(xué)系,安徽 宣城 242000
摘要: 以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í)的虛擬場景還原室內(nèi)樣貌,供導(dǎo)航者更好地完成室內(nèi)尋路。最后介紹了場景優(yōu)化的方法,以便在PC、智能手機(jī)等平臺(tái)上使用。
Abstract:
Key words :

  摘  要: 以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í)的虛擬場景還原室內(nèi)樣貌,供導(dǎo)航者更好地完成室內(nèi)尋路。最后介紹了場景優(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ī)生成逼真的三維視、聽、嗅覺等,使人作為參與者通過適當(dāng)裝置,自然地對(duì)虛擬世界有更完美的體驗(yàn)和交互作用。虛擬現(xiàn)實(shí)具有很好的交互性、沉浸性和想象性,這三個(gè)特性合稱為虛擬現(xiàn)實(shí)鐵三角,如圖1所示。

Image 001.png

  其中沉浸性是虛擬現(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所示。

Image 002.png

  現(xiàn)如今人們?nèi)粘;顒?dòng)范圍主要還是在室內(nèi),且伴隨著我國建筑行業(yè)的快速發(fā)展,結(jié)構(gòu)復(fù)雜的巨型建筑如上海世貿(mào)大廈等逐漸進(jìn)入人們的日常生活,室內(nèi)尋路問題亟需解決。而近年來關(guān)于虛擬現(xiàn)實(shí)及Unity3D的研究越來越熱,通過建模并完成貼圖后導(dǎo)入U(xiǎn)nity3D,在Unity3D中完成腳本語言的編寫,從而實(shí)現(xiàn)交互及尋路系統(tǒ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)場景極其復(fù)雜,室內(nèi)導(dǎo)航系統(tǒng)的開發(fā)步驟如下:

 ?。?)數(shù)據(jù)采集:采用CAD圖紙和場景圖片,應(yīng)用Photoshop優(yōu)化場景圖片信息;

 ?。?)數(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ì)等完成場景交互,最終實(shí)現(xiàn)室內(nèi)自動(dòng)尋路系統(tǒng)。其中包括輸入目的地,以最優(yōu)算法實(shí)現(xiàn)最短路途,到達(dá)目的地,到達(dá)目的地后可以接著實(shí)現(xiàn)二次尋路;在尋路過程中遇到門、燈等組件,進(jìn)行碰撞檢測,門、燈等自動(dòng)打開[3]。其制作流程如圖3所示。

Image 003.png

2 室內(nèi)導(dǎo)航系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)

  2.1 前期工作

  由于現(xiàn)代建筑其場景巨大室內(nèi)場景復(fù)雜,在建模前,要搜集完整的數(shù)據(jù),否則將會(huì)影響后續(xù)建模的進(jìn)展及模型的使用。對(duì)要建模的物體進(jìn)行照片采集并且利用PS處理,擁有一整套的從內(nèi)到外的照片,此照片不僅用來幫助建模還用來完成模型貼圖;將CAD圖紙導(dǎo)入AutoCAD軟件,刪除不需要的部分,并且添加上建模所需要的補(bǔ)測數(shù)據(jù),導(dǎo)出.DWG格式。

  2.2 建模技術(shù)

  將.DWG格式的文件導(dǎo)入3DSMAX[4],根據(jù)左視圖、頂視圖等將CAD文件按照其實(shí)際位置放好。選擇全部的CAD文件,使其凍結(jié),然后根據(jù)制作順序暫時(shí)隱藏其他不需要的CAD。建模過程中可以參照采集的圖片保證模型的真實(shí)性。為了保證打包出的軟件運(yùn)行流暢,在這里可以制作兩套模型,一套低模,一套高模,實(shí)現(xiàn)高模轉(zhuǎn)低模而低模擁有高模的效果。利用3DS MAX高效的建模技巧將模型建成之后,選擇UV展開,將模型展開UV,UV展開的好壞直接決定貼圖的效果,按照比例展開。將展好UV的模型導(dǎo)入Mari進(jìn)行貼圖繪制,而一個(gè)場景的逼真度往往由貼圖所決定,因此,在進(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場景搭建技術(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),通過Find尋找該點(diǎn)是否存在,如果存在虛擬人物就會(huì)根據(jù)最優(yōu)路徑自動(dòng)到達(dá),尋路結(jié)束,提醒是否再次尋路。場景制作流程如圖4所示。

Image 004.png

  2.3.1 尋路組件

  使用Unity實(shí)現(xiàn)室內(nèi)自動(dòng)尋路,其有多種方式。第一種比較傳統(tǒng)的是使用A*尋路,它是一種比較傳統(tǒng)的人工智能算法,在游戲開發(fā)中比較常用到。A*的原理并不復(fù)雜,不過由于不是Unity3D自帶的功能,因此在設(shè)定網(wǎng)格和烘焙的過程中難免會(huì)出現(xiàn)問題。而NavMesh作為Unity自帶的功能,用法與之前的LightMapping烘焙或者遮擋剔除Occlusion Culling有很多相似之處,最主要是它用起來很方便。

  將制作好的場景導(dǎo)入U(xiǎn)nity3D,選擇場景模型,然后將Navigation Static選中,對(duì)于與場景無關(guān)的模型確定其不被選中。打開Navigation,根據(jù)場景需要調(diào)整尋路者半徑、高度以及尋路者能行走的最大坡度和高度,完成后烘焙場景[6]。

  2.3.2 第三人稱物體設(shè)置

  將預(yù)先設(shè)置好的人物prefab拖入場景,為其添加上Nav Mesh Agent組件,由于尋路者可能需要多次尋路,因此通過編寫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)即為等待或行走,通過將事先導(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ān)聯(lián),并通過腳本進(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)。通過設(shè)置相機(jī)相對(duì)角色位置并且每幀都去檢測相機(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è)場景中,將使用說明等與之組合在一起。如果用戶點(diǎn)擊某一入口,則將值傳遞給角色,角色切換到相應(yīng)入口處。實(shí)現(xiàn)主要代碼如下:

  void OnClick()

  {Application.LoadLevel(2);

  rukou="easterndoor";

  M=true;}

  場景二中人物添加代碼如下:

  void Start(){

  go=GameObject.Find(Xinan.rukou);

  target=go.transform;

  man.transform.position=target.position;}

  交互界面效果圖如圖5所示。

Image 005.png

  通過在尋路代碼中添加設(shè)置虛擬人物與目標(biāo)點(diǎn)的距離來判讀是否出現(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所示。

Image 006.png

  public GameObject errorUI;

  public static string classroomNum;

  ……

  classroomNum=GuiInput.value;

  在角色代碼中添加如下代碼:

  if(xunlu.flag==1)

  {errorUI.SetActive(true);}

  else

  {errorUI.SetActive(false);}

  2.3.5 檢測碰撞

  當(dāng)角色經(jīng)過門時(shí),如果門是關(guān)閉的,則此時(shí)門應(yīng)該打開,若燈是關(guān)閉的則也需打開,這需要在燈和門上添加剛體碰撞檢測[8],雖然實(shí)現(xiàn)不是很容易,但增加了交互性[9],場景真實(shí)感加強(qiáng)。對(duì)于門的檢測,需要在腳本代碼中分別實(shí)現(xiàn)OnTriggerEnter和OnTriggerExit函數(shù),在OnTriggerEnter中播放門打開的動(dòng)畫,在OnTriggerExit中停止門打開的動(dòng)畫。燈的檢測直接利用OnTriggerEnter,當(dāng)角色與燈組件發(fā)生碰撞時(shí),燈的組件被喚醒。

3 場景優(yōu)化

  本導(dǎo)航系統(tǒng)基于智能手機(jī)開發(fā),雖然現(xiàn)在的智能手機(jī)處理器、內(nèi)存等都有大的提升,但是如果場景較大,模型點(diǎn)面較多,代碼優(yōu)化不合理,在智能機(jī)上的運(yùn)行將會(huì)受影響。因此,本文認(rèn)為應(yīng)該從以下幾個(gè)方面進(jìn)行場景優(yōu)化[9]:

 ?。?)對(duì)于場景內(nèi)的點(diǎn)面,最好控制在10萬以內(nèi),看不見的點(diǎn)面將其刪除;

 ?。?)盡可能減少角色骨骼數(shù)量;

  (3)多張貼圖共享一張材質(zhì)球;

  (4)保證代碼邏輯正確,刪除腳本中未使用的Update函數(shù);

 ?。?)盡可能減少像素?zé)艄狻⒎瓷?、陰影等的使用,這些操作會(huì)導(dǎo)致模型被多次渲染,加重CPU的負(fù)擔(dān)。

4 結(jié)論

  本文介紹了虛擬現(xiàn)實(shí)技術(shù)在室內(nèi)導(dǎo)航方面應(yīng)用的關(guān)鍵技術(shù)。通過數(shù)據(jù)采集、模型繪制、Unity3D場景開發(fā),模擬出最真實(shí)的虛幻場景,讓使用者擁有身臨其境的感覺,幫助其更好地完成室內(nèi)導(dǎo)航。本系統(tǒng)適合各種大中型室內(nèi)場所導(dǎo)航,如醫(yī)院場所導(dǎo)航、大型超市貨物導(dǎo)航等。當(dāng)然,由于開發(fā)場景的過程過于繁瑣,開發(fā)所需成本目前還較高,但是隨著虛擬現(xiàn)實(shí)技術(shù)、計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)、虛擬現(xiàn)實(shí)眼鏡技術(shù)等的發(fā)展,在未來成本等問題會(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的碰撞檢測算法[J].電子技術(shù)應(yīng)用,2006,32(1):56-58.

  [9] 雷忠誠,胡文山,鄔靜陽,等.基于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.


此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。