繆明會(huì) 曹德飛 肖明慧 陸映峰
【摘要】隨著虛擬現(xiàn)實(shí)技術(shù)的飛速發(fā)展,各種3D引擎用于虛擬漫游系統(tǒng)的開(kāi)發(fā)。本文針對(duì)利用unity3D引擎實(shí)現(xiàn)虛擬漫游的方法進(jìn)行了探討和研究,闡述了利用C#語(yǔ)言進(jìn)行虛擬漫游的腳本實(shí)現(xiàn)。
【關(guān)鍵詞】Unity3D;漫游系統(tǒng);虛擬現(xiàn)實(shí)
1 虛擬漫游介紹
1.1現(xiàn)狀分析
虛擬漫游,是虛擬現(xiàn)實(shí)(VR)技術(shù)的重要分支,在房地產(chǎn)、旅游、游戲、航空航天、醫(yī)學(xué)等多種行業(yè)發(fā)展很快。
1.2國(guó)內(nèi)外發(fā)展趨勢(shì)
國(guó)外:美國(guó)是虛擬現(xiàn)實(shí)技術(shù)的發(fā)源地,現(xiàn)如今已經(jīng)建立了空間站、航空、衛(wèi)星維護(hù)的虛擬訓(xùn)練系統(tǒng);在歐洲,英國(guó)在輔助設(shè)備設(shè)計(jì)、分布并行處理和應(yīng)用研究方面是領(lǐng)先的,在硬件和軟件的領(lǐng)域處于領(lǐng)先地位。
國(guó)內(nèi):我國(guó)對(duì)于虛擬現(xiàn)實(shí)技術(shù)的研究和國(guó)外一些發(fā)達(dá)國(guó)家還存在相當(dāng)大的一段距離,但隨著計(jì)算機(jī)技術(shù)的發(fā)展速度越來(lái)越快,我國(guó)各界人士對(duì)于虛擬現(xiàn)實(shí)技術(shù)也越來(lái)越重視,正在積極進(jìn)行虛擬環(huán)境的建立以及虛擬場(chǎng)景模型分布式系統(tǒng)的開(kāi)發(fā)等等。
2 虛擬漫游技術(shù)實(shí)現(xiàn)
在虛擬漫游腳本設(shè)計(jì)中,主要涉及到三個(gè)功能,分別是自動(dòng)漫游、手動(dòng)漫游和攝像機(jī)鏡頭縮放功能。
2.1自動(dòng)漫游
自動(dòng)漫游其實(shí)就是在場(chǎng)景中設(shè)置幾個(gè)遍歷點(diǎn),類(lèi)似于設(shè)置一條固定路線,然后讓攝像機(jī)去逐個(gè)遍歷點(diǎn),采用的API是Vector3.MoveTowards,具體設(shè)計(jì)流程圖如圖1所示:
其中,腳本設(shè)計(jì)中的代碼實(shí)現(xiàn)情況如下所示:
(1)數(shù)組:此處設(shè)計(jì)一個(gè)列表存放遍歷點(diǎn),控制相機(jī)逐個(gè)遍歷各個(gè)點(diǎn)并移動(dòng)到當(dāng)前遍歷點(diǎn)的位置(注:定義移動(dòng)速度是為了方便用戶(hù)可以根據(jù)自己的需求來(lái)調(diào)整攝像機(jī)自動(dòng)漫游的速度):
public List point=new List();//定義遍歷數(shù)組并實(shí)例化
publicGameObject roamCamera;//定義相機(jī)
public floatmoveSpeed;//定義移動(dòng)速度
int i=0;//定義遍歷點(diǎn)變量
(2)按鍵改變漫游速度,此處可以設(shè)置一個(gè)范圍,如我在這里設(shè)置的是最小速度為0.5,最大速度為6,通過(guò)捕捉用戶(hù)鍵盤(pán)操作“+”、“-”,按動(dòng)一次速度+-0.5,執(zhí)行流程圖如圖2所示:
(3)遍歷目標(biāo)點(diǎn)(通過(guò)遍歷列表中的點(diǎn),依次移動(dòng)到目標(biāo)點(diǎn)):
if(roamCamera.transform.position==point[i].position){
i++;
if(i==point.Count){
i=0;
roamCamera.transform.position=point[0].position;
}}
roamCamera.transform.position=Vector3.MoveTowards(roamCamera.transform.position,point[i].position,moveSpeed*Time.deltaTime);
(4)控制攝像機(jī)的視野范圍(通過(guò)按住鼠標(biāo)左鍵使得攝像機(jī)漫游時(shí)根據(jù)用戶(hù)需求旋轉(zhuǎn)到自定義的視野中)
if(Input.GetMouseButton(0)){
floatmouseX=Input.GetAxis(“Mouse X”)*1f;
roamCamera.transform.localRotation=roamCamera.transform.localRotation*Quaternion.Euler(0,mouseX,0);
}
2.2手動(dòng)漫游
用戶(hù)自定義根據(jù)鍵盤(pán)WSAD鍵控制攝像機(jī)的移動(dòng)。首先定義角色控制器及相機(jī)速度初始量,要設(shè)置一個(gè)角色控制器組件,其次定義移動(dòng)速度并初始化,最后設(shè)置一個(gè)相機(jī)的組件讓相機(jī)圍繞角色運(yùn)動(dòng)。(注:角色可以設(shè)置為一個(gè)cub,然后將材質(zhì)剔除,這樣也就變?yōu)榱说谝蝗朔Q(chēng)視角)
privateCharacterController player;
publicint speed=3;
publicGameObject camera;
獲取角色控制器組件:
player=this.GetComponent();
通過(guò)WASD鍵控制移動(dòng):
player.SimpleMove(transform.forward*Input.GetAxis(“Vertical”)*speed);
transform.Rotate(0,Input.GetAxis(“Horizontal”),0);//控制攝像機(jī)旋轉(zhuǎn)
//Vertical為水平軸 即表示AD鍵/左右鍵等
2.3攝像機(jī)鏡頭縮放
首先控制攝像機(jī)鏡頭縮放需要設(shè)置一個(gè)縮放速度,可以這樣定義:
public floatScaleSpeed=10.0f;
另外,需要在每一幀的運(yùn)行中,也就是update方法中實(shí)時(shí)獲取到是否輸入了滑輪的操作.(注:這里主要的實(shí)現(xiàn)思想是通過(guò)滑輪控制攝像機(jī)的位置移動(dòng),也就控制了視野范圍的大?。?/p>
if(Input.GetAxis(“Mouse ScrollWheel”)<0)
{
Camera.main.transform.Translate(0,0,-1*ScaleSpeed);
}
if(Input.GetAxis(“Mouse ScrollWheel”)>0)
{
Camera.main.transform.Translate(0,0,1*ScaleSpeed);
}
3 結(jié)論
本研究很好地展示虛擬漫游的實(shí)現(xiàn)方法,可以根據(jù)自己設(shè)置的路線實(shí)現(xiàn)攝像機(jī)自動(dòng)漫游功能,也可以通過(guò)鍵盤(pán)自定義控制攝像機(jī)移動(dòng)來(lái)漫游整個(gè)場(chǎng)景。另外,當(dāng)今已經(jīng)更新到5G時(shí)代,可以結(jié)合5G、VR、AR等技術(shù)進(jìn)一步推廣,使得虛擬漫游功能更加豐富,給游客提供更加逼真的效果體驗(yàn)。
參考文獻(xiàn):
[1]祝敏嬌.基于Unity3D的虛擬漫游技術(shù)的研究[J].硅谷,2012.
[2]干建松.基于Unity 3D的室內(nèi)漫游的關(guān)鍵技術(shù)研究[J].鹽城工學(xué)院學(xué)報(bào),2011.
[3]王愛(ài)軍,李中永,顏世波.基于Unity 3D的博物館虛擬漫游系統(tǒng)設(shè)計(jì)[J].湖南工程學(xué)院學(xué)報(bào),2019.