SteamVR插件详解一:SteamVR_Controller脚本

2023-10-15 02:38

本文主要是介绍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脚本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/214817

相关文章

Mysql数据库聚簇索引与非聚簇索引举例详解

《Mysql数据库聚簇索引与非聚簇索引举例详解》在MySQL中聚簇索引和非聚簇索引是两种常见的索引结构,它们的主要区别在于数据的存储方式和索引的组织方式,:本文主要介绍Mysql数据库聚簇索引与非... 目录前言一、核心概念与本质区别二、聚簇索引(Clustered Index)1. 实现原理(以 Inno

使用python生成固定格式序号的方法详解

《使用python生成固定格式序号的方法详解》这篇文章主要为大家详细介绍了如何使用python生成固定格式序号,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录生成结果验证完整生成代码扩展说明1. 保存到文本文件2. 转换为jsON格式3. 处理特殊序号格式(如带圈数字)4

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D