HTC View 手柄操作简介
核心类简介:
SteamVR_TrackedObject
此类用于根据硬件设备,并为硬件设备分配相应的索引
SteamVR_Controller.Device
最重要的类,封装了跟踪设备的全部信息,例如手柄的各种交互相应勾动扳机等。
SteamVR_Controller.ButtonMask
手柄各按键的名称
SteamVR_Controller
此类通常使用静态方法Input根据设备索引值获取对应的设备(Device)对象
HTC View 手柄按键简介:
每个按钮的名称都在ButtonMask中定义好了:
public class SteamVR_Controller
{public class ButtonMask{public const ulong System = (1ul << (int)EVRButtonId.k_EButton_System); // reservedpublic const ulong ApplicationMenu = (1ul << (int)EVRButtonId.k_EButton_ApplicationMenu);public const ulong Grip = (1ul << (int)EVRButtonId.k_EButton_Grip);public const ulong Axis0 = (1ul << (int)EVRButtonId.k_EButton_Axis0);public const ulong Axis1 = (1ul << (int)EVRButtonId.k_EButton_Axis1);public const ulong Axis2 = (1ul << (int)EVRButtonId.k_EButton_Axis2);public const ulong Axis3 = (1ul << (int)EVRButtonId.k_EButton_Axis3);public const ulong Axis4 = (1ul << (int)EVRButtonId.k_EButton_Axis4);public const ulong Touchpad = (1ul << (int)EVRButtonId.k_EButton_SteamVR_Touchpad);public const ulong Trigger = (1ul << (int)EVRButtonId.k_EButton_SteamVR_Trigger);}
}
实际上在SteamVR_TrackedObject类枚举类型EIndex中,已经预先定义了16个设备索引,头盔默认索引为0
using UnityEngine;
using Valve.VR;public class SteamVR_TrackedObject : MonoBehaviour
{public enum EIndex{None = -1,Hmd = (int)OpenVR.k_unTrackedDeviceIndex_Hmd,Device1,Device2,Device3,Device4,Device5,Device6,Device7,Device8,Device9,Device10,Device11,Device12,Device13,Device14,Device15}
}
简单示例:
1,通过手柄游戏对象上的SteamVR_TrackedObject组件进行获取,,,
//获取跟踪对象 此时通过trackObj.index 就可以访问到设备对象
SteamVR_TrackedObject trackObj = this.GetComponent<SteamVR_TrackedObject>();
2,通过找到索引获取到设备(Device)对象,
这时就用到了SteamVR_Controller.Input方法传入上面获取的到设备索引,就可以访问到设备中的方法,相应手柄操作,,,
//通过设备索引获取到相应设备对象Device
SteamVR_Controller.Device device= SteamVR_Controller.Input((int)trackObj.index);
3,调用Divice中的相应函数,来获取手柄的按键操作,,,
按键: Device.GetPressDown(按下) / GetPressUp(抬起) / GetPress(一直按)
触摸键:Device.GetTouchDown / GetTouchUp / GetTouch
void Update
{//按下Tigger键if(device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger){Debug.Log("您按下了Trigger");}
}
触摸板:
通过获取用户触摸操作,然后根据当前的状态进行获取,,,Touchpad圆盘坐标是和平面直角坐标系一致,,上下和左右都是(-1,1)值,,,
void Update
{//按下Touchpad键if(device.GetPressDown(SteamVR_Controller.ButtonMask.Touchpad){Debug.Log("您按下了Touchpad");}
}
手柄的震动: TriggerHapicPulse
手柄震动是通过TriggerHapicPulsefangf ,第一个参数可以理解为震动强度,默认500,不要超过4000,,第二个参数默认就好,不用填写
简例:按下Trigger触发震动:
private SteamVR_Controller.Device device;
void Strar(){
//获取设备
device = SteamVR_Contorller.Input((int)GetComponent<SteamVR_TrackedObject>().index)
}
void Update{if(device.GetPress(SteamVR_Controller.ButtonMask.Trigger)){device.Trigger.TriggerHapicPulse(1000);}
}
Device常用属性:
valid:GetControllerStateWithPose() 函数调用是否成功;
connected:判断设备是否连接
hasTracking :判断设备是否正常跟踪
结果得到三个参数:
outOfRange:判断设备是否超出范围
calibrating:判断设备是否正在校正
uninitialized:判断设备是否未初始化
transform:获取的结果是包含12个元素的一维数组,通过SteamVR_Utils.RigidTransform函数将12元素重组为3×4的矩阵针对Unity的坐标系进行修正,同时添加了怼position和rotation的方便的引用
velocity和angularVelocity:两个速度也针对Unity的坐标系进行修正,Lighthouse跟踪的空间轴方向与Unity存在偏差,,,
上面描述所对应的SteamVR插件中写好的类:
public class Device//最重要的类,封装了跟踪设备的全部名称{public Device(uint i) { index = i; }public uint index { get; private set; }public bool valid { get; private set; }//GetControllerStateWithPose()函数调用是否成功;public bool connected { get { Update(); return pose.bDeviceIsConnected; } }//判断设备是否连接public bool hasTracking { get { Update(); return pose.bPoseIsValid; } }//判断设备是否跟踪正常 //判断设备是否超出范围 public bool outOfRange { get { Update(); return pose.eTrackingResult == ETrackingResult.Running_OutOfRange || pose.eTrackingResult == ETrackingResult.Calibrating_OutOfRange; } }//判断设备是否正在校正 public bool calibrating { get { Update(); return pose.eTrackingResult == ETrackingResult.Calibrating_InProgress || pose.eTrackingResult == ETrackingResult.Calibrating_OutOfRange; } }//判断设备是否未初始化public bool uninitialized { get { Update(); return pose.eTrackingResult == ETrackingResult.Uninitialized; } }//获取的结果是包含12个元素的一维数组,通过SteamVR_Utils.RigidTransform函数//将12个元素重组为3X4矩阵并针对Unity的坐标系进行修正,同时添加了对position和rotation方便的引用public SteamVR_Utils.RigidTransform transform { get { Update(); return new SteamVR_Utils.RigidTransform(pose.mDeviceToAbsoluteTracking); } }//velocity和angularVelocity :这两个速度也针对Unity的坐标系进行修正,lighthouse跟踪的空间轴方向与Unity存在偏差。public Vector3 velocity { get { Update(); return new Vector3(pose.vVelocity.v0, pose.vVelocity.v1, -pose.vVelocity.v2); } }public Vector3 angularVelocity { get { Update(); return new Vector3(-pose.vAngularVelocity.v0, -pose.vAngularVelocity.v1, pose.vAngularVelocity.v2); } }
HTC View 手柄操作简介相关推荐
- oracle kepserve,Kepware.KEPServer\KEPServerEX_V5操作简介含opc quick client 连接测试
[实例简介] Kepware.KEPServer\KEPServerEX_V5操作简介含opc quick client 连接测试 3.開魯 KEPServereX的管理視窗 請從「開始」->「 ...
- Model、View和Controller简介
Model.View和Controller简介 Model主要是存储或者是处理数据的组件,Model其实是指要处理的业务处理和数据操作代码,如:CRUD(Create/Read/Update/Dele ...
- python中常见的流程结构-Python分支结构(switch)操作简介
Python当中并无switch语句,本文研究的主要是通过字典实现switch语句的功能,具体如下. switch语句用于编写多分支结构的程序,类似与if-.elif-.else语句. switch语 ...
- python分支switch_Python分支结构(switch)操作简介
Python当中并无switch语句,本文研究的主要是通过字典实现switch语句的功能,具体如下. switch语句用于编写多分支结构的程序,类似与if-.elif-.else语句. switch语 ...
- python中分支结构包括哪些_Python分支结构(switch)操作简介
Python当中并无switch语句,本文研究的主要是通过字典实现switch语句的功能,具体如下. switch语句用于编写多分支结构的程序,类似与if-.elif-.else语句. switch语 ...
- 作业一:数据软件系统的介绍及spss的操作简介
数据分析软件介绍 数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程.这一过程也是质量管理体系的支持过程.在实用中, ...
- HTC Vive 手柄
HTC Vive 手柄 HTC Vive 手柄的按键示意图 手柄 HTC Vive的重要交互手段,我们通过第一个图片应该对其有一个直观的了解了,总共是九个按钮: 第一个是菜单按钮 第二,三,四,五分别 ...
- 【ViveFocus使用WaveVR插件获取手柄操作事件】
ViveFocus使用WaveVR插件获取手柄操作事件 此文的诞生 一.插件必备WaveVR 二.场景中放置必要的预制件 三.代码获取手柄交互事件 结束语 此文的诞生 入职新公司,接手旧项目,程序猿不 ...
- JMeter入门操作简介
JMeter入门操作简介 1.JMter简介及作用 JMter是Apache公司用Java开发的一款测试工具 接口测试.性能测试.数据库测试.java程序测试. 可以对服务器.网络或者对象模拟巨大的负 ...
最新文章
- 那位五十多岁的创业者给我的启示!
- Chrome 调试 Android WebView 网页
- native react 集成微信登录_react native 接入微信登陆(Android)
- java对象数组覆盖_java – 如何覆盖RAML 1.0中的对象数组属性类型
- 5. Binary Tree Postorder Traversal
- matlab的数学函数,matlab中常见数学函数的使用
- html设置数组的方法,js改变原数组的方法有哪些?
- 关键词提取_tf_idf
- 如何在VS上用C#玩坏“Hello World”。
- Service Mesh-Linkerd安装与使用
- 《Excel与VBA程序设计》第四章新鲜出炉
- Java代码编写规范总结
- 一本书读懂大数据时代
- Proteus8.9 VSM Studio WINAVR编译器仿真ATmega16系列a09_扩展内存
- 喜欢艾弗森,退役了。。。
- 小问题--电脑开机一连上网就总是会安装各种软件的问题及解决
- 2021年危险化学品生产单位安全生产管理人员报名考试及危险化学品生产单位安全生产管理人员模拟考试
- 软件安装时出现Command line option syntax error?
- 谁让AI走进了隐秘的角落?
- 美国 AI 博士:什么都不会怎么学 Python?60 天知识脉络图,快速挑战 Python 全栈
热门文章
- 浅谈www.baidu.com和baidu.com
- 【Redis】懒惰删除
- 让我来问问你,Python不能做什么?
- 1630 - FUNCTION XXXX.now does not exist. Check the 'Function Name Parsing and Resolution' section in
- Apache Tomcat服务器安装配置和部署运行
- 推荐系统的召回算法(一)—— 协同过滤法(基于用户)
- 《制药企业设施设备运维管理与节能减排》专题会议 特邀讲师勃林格殷格翰首席工程师
- 2021年最新UI/UE设计软件全家桶
- 【BUG解决】 RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor)
- 木材加工(LintCode)