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