您好, 访客   登录/注册

基于Unity3D的VR交互实现方法研究

来源:用户上传      作者:

  【摘要】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<gazedurationtime){
  reticleImage.fillAmount=counttime/gazeDurationTime;
  }...
  4 結语
  本研究阐述了射线交互的实现方法,用相机模拟用户头部发射射线进行交互,检测交互对象是否有触发事件,并进行事件交互。在使用准星时,需要立体渲染(制造视觉深度),并要保持恒定的速度。(通信作者:刘海艳)
  
  参考文献:
  [1]周晓成,张煜鑫,冷荣亮.虚拟现实交互设计[M].化学工业出版社,2016.
  [2]张胜男,高如玉,高权.基于全景图的科普场馆漫游系统设计 [J].电子世界,2017(2):150-152.
  [3]误雁波.著 Unity 3D平台AR与VR开发快速上手[M].清华大学出版社,2017.
转载注明来源:https://www.xzbu.com/2/view-15278631.htm