Gear VR Controller设备Button响应小例子
来源:互联网 发布:js实现select联动 编辑:程序博客网 时间:2024/05/16 14:00
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版本。这个再官方文档也能查到。
- 新建工程,导入Oculus Utilities包。
- 从预制体中拖一个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内容很简单,判断当前输入设备是左手还是右手还是其他,并显示模型。
总结
- 有的Down事件在按键抬起的时候响应,比如OVRInput.Button.One在眼镜上的响应,OVRInput.Button.DpadXXXXX在controller触摸板上的滑动。等等。
- Get事件有的是抬起触发,有的是按下触发。
可以发现有些Down和Get事件并不是和按键动作匹配,我用的unity5.6.0f3,ovr_unity_utilities_1.13.0。
如果要做眼镜的触摸板输入与Controller的输入响应兼容,必须做一次完整测试
另外本文只是测试了一下OVRInput.Button,没有测试获取 Controller的角度信息,有时间可以测试一下。
OVRInput.GetLocalControllerPosition(OVRInput.Controller.LTouch);
补充
触摸响应:
//在Controller上:把触摸板按中心点画坐标轴,范围(-1,-1)到(1,1);//在HeadSet上按下没反应,不管Down点在哪,滑动后从(0,0)开始依据滑动方向变化v = OVRInput.Get(OVRInput.Axis2D.PrimaryTouchpad);text.text = str + "Get : PrimaryTouchpad : " + v;
- Gear VR Controller设备Button响应小例子
- 华为正式发布VR眼镜设备,这次走的是Gear VR模式 | VR陀螺
- 【VR】如何用Gear VR打造虚拟现实
- 如何提高Unity Gear VR游戏性能
- unity3d 编码示例为 Gear VR
- QUICK START GUIDE: GEAR VR + UNITY
- Gear VR 入门教程之一 Hello World
- Unity下Gear VR界面的实现
- Oculus Mobile 端Gear VR 开发
- Android Studio导入GEAR VR framework
- Gear VR推出移动冒险InMind 2
- 如何提高Unity Gear VR游戏性能
- java button tooltip的一个小例子
- 三星Gear VR体验:设置简单 耗电感人
- 三星Gear VR与Oculus Rift DK2全方位比拼
- 虚幻4引擎Gear VR开发入门(上)
- 虚幻4引擎Gear VR开发入门(下)
- 如何有效提升Unity Gear VR游戏性能
- 关于 liferay 框架 后台需要获取不带namespace命名空间参数的 方法
- MongoDB(三)——增删改查
- 音频,视频和视觉效果
- 25.求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。AC
- yii2-Active Record curd
- Gear VR Controller设备Button响应小例子
- Linux下搭建spark集群开发环境
- 如何修改CentOS7系统网卡名?
- ActivityThread.java
- android 拦截短信并自动输入
- 第3章 编程问题 3.2节 3
- MongoDB(四)——管理架构
- 数据库相关
- 小程序端JS加密,传输PHP端解密--微信小程序联盟