Gear VR Controller设备Button响应小例子

2023-10-14 08:40

本文主要是介绍Gear VR Controller设备Button响应小例子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Gear VR Controller设备Button响应

本文介绍三星Gear VR的控制器Gear VR Controller的Button输入事件获取。之前一直使用的是Gear VR的触摸板,最近三星发布了配合眼镜使用的Gear vr Controller。使用蓝牙连接,内置陀螺仪,可以获取controller的方向。Oculus上有一篇文章介绍controller的,有兴趣的可以看看。另外这篇文章是官方文档。

设备

如下图:
1. Trigger是扳机键。
2. Clickable Trackpad是设备的触摸板,并且可以按下去,即有按键功能。
3. Home:返回到主菜单键。(系统保留,在眼镜上为返回键长按)
4. Volume:音量键(系统保留)
5. Back:返回键。

图片]![这里写图片描述

Develop

我是按照官方文档,利用unity+Oculus Utilities工具包实现的,不知道能否用原生代码实现。
需要注意的是Oculus Utilities必须支持你的unity版本。这个再官方文档也能查到。

  1. 新建工程,导入Oculus Utilities包。
  2. 从预制体中拖一个OVRCameraRig,再拖两个GearVRController到分别到LeftHandAnchor和RightHandAnchor下。(额外提一下OVRCubemapCaptureProbe可以在游戏运行时截取一张CubeMap)
    这里写图片描述
    3.写一个测试脚本
    注释中的HeadSet表示Gear VR眼镜
/// <summary>
/// Gear VR输入设备(HeadSet和Controller)输入识别
/// 1、OVRInput.Button.x
///     1.1、One ----> headSet上面触摸板的全部位置、controller上触摸板按键;
///     1.2、Two ----> controller和headSet上面的返回键;
///     1.3、DpadXXXXX  ----> controller和headSet上面触摸板滑动的方向;
///     1.4、PrimaryIndexTrigger  ----> controller扳机键
/// 2、Input
///     "Fire1"键 --- controller扳机键;controller触摸板按键;controller触摸板任意方向滑动;headSet的触摸板触碰到。  
/// </summary>
public class Main : MonoBehaviour
{[SerializeField] private Text text;//[SerializeField] private LineRenderer lineRenderer;//[SerializeField] private Transform pos1;//[SerializeField] private Transform pos2;private void Start(){//lineRenderer.positionCount = 2;//lineRenderer.material = new Material(Shader.Find("Particles/Additive"));//lineRenderer.startColor = Color.red;//lineRenderer.endColor = Color.blue;//lineRenderer.startWidth = 0;//lineRenderer.endWidth = 2;}private string str;void Update(){//lineRenderer.SetPosition(0, pos1.position);//lineRenderer.SetPosition(1, pos2.position);OVRInput.Controller activeCtrl = OVRInput.GetActiveController();//当前正在使用的控制器。OVRInput.Controller connCtrl = OVRInput.GetConnectedControllers();//目前连接的可以使用的控制器。str = "connect ctrl : " + connCtrl + " \n" +"activeCtrl : " + activeCtrl + " \n";#region Down//OVRInput.Button.One ----> headSet上触摸抬起后响应,controller按下即可响应。//OVRInput.Button.Two ----> 都是需要抬起才触发。//OVRInput.Button.DpadXXXXX  ----> 抬起手指时触发一次//OVRInput.Button.PrimaryIndexTrigger  ----> controller扳机键按下//"Fire1"键的Down事件被如下捕捉:1、controller扳机键按下;2、controller触摸板按键按下;3、controller触摸板任意方向滑动未抬起手指便触发; 4、headSet的触摸板触碰到。  if (OVRInput.GetDown(OVRInput.Button.DpadUp)){text.text = str + "down :     dPadUp";Debug.LogWarning(str + "     down :    dPadUp");}if (OVRInput.GetDown(OVRInput.Button.One)){text.text = str + "   down :     One";Debug.LogWarning(str + "      down :    One");}if (OVRInput.GetDown(OVRInput.Button.Two)){text.text = str + "   down :     Two";Debug.LogWarning(str + "      down :    Two");}//if (OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger))//{//    text.text = str + "   down :     PrimaryIndexTrigger";//    Debug.LogWarning(str + "      down :    PrimaryIndexTrigger");//}//if (Input.GetButtonDown("Fire1"))//{//    text.text = str + "down :     Fire1";//    Debug.LogWarning(str + "      down :    Fire1");//}#endregion#region Up//所有的事件都在指头抬起的时候触发//"Fire1":headSet和Controller的触摸板滑动后手指抬起,也可以触发Fire1的up事件。//if (OVRInput.GetUp(OVRInput.Button.DpadUp))//{//    text.text = str + "up :     dPadUp";//    Debug.LogWarning(str + "     up :     dPadUp");//}//if (OVRInput.GetUp(OVRInput.Button.PrimaryIndexTrigger))//{//    text.text = str + "up :     PrimaryIndexTrigger";//    Debug.LogWarning(str + "     up :     PrimaryIndexTrigger");//}//if (OVRInput.GetUp(OVRInput.Button.One))//{//    text.text = str + "up :     One";//    Debug.LogWarning(str + "     up :     One");//}//if (OVRInput.GetUp(OVRInput.Button.Two))//{//    text.text = str + "up :     two";//    Debug.LogWarning(str + "     up :     One");//}//if (Input.GetButtonUp("Fire1"))//{//    text.text = str + "up :     Fire1";//    Debug.LogWarning(str + "      up :    Fire1");//}#endregion#region Get //get事件在HeadSet//1、DpadUp:上滑,手指抬起时触发//2、PrimaryIndexTrigger:controller的扳机键按下即可触发//3、One:HeadSet触摸板手指抬起时触发;Controller触摸板按键按下触发//4、Two:按键抬起时触发。//5、Fire1:手指抬起时触发。//if (OVRInput.Get(OVRInput.Button.DpadUp))//{//    text.text = str + "Get :     dPadUp";//    Debug.LogWarning(str + "     Get :     dPadUp");//}//if (OVRInput.Get(OVRInput.Button.PrimaryIndexTrigger))//{//    text.text = str + "Get :     PrimaryIndexTrigger";//    Debug.LogWarning(str + "     Get :     PrimaryIndexTrigger");//}//if (OVRInput.Get(OVRInput.Button.One))//{//    text.text = str + "Get :     One";//    Debug.LogWarning(str + "     Get :     One");//}//if (OVRInput.Get(OVRInput.Button.Two))//{//    text.text = str + "Get :     two";//    Debug.LogWarning(str + "     Get :     One");//}//if (Input.GetButtonUp("Fire1"))//{//    text.text = str + "Get :     Fire1";//    Debug.LogWarning(str + "      Get :    Fire1");//}#endregion}
}

由于我之前的项目中用“Fire1”来识别触摸板的响应,所以也测试了”Fire1”在controller上的响应。

了解一下这个预制体上的脚本:
1. 预制体OVRCameraRig上挂载两个脚本OVRManager和OVRCameraRig。OVRManager中是一些VR硬件的功能接口,并且一个场景中只能有一个单例。要想获取OVRInput的事件,必须有挂载这个脚本。OVRCameraRig是unity和Camera之间的主要接口。
2. 预制体GearVrController上的OVRGearVrController内容很简单,判断当前输入设备是左手还是右手还是其他,并显示模型。

总结

  1. 有的Down事件在按键抬起的时候响应,比如OVRInput.Button.One在眼镜上的响应,OVRInput.Button.DpadXXXXX在controller触摸板上的滑动。等等。
  2. Get事件有的是抬起触发,有的是按下触发。

可以发现有些Down和Get事件并不是和按键动作匹配,我用的unity5.6.0f3,ovr_unity_utilities_1.13.0。
如果要做眼镜的触摸板输入与Controller的输入响应兼容,必须做一次完整测试


另外本文只是测试了一下OVRInput.Button,没有测试获取 Controller的角度信息,有时间可以测试一下。

OVRInput.GetLocalControllerPosition(OVRInput.Controller.LTouch);

补充
触摸响应:

//在Controller上:把触摸板按中心点画坐标轴,范围(-1,-1)到(11);
//在HeadSet上按下没反应,不管Down点在哪,滑动后从(00)开始依据滑动方向变化
v = OVRInput.Get(OVRInput.Axis2D.PrimaryTouchpad);
text.text = str + "Get :     PrimaryTouchpad : " + v;

这篇关于Gear VR Controller设备Button响应小例子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

简单的角色响应鼠标而移动

actor类 //处理移动距离,核心是找到角色坐标在世界坐标的向量的投影(x,y,z),然后在世界坐标中合成,此CC是在地面行走,所以Y轴投影始终置为0; using UnityEngine; using System.Collections; public class actor : MonoBehaviour { public float speed=0.1f; CharacterCo

Flutter Button使用

Material 组件库中有多种按钮组件如ElevatedButton、TextButton、OutlineButton等,它们的父类是于ButtonStyleButton。         基本的按钮特点:         1.按下时都会有“水波文动画”。         2.onPressed属性设置点击回调,如果不提供该回调则按钮会处于禁用状态,禁用状态不响应用户点击。

MVC(Model-View-Controller)和MVVM(Model-View-ViewModel)

1、MVC MVC(Model-View-Controller) 是一种常用的架构模式,用于分离应用程序的逻辑、数据和展示。它通过三个核心组件(模型、视图和控制器)将应用程序的业务逻辑与用户界面隔离,促进代码的可维护性、可扩展性和模块化。在 MVC 模式中,各组件可以与多种设计模式结合使用,以增强灵活性和可维护性。以下是 MVC 各组件与常见设计模式的关系和作用: 1. Model(模型)

JavaFX环境的搭建和一个简单的例子

之前在网上搜了很多与javaFX相关的资料,都说要在Eclepse上要安装sdk插件什么的,反正就是乱七八糟的一大片,最后还是没搞成功,所以我在这里写下我搭建javaFX成功的环境给大家做一个参考吧。希望能帮助到你们! 1.首先要保证你的jdk版本能够支持JavaFX的开发,jdk-7u25版本以上的都能支持,最好安装jdk8吧,因为jdk8对支持JavaFX有新的特性了,比如:3D等;

javaScript日期相加减例子

当前时间加上2天 var d = new Date(“2015-7-31”); d.setDate(d.getDate()+2); var addTwo=d.getFullYear()+”年”+(d.getMonth()+1)+”月”+d.getDate()+”日”; “控制台输出===============”+”当前日期加2天:”+addTwo; 使用这种方法,月份也会给你计算.

小程序button控件上下边框的显示和隐藏

问题 想使用button自带的loading图标功能,但又不需要button显示边框线 button控件有一条淡灰色的边框,在控件上了样式 border:none; 无法让button边框隐藏 代码如下: <button class="btn">.btn{border:none; /*一般使用这个就是可以去掉边框了*/} 解决方案 发现button控件有一个伪元素(::after

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

全英文地图/天地图和谷歌瓦片地图杂交/设备分布和轨迹回放/无需翻墙离线使用

一、前言说明 随着风云局势的剧烈变化,对我们搞软件开发的人员来说,影响也是越发明显,比如之前对美对欧的软件居多,现在慢慢的变成了对大鹅和中东以及非洲的居多,这两年明显问有没有俄语或者阿拉伯语的输入法的增多,这要是放在2019年以前,一年也遇不到一个人问这种需求场景的。 地图应用这块也是,之前的应用主要在国内,现在慢慢的多了一些外国的应用场景,这就遇到一个大问题,我们平时主要开发用的都是国内的地