Unity新版本VR以及SteamVR基础

1、Unity2018新版本VR

 Unity 简单VRDemo搭建

Unity环境搭建:

 PlayerSetting设置以下:html

启动虚拟现实驱动,sdk选择OpenVR。HTC  Vive只支持OpenVR。node

   Unity Input设置:git

官方手册设置说明: https://docs.unity3d.com/Manual/OpenVRControllers.htmlgithub

     按照手册进行配置,左手菜单按钮设置为:api

左手触摸板触摸位置获取设置为:ide

X轴设置:测试

Y轴设置:ui

其他按钮以例根据官方手册在Input中进行配置便可。.net

基础运行场景搭建

基础环境配置配置完成,VR硬件链接正确时只要场景中存在相机便能实现头部的定位跟踪,先基础角色配置如图:插件

手部定位追踪依赖于组件:

 

Device:

制定要追踪的设备类型,XRDevice:XR设备(包括头部,眼睛位置的追踪)用于HMD和AR移动设备的位置追踪。

XRController:控制器设备的(左手和右手控制器)

XR Remote:XR遥控器,用于移动遥控器(此值暂未用到)

PoseSource 要追踪设备位置来源。

UseRelativeTransform:是否使用对象的原始转换做为基础(暂未明白其含义)

基础控制器事件

   以左手控制器为例:

     //点击左手菜单按钮

        if (Input.GetButtonDown("LTMenu"))

        {

            Debug.Log("按下左手菜单按键");

        }

        //触摸左手Touchpad

        if (Input.GetButton("LTTrackpadTouch"))

        {

            float x = Input.GetAxisRaw("LTTrackpadHorizontal");

            float y = Input.GetAxisRaw("LTTrackpadVertical");

          

            Debug.LogFormat("触摸左手手柄触摸板:X:{0},Y:{1}", x, y);

        }

 

        if (Input.GetButton("LTTrackpadPress"))

        {

            Debug.Log("按下左手触摸板");

        }

 

        if (Input.GetButton("LTrigglerTouch"))

        {

            float value = Input.GetAxis("LTrigglerSqueeze");

            //Debug.Log("触摸左手Trigger按键,按键角度:" + value);

            Debug.Log("触摸左手Trigger按键,按键角度:" + value);

        }

        if (Input.GetAxis("LGrip")>0)

        {

            //Grip按键的值松开时为0,按下时为1,没法取得中间值。

            Debug.Log("按下左手Grip按键");

        }

 

  以上需在update中轮询监听,经测试,Axis输入的值准确度有差别,具体缘由未知。

 

其余经常使用API

  1. InputTracking类:

     InputTracking.nodeAdded += (XRNodeState nodeState) => { Debug.Log("设备链接:" + nodeState.nodeType.ToString());  };  每当有设备链接时便会执行此设备,设备类型包含:左眼,右眼,中间的眼,左右控制器等。

InputTracking.nodeRemoved += (XRNodeState nodeState) => { Debug.Log("设备断开链接:" + nodeState.nodeType.ToString()); }; 当设备断开链接时会执行的事件

  InputTracking.trackingAcquired 设备正确响应时会执行的事件

  InputTracking.trackingLost 设备定位丢失时会执行的事件

设备位置和旋转的获取。

          2.其他VR设置相关的有 XRSetting和XRDevice等能够在Unity帮助内查看。

2、SteamVR 2.0.1

1. 基础环境配置

       在Assets Store中下载最新版的SteamVR插件,导入完成后直接在project面板中查找Player便可,将其拖到场景中便可实现基础的浏览。

2.手柄按键事件系统

1)  事件配置

比较老版本的事件,如今的事件系统更加灵活,但基础添加更加依赖于配置。以手柄的触摸板为例,有点击、触摸、触摸位置3个事件能够编辑,其编辑步骤为:

第一步:

打开window下的 SteamVRInput编辑界面,

通常是默认选中 default事件的,不用更改。

Actions 下In则为要输入的事件,out为输出事件。通常系统会默认一系列事件不须要可直接删除。

点击In里面的“+”:

Name为当前事件的名字,Type为事件的返回值类型,Required目前测试3种选择没有区别,Localized String直接设置为当前事件的名字同样便可。

这里定义了一个触摸板触摸的事件,触摸板是否触摸返回的类型为bool因此类型选择为boolean,编辑完成以后点击save and generate按钮便可。以后程序便会生成一个对应类型的Action类打包成 .assets文件,并把类的定义写入到SteamVR_Input_ActionSet_default_In

 触摸板触摸位置获取事件定义以下:

第二步:将按钮和事件进行绑定

点击 Open binding UI按钮,打开编辑界面以下:

点击 Edit按钮进行编辑:

 

若是两个手柄的事件是同样的则勾选 Mirror Mode按钮,若是须要分别编辑则不须要勾选此按钮。

Left Vive Controller下面的则为左手柄事件编辑界面,下拉界面找到以下位置:

此为触摸板编辑界面,将鼠标移入在左下角会显示编辑按钮,点击按钮进行编辑。

点击Touch后面的None:

点击 TouchPadTouch,绑定触摸事件。而后再按上述步骤绑定触摸位置获取事件,最终按钮事件绑定以下:

点击对号按钮保存编辑。点击

按钮,点击save便可保存。其他手柄按钮事件皆能够此为例进行编辑。

相较于老版本的事件系统,此事件系统能够方便的对不一样的手柄设备进行匹配,减小不一样手柄时代码上的更改。

2)  手柄按键事件调用

调用代码示例:

3.  SteamVR示例场景Interactions_Example场景解读

参考文件:http://www.cnblogs.com/lys12138/p/9849115.html

  1. 利用官方例子实现与物体的基础交互

手柄与物体的交互包括碰到物体,移出物体,和抓住物体。

相关脚本为:

Interactable,控制抓取物体时物体和手柄的状态。

InteractableExample:基础的交互。

  1. 基础的UI交互。

目前SteamVR所支持的交互只限于button按钮,须要在button上添加boxcollider和UIElement,这样就能实现手柄去触摸UI按钮而后点击。目前不支持射线点击UI。要实现射线点击UI须要对EventSystem进行修改。

  1. 射线移动

官方射线移动相关的预制体为Teleporting,关键的脚本为: Teleport和Teleport Arc用于控制角色移动,检测是否可移动。能够移动的地点物体上须要添加脚本:TeleportArea(根据物体的碰撞进行断定是否能够移动)

        

       

        备注:该版本的SteamVR解决了角色在墙边穿模问题,也就是说如今的角色没法再穿越墙体碰撞。不须要使用角色碰到墙体屏幕变黑来提醒角色。

 

底层 API OpenVR:

OpenVR十二个驱动接口:https://blog.csdn.net/dabenxiong666/article/details/68954398

 

Unity插件(SteamVR深度分析)http://gad.qq.com/article/detail/27028

--基于steamVR 1.10版本,有关于 OpenVR api部分讲解。

 

API Document: https://github.com/ValveSoftware/openvr/wiki/API-Documentation

相关文章
相关标签/搜索