何燕紅 孫麗娟 劉寶麗 劉海艷
【摘要】VR作為一種計算機仿真系統,已經開始由單一向多元、由分立向融合方向演變,應用產業也在不斷的擴大。本文對利用Unity3D引擎實現VR交互的方法進行了分析和探討,著重闡述了射線交互方法的實現過程。
【關鍵詞】Unity3D;VR;交互
1 VR介紹
1.1VR基本概念
VR(虛擬現實)技術是一種能夠創造和體驗虛擬世界的計算機模擬系統。它能夠允許使用者在虛擬空間中體驗一個模擬人類視覺、聽覺觸覺等感官的虛擬場景;虛擬現實是對真實世界的模擬,一方面它能對現實環境作逼真的描述,另一方面還能使得人們在觀察虛擬環境的時候猶如身臨其境,可以與之進行交互。
1.2VR技術的發展趨勢
目前,VR技術已經廣泛應用于城市規劃、室內設計、工業仿真、古跡復原、橋梁道路設計、房地產銷售、旅游教學、水利電力、地質災害、教育培訓等眾多領域,讓一些在現實條件中難以演練難以實現的事情,可以通過VR技術進行實現,為更多的行業提供更多的可能。
1.3VR技術的特征
(1)多感知性,是指視、力、觸、運動、味、嗅等感知系統。
(2)交互性,是指當人處于虛擬世界時,依然可以像在現實中一樣,通過觸碰、使用某些具體物品,感受到所用物品存在于人與物品之間的互動信息。
(3)構想性,指人處于虛擬世界,將所想的物品所做的事情展現在虛擬世界里,甚至在虛擬世界中還可以把在現實世界不可能存在的事和物都呈現出來。
2 VR交互設計要素
2.1VR的交互方式
在虛擬現實的情境中,交互的方式主要分為以下4種:視線交互、按鍵交互、射線交互與碰撞器交互。其中,視線交互僅需頭戴式顯示器即可實現交互,手柄按鍵交互需要判斷手柄按鍵是否按下以及按下的力度,手柄射線交互需要獲取手柄當前的坐標和旋轉角度再配合手柄按鍵來實現射線與物體的交互,手柄碰撞器交互則需要獲取手柄當前的坐標以及其附帶的碰撞器組件并判斷是否與物體進行碰撞之后才能實現與物體的交互。
2.2VR用戶界面的操作方式
(1)使用準星。在VR環境中,攝像頭的控制權限完全掌握在使用者手中,當攝像機本身動作與輸入有差異或使用者視線未處于頭戴式顯示設備的中央時,會破壞使用者沉浸感,所以要保證十字形或者圓形的準星放置使用者的正前方。進行交互時將準星懸停在可交互對象上,彈出提示信息以提示使用者對象可交互。
(2)使用恰當的視覺深度。和一般應用程序使用的UI不同,VR的UI具有縱深屬性。因此,如果在VR中與UI的內容過近的話,就無法看清UI的全貌,但是,如果UI太遠,用戶則無法看清UI中包含的內容。同時,文本的大小和UI元素的比例也會影響用戶體驗。
(3)使用固定的速度。VR的變速運動對用戶體驗有負面影響,就人體生理結構看,視覺信息是通過眼睛獲取并反饋到前庭系統的。當眼睛的感知與前提系統不一致時,用戶會感到惡心或眩暈,這種不適在VR環境下的主要原因是眼睛感知到了速度的變化,而前庭系統卻沒有相應的感覺,從而導致不適,這和暈動病的原理一致,所以盡可能避免在VR環境中使用變速運動。
3 VR交互功能的實現
因為在常見VR項目開發中一般采用Google VR,借助Unity3D VR平臺實現,使用與其配套的SDK和Google Cardboard進行項目體驗,所以本文針對射線交互進行研究。
3.1模擬頭部的轉動
在Unity3D引擎中實現的VR的交互時,可采用第一人稱,用相機模擬用戶的頭部,實現仿人類視線和頭部轉動。在實現時,需要設置上限最大視角,根據鼠標移動的快慢,獲取相機左右旋轉的角度;根據鼠標移動的快慢,獲取相機上下旋轉的角度,并對角度進行限制。功能實現部分代碼為:
float rotationX=transform.localEulerAngles.y+Input.GetAxis(“Mouse X”) * sensitivityX;
rotationY+=Input.GetAxis(“Mouse Y”)*sensitivityY;
rotationY=Mathf.Clamp(rotationY,minimumY,maximumY);
transform.localEulerAngles=new Vector3(-rotationY,rotationX,0);
this.transform.Translate(new Vector3(Input.GetAxis(“Horizontal”),0,Input.GetAxis(“Vertical”))*Time.deltaTime);
3.2視線交互
相機發射射線進行交互,檢測到有交互對象,則去獲得它身上的功能腳本,獲取成功后開始計時,到達3秒,觸發功能。若用戶中途離開,則重新計時。準星能夠吸附到對象,沒有交互對象時,重置準星的位置。功能實現部分代碼為:
Ray ray=new Ray(transform.position,transform.forward);
RaycastHit hit;
if(Physics.Raycast(ray,out hit,100)){
canvasPoint.transform.localScale=hit.distance*canvasOriginalScale*0.05f;
canvasPoint.transform.position=hit.point;
canvasPoint.transform.forward=hit.normal;
if(hit.transform.gameObject!=curInteractiveObj)
if(curInteractiveObj!=null){oldInteractiveObj=curInteractiveObj;
oldobjDoing=oldInteractiveObj.GetComponent();
if(oldobjDoing){
oldobjDoing.leave();
}}
curInteractiveObj=hit.transform.gameObject;
objDoing=curInteractiveObj.GetComponent();
if(objDoing){objDoing.hovered();
}}
else{counttime+=Time.deltaTime;
if(counttime reticleImage.fillAmount=counttime/gazeDurationTime; }... 4 結語 本研究闡述了射線交互的實現方法,用相機模擬用戶頭部發射射線進行交互,檢測交互對象是否有觸發事件,并進行事件交互。在使用準星時,需要立體渲染(制造視覺深度),并要保持恒定的速度。(通信作者:劉海艷) 參考文獻: [1]周曉成,張煜鑫,冷榮亮.虛擬現實交互設計[M].化學工業出版社,2016. [2]張勝男,高如玉,高權.基于全景圖的科普場館漫游系統設計 [J].電子世界,2017(2):150-152. [3]誤雁波.著 Unity 3D平臺AR與VR開發快速上手[M].清華大學出版社,2017.