Unity新版本VR以及SteamVR基础
一、Unity2018新版本VR
Unity 简单VRDemo搭建
Unity环境搭建:
PlayerSetting设置如下:

启动虚拟现实驱动,sdk选择OpenVR。HTC Vive只支持OpenVR。
Unity Input设置:
官方手册设置说明: https://docs.unity3d.com/Manual/OpenVRControllers.html
按照手册进行配置,左手菜单按钮设置为:

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

Y轴设置:

其余按钮以例根据官方手册在Input中进行配置即可。
基础运行场景搭建
基础环境配置配置完成,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
- 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帮助内查看。
二、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
- 利用官方例子实现与物体的基础交互
手柄与物体的交互包括碰到物体,移出物体,和抓住物体。
相关脚本为:
Interactable,控制抓取物体时物体和手柄的状态。
InteractableExample:基础的交互。
- 基础的UI交互。
目前SteamVR所支持的交互只限于button按钮,需要在button上添加boxcollider和UIElement,这样就能实现手柄去触摸UI按钮然后点击。目前不支持射线点击UI。要实现射线点击UI需要对EventSystem进行修改。
- 射线移动
官方射线移动相关的预制体为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
Unity新版本VR以及SteamVR基础的更多相关文章
- 如何有效提升Unity Gear VR游戏性能
http://www.vr186.com/vr_news/vr_technical_area/1093.html 好的,所以你决定用 Unity 来做一个 VR 游戏,并选定了三星 Gear vr 为 ...
- 使用UE4/Unity创建VR项目
一.主要的步骤是说一下使用UE4,在此之前先说一下使用unity创建的VR项目 1.unity创建oculus rift dk2项目 在unity中创建一个简单的场景,让摄像机能看见场景中的物体,不对 ...
- unity室内外VR漫游
这是一个用Unity 做的VR漫游小场景.
- Unity开发VR——Oculus Rif_将Oculus接入Unity
该文档基于 Unity2018.3.12f1 1. 搭建简单场景 2. 设置,选择 Edit - Project Setting(若已经勾选,就去掉在勾选一次) 完成该步骤之后,可以带上Oculus头 ...
- 【Unity】6.1 Unity中的C#脚本基础知识
分类:Unity.C#.VS2015 创建日期:2016-04-16 一.简介 1.常用的C#数据类型 这里简单介绍用Unity开发游戏时,最常用的一些数据类型. (1)基本类型 int.float. ...
- 延迟是AR/VR体验的基础
原文: http://blogs.valvesoftware.com/abrash/latency-the-sine-qua-non-of-ar-and-vr/ 译者注: 原文发表于2012年, 尽管 ...
- Unity面试技巧之C#基础
1. 定义常量最好使用运行是常量就是readonly 编译常量就是 const public static readonly MyClass myClass = new MyClass(); publ ...
- SteamVR Unity工具包(VRTK)之激光和移动
简单激光指针(VRTK_ SimplePointer) 简单指针(Simple Pointer)脚本从控制器尾部发出一个有色光束来模拟激光束.这在场景中指向对象很有用,它能判断所指向的对象以及对象距控 ...
- SteamVR Unity工具包(VRTK)之概览和控制器事件
快速上手 · 克隆仓库 git clone https://github.com/thestonefox/SteamVR_Unity_Toolkit.git · 用Unity3d打开SteamVR_ ...
随机推荐
- RabbitMQ学习以及与Spring的集成(一)
本文记录RabbitMQ服务的搭建过程. 想要使用RabbitMQ消息中间件服务.首先要安装RabbitMQ,可以在:https://www.rabbitmq.com/download.html根据安 ...
- java微信小程序解密AES/CBC/PKCS7Padding
摘要:微信小程序解密建议使用1.6及以上的环境使用maven下载jar包org.bouncycastlebcprov-jdk15on1.55加密类代码importorg.bouncycastle.jc ...
- Java8系列之重新认识HashMap(转)
原文出处: 前利 简介 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap.Hashtable.LinkedHashMap和Tree ...
- virtualbox+vagrant学习-2(command cli)-10-vagrant Port命令
Port 格式: vagrant port [options] [name|id] 端口命令显示映射到主机端口的客户端口的完整列表 userdeMacBook-Pro:~ user$ vagrant ...
- 解析Array.prototype.slice.call(arguments)
在es5标准中,我们经常需要把arguments对象转换成真正的数组 // 你可以这样写 var arr = Array.prototype.slice.call(arguments) // 你还可以 ...
- C库函数重定向问题
C库函数重定向用户能定义自己的C语言库函数,连接器在连接时自动使用这些新的功能函数.这个过程叫做重定向C语言库函数,如下图所示.举例来说,用户有一个I/O设备(如UART).本来库函数fputc()是 ...
- 一个牛公司的关于oracle数据的面试题
我也忘记是从哪里download的了,为了加深记忆,也为了完成我的博客,我决定写进博客里,如果有错误,欢迎大家指正,谢谢. 问题一. 解释一下sum的作用? 答:求符合条件的记录某数值字段的和. 问题 ...
- Bootstrap02
Bootstrap02_内容概述 一.排版样式 (下面示例*代表class) 1.段落突出 *=lead <p>山外有山,<span class="lead"& ...
- 记一次Apache Carbondata PR的经历
前言 前段时间有幸接触到Apache Carbondata,试用过程中发现了一个小小的问题,并且又很快的定位到了问题.然后在社区群里反映了下,负责人问愿不愿意提个JIRA,PR,然后我在没有任何开源 ...
- springboot-web进阶(一)——表单验证
一.概述 1.准备 先把快速入门篇的结构调整一下,按照自己的喜好或者要求调整: 2.需求 基于快速入门篇增加一个女生的需求,禁止添加未成年(18岁以下) 3.实现 第一步:在bean的属性上加对应约束 ...