自制OculusVR控制(一)——利用Unity的自带方法实现VR的控制输入
2017-11-26 15:24
716 查看
写在前面
目前进行OculusVR的开发一般有两种选择,使用SteamVR插件或者使用Oculus官方的SDK,但是今天,要给大家分享的并不是使用这两种插件的经验,而是要给大家分享第三种方法,不使用其他需要导入的插件,仅使用Unity主体功能,自己配置打造Oculus的输入控制,下面就让我们开始动手做一个我们自己的VR控制插件吧。实现流程
使用的Unity版本为2017.1.0f31 创建一个新工程
按下图创建一个VRPlayer并重命名,其中HMD是Main Camera,其余皆是空物体,坐标均在世界坐标系原点
2 开启Unity内置对Oculus的支持
点击Edit->Project Settings->Player打开PlayerSettings窗口,找到Other Settings一栏中的Virtual Reality Supported,勾选并添加Oculus一项,如下图所示。
开启了这一项后,我们观察HMD会发现摄像机中多了一项Target Eye,这就是代表摄像机看到的画面将会作为头显中显示画面,但要注意如果场景中有多个摄像机的话,一般头显里看到的是层级中的第一个摄像机,但是Transform依然会被控制,所以如果需要多个摄像机的话,需要将其余的摄像机的该项设置为None。
3 为手柄添加追踪标识
新建脚本VRObjectTracking.cs,这里会用到UnityEngine.VR命名空间,这里面包含了VR的相关设置与使用的类,我们需要声明一个VRNode,这是一个枚举,主要枚举了设备输入的节点类型,包括左眼,右眼,头,左手,右手等。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.VR; public class VRObjectTracking : MonoBehaviour { public VRNode node; void Update () { //每一帧更新该节点的位置和旋转 transform.localPosition = InputTracking.GetLocalPosition(node); transform.localRotation = InputTracking.GetLocalRotation(node); } }
接下来为LeftHand与RightHand添加这个脚本,并将Node的值分别改为LeftHand与RightHand,然后在这两个物体下新建两个Capsule胶囊体,示意为手柄,运行即可看到目前即已完成了VR的头显显示与手柄的追踪功能,是不是很简单,并没有想象中的复杂。
4 实现手柄按键输入控制
在上一步我们已经实现了手柄的移动功能,接下来就是实现手柄按键的输入功能了。在此之前我们需要做一点准备工作,配置InputManager,从Edit->Project Settings->Input点击,打开InputManager配置界面,通过配置InputManager我们可以将手柄的按键映射到我们指定名称的输入轴。这里我们先配置两个按键,左手的IndexTrigger键(扳机键)与HandTrigger键(抓取键)。按下图进行配置。
配置完成后新建VRInput.cs脚本,编写脚本如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class VRInput : MonoBehaviour { private void Update() { if (Input.GetAxisRaw("PrimaryIndexTrigger") > 0f) { Debug.Log("按下左手IndexTrigger键"); } if (Input.GetAxisRaw("PrimaryHandTrigger") > 0f) { Debug.Log("按下左手HandTrigger键"); } } }
将该脚本添加至VRPlayer对象上,运行程序,分别按下左手手柄的这两个键,即可看到按键已成功触发日志输出
至此,就已经实现VR控制的基本输入啦,当然除了Oculus的手柄的按键非常多,除了普通手柄有的菜单、摇杆、扳机、抓取键之外,Oculus还有A、B、X、Y以及触摸输入、靠近输入等。所有按键的配置如下图所示。当然如果大家嫌配置麻烦,Ray这里已经准备好了配置好的文件,下载后替换工程目录下的ProjectSettings文件夹下的同名文件即可。
链接:http://pan.baidu.com/s/1nv5jpqD 密码:6n3s
写在最后
这里是使用Oculus来测试的,但是这个方法同样适用于HTC Vive,通过InputManager配置指定输入轴的方法可以适用于许多有控制器输入的设备,大家可以一起多做尝试。通过这种方法可以自己定制自己的VR输入控制,不过相比于完善的插件而言可能在一开始需要花许多时间去构建。希望能给大家带来一些帮助。相关文章推荐
- IoC实践--用Unity实现MVC5.0的IoC控制反转方法
- 利用管道实现sudo命令免输入密码的方法
- unity中结合oculus制作VR场景控制相机的移动的三种方式
- JAVAWEB开发之Servlet3.0新特性的使用以及注解的详细使用和自定义注解的方法、动态代理的使用、利用动态代理实现细粒度的权限控制以及类加载和泛型反射
- Unity简单利用屏幕坐标转换实现鼠标控制物体移动
- Go语言利用time.After实现超时控制的方法详解
- TCP套接口利用TCP自带的 SO_KEEPALIVE选项实现指定时间检测是否激活状态的方法
- UITextFiled & UITextView 控制输入长度、中文处理以及UITextView 的placeHolder 的一种实现方法
- Unity中不用自带重力实现跳跃的方法
- 利用管道实现sudo命令免输入密码的方法
- 利用C语言来实现交换两个变量的值,由终端输入两个整数给变量x、y,然后交换x和y的值后,输出x和y。 有不同的方法
- unity实现3d摇杆 结合leapmotion控制实现VR场景移动
- C#利用反射调用基类私有方法 及 Unity实现自定义InputField
- JavaScript控制输入框中只能输入中文、数字和英文的方法【基于正则实现】
- struts2利用异常处理实现权限控制的两种方法
- 在ASP.Net中两种利用CSS实现多界面的方法. (转)
- 在ASP.Net中两种利用CSS实现多界面的方法. (转)
- ★ 如何利用TWAIN实现对光栅图像输入设备(扫描仪、数码相机...)的程序设计(1) ---孙涛---
- 蛙蛙请教:如何利用委托实现多个方法同时调用.
- 利用css里expression来实现界面对象的批量控制