unity&HTC VIVE的VR编程学习
HTC VIVE安装教程与解析参考链接:https://www.vive.com/cn/forum/2748?1
[*]定位器(切记:在使用设备过程中不要移动,应该在使用之前定位好,否则恢复很麻烦)
[*]头戴设备(无需充电,有线连接)
[*]操控手柄(即控制器,需要充电,无线连接(带充电器,指示灯橙光正在充电,白光已充满。如果使用中不能看到手柄,有可能是没有电导致))
VR开发学习
项目学习参考链接:https://www.raywenderlich.com/9189-htc-vive-tutorial-for-unity
[*] 安装Steam,注册账号,在Steam中安装SteamVR
Steam是一个成熟的VR游戏售卖平台,SteamVR是HTC VIVE在电脑上运行的必备软件。此外可以试试VIVEPORT。
[*] 安装unity,在Asset Store下载导入SteamVR Plugin插件(在Assets文件夹中多了一个SteamVR文件夹),Hierarchy窗口出现如下两个实体:
has a Steam VR_Render component attached that handles the rendering of all VR cameras.
is more interesting because it controls the Vive’s headset and controllers.
图1.Assets中的SteamVR文件夹对应于SteamVR Plugin插件
VR项目开发
其他不多说,教程讲解都非常详细,这里只强调教程中忽略的两个问题:(1)controller中Steam VR_Behaviour_Pose(Script)组件中Pose Action属性设置问题;(2)控制手柄在运行场景中的可见性问题。
(1)Pose Action中的属性没有 \actions\default\in\SkeletonLeftHand选项?
图2.controller中Steam VR_Begaviour_Pose(Script)组件中Pose Action属性
(2)在运行场景中看不到控制手柄。
第一个问题出在动作定义,第二个问题出在动作绑定(将定义的动作绑定到硬件实体--控制手柄)。
问题分析:
在SteamVR Unity Plugin中有个Input System(对应于SteamVR_Input,后来我才发现原来插件中有介绍文档(图3)),用于实现HTC VIVE与虚拟场景中的实体进行交互。实现交互包括三个步骤:定义动作(在unity中的Window->SteamVR Input中定义,见图4),绑定动作(在本地托管的页面绑定,见图6),使用动作(写C# Scripts,即在VS2019中写C#脚本组件实现)。
图3.SteamVR Unity Plugin文档
图4.unity中SteamVR Input的Window
[*]定义动作(看第一个文档)
[*]Boolean : Actions that are either true or false, on or off. Example use: grab.
[*]Single / Vector1 : Actions that have a value between 0 and 1. Example use: movement speed.
[*]Vector2 : Actions that have an X and Y value between 0 and 1. Example use: direction.
[*]Vector3 : Actions that have an X, Y and Z value between 0 and 1. These actions are very uncommon.
[*]Pose : Actions that represent a position and rotation in 3D space. These actions are used to track VR controllers and the HMD.
[*]Skeleton : Actions that use the SteamVR Skeleton Input system to estimate where the player’s fingers are when holding the VR controller. This provides joint positions and rotations for every finger, regardless of the controller’s tracking fidelity.
所以控制手柄的可见性是由Pose类型决定的,也就是说只有把SkeletonLeftHand的Type设置为Pose,才能在controller中Steam VR_Begaviour_Pose(Script)组件中Pose Action属性的下拉框中看见 \actions\default\in\SkeletonLeftHand选项,至此第一个问题解决。
补充:在图4页面中主要分为三部分(包含关系从大到小):Action Sets,Actions,Action Details,这个和图6中的页面是一一对应的。
在图4的基础上点击Save and generate按钮保存修改的动作定义,再点击Open binding UI按钮进入本地托管的页面(见图5)进行动作绑定。图5界面有控制器选择,官方按键设置,还有自己本地的按键设置。这里的当前控制器选择Vive Controller,编辑当前的按键设置。然后就进入到当前按键设置的动作绑定了(见图6)。
图5.点击Open binding UI按钮进入本地托管的页面 (主要包括控制器类型选择、按键设置选择。默认的动作定义对应于官方按键设置)
图6.编辑当前按键设置(第一排对应于图5中的Action Sets)
图7.手柄控制器的具体硬件输入
2.绑定动作
解决第一个问题后,运行项目,在游戏场景中并不能看到对应的虚拟手柄,即出现了第二个问题。这时候就需要对定义的动作进行绑定。见图6选择默认的Action Sets,中间部分图6和实体(图7)也是一一对应的。其中,常见对Touchpad,Hair Trigger,Grip进行动作绑定。图6似乎没有对Pose动作绑定,那怎么解决问题2?这里对图6,取消镜像模式,点击“编辑动作姿态”,就可以对Pose进行动作绑定了!!!这时候该页面,点击“替换默认按键设置”,关闭本地托管页面,运行项目,控制手柄就可见了!!!
图8.对Pose进行动作绑定
3.使用动作
接下来就开始写C#组件使用绑定的动作实现与虚拟场景交互。主要包括两部分:抓取物体、制作激光笔实现瞬移传送。然后将写好的C#脚本组件挂到手柄控制器上,设置Public属性值即可。关于这部分感触就是:定义状态属性(可抓取的物体、可传送的地点)、实现(抓取、瞬移传送)动作,在Update中监听输入源(左右手柄控制器)是否触发绑定的按键且有满足条件的游戏对象(可抓取的物体、可传送的地点),如若二者满足则执行实现的(抓取、瞬移传送)动作。
页:
[1]