我们知道在VR中,尤其是像HTC VIVE或Oculus这样的设备,体验者除了能够使用瞬移来移动自身位置,还可以在空间小范围地自主移动,当距离一面墙或者障碍物比较近的时候,体验者的头部可以穿过墙面或障碍物的模型,看到里面的内容(CS穿墙既视感),比如在VR房产项目中,用户会看到隔壁房间的内容,个别会有闪躲的动作,这种体验显然与现实不符,从而影响到沉浸感;另外,同样是由于自由移动引起的问题,当体验者瞬移到一个有高度的地方以后,比如高塔、楼梯等,当走出这个高度的范围,并没有因为重力而下落,而是悬停在了空中,这也是影响用户体验的地方。
VRTK对于这两方面都有对应的优化措施,首先,对于穿墙,使用VRTK_HeadsetCollisionFade组件,能够在检测到用户与物体发生碰撞以后做一个黑屏效果,这样体验者就会本能地退出这个区域(如下图),在PlayArea(见VRTK的基本配置,PlayArea用来挂载瞬移相关组件)上添加脚本以后,用户头盔与碰撞体发生碰撞,场景会有一个逐渐变黑的过程。
需要说明的是:当添加VRTK_HeadsetCollisionFade以后,会自动挂载另外两个组件:
1.VRTK_HeadsetCollision:用来检测头盔与碰撞体的碰撞,当单独挂载这个脚本的时候,可以获取到这个脚本,使用HeadsetCollisionDetect事件来检测碰撞发生,然后撰写自己的碰撞检测逻辑,比如除了黑屏,还可以播放提示音,显示提示UI等。
void Start () {
GetComponent<VRTK_HeadsetCollision>().HeadsetCollisionDetect += CollisionDetect_HeadsetCollisionDetect;
}
private void CollisionDetect_HeadsetCollisionDetect(object sender, HeadsetCollisionEventArgs e)
{
//你的处理逻辑
}
2. VRTK_HeadsetFade:用来实现黑屏。当单独挂载时,可以在除了头盔碰撞之外,调用其Fade()函数来实现黑屏效果,传递颜色及持续时间参数。
对于自动坠落,VRTK提供了VRTK_BodyPhysics这个组件,同样是挂载到PlayArea上,当体验者移出高度范围的区域,会因为重力自动坠落到能够承载其的下一个高度。调节参数Gravity Fall Y Threshold,设定引起坠落的值,如下图,如果设置为1,则距离下一个高度大于1米时下落。
其原理是,VRTK在运行时,会在CameraRig上添加两个Collider,一个“代表”Body,一个“代表”Foot,如下图:
FootCollider通过检测碰撞,当没有碰撞时,则认为悬空,继而实现下落。
以上是VRTK中对于因为用户自由移动引起的用户体验的优化,希望对你有帮助,欢迎指正。
网友评论