SteamVR插件详解一:SteamVR_Controller脚本
大家都知道现在基于Unity开发Vive的应用程序都需要用到SteamVR这个插件,接下来的系列会重点分析该插件中和开发相关的功能。首先介绍的是Vive手柄控制器开发的介绍,基本包含了手柄功能开发的所有信息。如有不全欢迎补充讨论。使用时需要注意的点我会用绿色标出了,对整个脚本执行过程不感兴趣的可以着重看一下绿色部分,开发时注意就好了。
关于控制器的相关信息都包含在SteamVR_Controller这个脚本之中。注意:SteamVR_Controller是非Monobehavior的脚本,并没有挂在场景下,其运行是通过SteamVR_Render脚本对于其中Update()函数的调用从而一直循环获取手柄相关信息。而SteamVR_Render脚本是在程序运行时自动加载至场景的。先来看看脚本的全貌吧。
ButtonMask类:手柄各按键的名称。
Device类:最重要的类,封装了跟踪设备的全部信息。
Update()函数:被SteamVR_Render脚本调用,更新各跟踪设备的信息。
Input()函数:根据Index初始化Device[]数组,并实例化所有16个Device。
DeviceRelation和GetDeviceIndex()结合获取特定的设备Index,如leftmost、rightmost。在SteamVR_TestController脚本中有使用到该函数获取用户的左右手手柄的Index。用该方法应该可以识别出用户所拿的手柄是哪一个。
下面着重分析Device类:
- l GetPress:按下按键一直触发
- l GetPressDown:按下按键只触发一次
- l GetPressUp:按下按键只触发一次
针对按键的三个函数,每种函数有两个重载,参数为ButtonMask或EVRButtonId类,第二种形式会将EVRButtonId转换为ButtonMask后调用第一种得到结果。
- l GetTouch
- l GetTouchDown
- l GetTouchUp
针对Touchpad的三个函数,一样的两种形式,同上不解释。
- l GetAxis()
获取Touchpad圆盘坐标或Trigger的行程值(0-1),函数默认参数是手柄上的Touchpad。共有5个AxisId参数可选,0是TouchPad,1是Trigger,2,3,4应该是没有用的,且此函数只接受EVRButtonId类参数而不接受ButtonMask。
- l TriggerHapticPulse
手柄震动控制函数,参数名称解释的是时间,默认500,但实际上控制的是震动的强度。默认AxisId是EVRButtonId_touchpad,选择其他EVRButtonId没用(等价参数axis0可以),其会调用OpenVR中的同名函数。参数超过4000会无效,导致震动不触发。可以通过协程的while(true)+waitforsecond控制震动间隔,通过stop协程控制震动结束。
- l GetHairTrigger
- l GetHairTriggerDown定义为有false转至true的过程,判断先前状态和当前状态。
- l GetHairTriggerUp 定义为有true转至false的过程,判断先前状态和当前状态。
这三个函数获取HairTrigger的状态,其值对应rAxis1.x的值。But什么是HairTrigger?形象点说就是像头发般轻轻的触发。HairTrigger是检测当你握住扳手超过一个固定值(0.1,可调)时即触发的状态。相当于利用Trigger的变化量来做一个功能的触发,很棒不是吗。轻轻碰一下Trigger使得行程大于0.1即可触发一个功能。
整个脚本的执行顺序如下:
- l Update();
- l Input()初始化16个设备的信息存储空间,并返回某个设备;
- l Device.Update():做两件事
1. GetControllerStateWithPose()调用OpenVR中的函数获取手柄状态和姿态。结果存在这两个变量State(VRControllerState_t)和Pose(TrackedDevicePose_t)中,由GetState()和GetPose()获取并由此返回一系列的可查询参数及各种Get函数。
各可查询参数说明如下(相当于对TrackedDevicePose_t中的参数翻译了下)
valid:GetControllerStateWithPose()函数调用是否成功;
connected:判断设备是否连接;
hasTracking:判断设备是否跟踪正常;
根据ETrackingResult的结果得到下面三个参数:
outOfRange:判断设备是否超出范围;
calibrating:判断设备是否正在校正;
uninitialized:判断设备是否未初始化;
transform:获取的结果是包含12个元素的一维数组,通过SteamVR_Utils.RigidTransform函数将12个元素重组为3X4矩阵并针对Unity的坐标系进行修正,同时添加了对position和rotation方便的引用。
velocity和angularVelocity:这两个速度也针对Unity的坐标系进行修正,lighthouse跟踪的空间轴方向与Unity存在偏差。
2. UpdateHairTrigger()。检测自定义的一种操作:轻按Trigger。
TBC:下面几个方面没有深入的研究,有兴趣的童鞋可以研究下,但知道上面的内容后应该已经可以随意访问控制器相关的信息了。
关于DeviceRelation和GetDeviceIndex()没有太多解释,可以深入挖一挖如何使用。
ButtonMusk及其他地方有用到很多按位进行的操作,可以补充一下相关知识。
Unity环境下空间坐标轴的修正原理没有研究:Unity使用的是左手坐标系,lighthouse的结果应该是右手坐标系,所以才会有速度的z分量相反和角速度x、y分量相反的结果。
SteamVR插件详解一:SteamVR_Controller脚本相关推荐
- steamvr自定义按键_SteamVR插件详解:SteamVR_Controller脚本分析+Vive控制器功能开发...
基于Unity开发Vive的应用程序都需要用到SteamVR这个插件,接下来这个系列会重点分析SteamVR插件中与开发相关的功能.首先介绍的是Vive手柄控制器开发的介绍,基本包含了手柄功能开发的所 ...
- Unity SteamVR插件详解:SteamVR Controller脚本分析+Vive控制器功能开发 ——转自波波...
看到一篇很好的Steam VR脚本的详细解析文章,为了方便自己以后找得到,特意转载了. 大家都知道现在基于Unity开发Vive的应用程序都需要用到SteamVR这个插件,接下来的系列会重点分析该插件 ...
- steamvr自定义按键_SteamVR插件详解:SteamVR_Controller
关于控制器的相关信息都包含在SteamVR_Controller这个脚本之中.注意:SteamVR_Controller是非Monobehavior的脚本,并没有挂在场景下,其运行是通过SteamVR ...
- Logstash(二)input、codec插件详解
input input 插件指定数据输入源,一个pipeline可以有多个input插件,我们主要讲解下面的几个input插件: - stdin- file- kafka Input Plugin – ...
- 我的世界服务器物品绑定插件,我的世界灵魂绑定插件详解
我的世界灵魂绑定插件详解.那下面给大家分享的是关于灵魂插件的用途详细介绍,还有关于我的世界服务器防止熊孩子盗窃插件用途介绍哦~希望对大家有所帮助. 游戏园我的世界官方群:325049520(已满)二群 ...
- Snort日志输出插件详解
Snort日志输出插件详解 Snort是一款老×××的开源***检测工具,本文主要讨论他作为日志分析时的各种插件的应用.Snort的日志一般位于:/var/log/snort/目录下.可以通过修改配置 ...
- Linux编写脚本nsum求和,详解Linux Shell脚本编写技巧,附实例说明
原标题:详解Linux Shell脚本编写技巧,附实例说明 Linux Shell是一个很难的知识板块.虽然大家都认真学,基本的语法很都掌握,但有需求时,很难直接上手编程,要么写了很久,要么写不好!对 ...
- maven常用插件详解
1. 简介 我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的.进一步说, ...
- Rollup常用插件详解
文章目录 系列文章 @rollup/plugin-node-resolve Options extensions @rollup/plugin-commonjs @rollup/plugin-babe ...
最新文章
- android接入支付宝提示支付取消的方法处理
- 那个计算机应用没有广告,为什么别人的电脑没有什么广告,而你的电脑一大堆呢?答案在这里...
- Hibernate学习总结【比较与Mybatis框架之间的区别】
- 【MaxCompute】学习笔记基础说明
- brackets如何自动生成html,Brackets编辑器怎样自动格式化HTML代..._网络编辑_帮考网...
- 鼠标键盘唤醒计算机,除了按下电源按钮唤醒计算机,WIN10也可以使用鼠标或键盘来唤醒...
- 阿里云数据库2020技术年报新鲜出炉,全力开启牛年新征程!
- spring +springmvc+mybatis组合web.xml文件配置
- javascript获取浏览器客户端IP
- 中国地质大学计算机地理信息学院,英文主页 软件工程、计算机科学与技术、地理信息科学等相关专业学生 中国地质大学(武汉)教师个人主页系统...
- 深圳惊现“马云网络有限公司” 网友:你好 我是马云公司CEO
- reStructuredText
- Python中的mkdir -p功能[重复]
- 【图像压缩】基于matlab DCT变换图像压缩【含Matlab源码 804期】
- java cmd 进程_关闭CMD进程-JAVA
- 【BZOJ】3613: [Heoi2014]南园满地堆轻絮-贪心
- 设置用户计算机的ip地址,电脑动态IP地址怎么设置
- 关于虚拟主机那点事儿
- python的datetime.date日期计算——计算当月第一天、当月最后一天、前月第一天、前月最后一天、次月第一天、次月最后一天、去年的当天日期等
- github的crx快速下载
热门文章
- mysql resultset用法_结果集(ResultSet)用法
- 8Manage HCM系统:助力移动互联网企业提升人才竞争力
- Oracle Spacial(空间数据库)sdo_Geom包的函数
- android 刷机攻略总览
- 面试python的理解_面试宝典:深入理解这110道python面试题,AI和大数据向你招手,下...
- OpenCV之 BGR、GRAY、HSV色彩空间色彩通道专题 【Open_CV系列(三)】
- python相关系数_python怎么计算偏相关系数?
- 手机奥斯卡:QQ手机管家夺影帝
- 第7章 跨程序共享数据,探究
- label标签for属性修改样式