1.设备的安装与配置 https://wenku.baidu.com/view/fa172fd7482fb4daa48d4b44.html?from=search

2.接入SDK、实现简单示例场景、更换手柄模型、实现手柄投掷功能
  导入SteamVR Plugin.unitypackage
  实现头盔观看功能
  更换手柄模型
    要点
      把物体拖到model同级目录,坐标归零
      在运行状态下调整模型的大小坐标和旋转值
      复制组件value,然后取消运行,粘贴value到物体上
  实现手柄投掷功能
    按下trigger键在手柄上生成一个物体,松开trigger键投掷出去

3.手柄脚本讲解
  手柄上各按键的输入
    扳机键:trigger
    菜单键(三横)menu:
    侧边键(两个一样):grip
    圆盘(可点可触摸):touchpad

  1. using UnityEngine;
  2. using System.Collections;
  3. using Valve.VR;
  4. using UnityEngine.iOS;
  5. using System.Runtime.CompilerServices;
  6.  
  7. public delegate void VRHandle();
  8.  
  9. public class VRInput : MonoBehaviour
  10. {
  11.  
  12. SteamVR_TrackedObject trackedObject;//获取手柄对象
  13. SteamVR_Controller.Device device;//定义手柄信息对象
  14.  
  15. public VRHandle onTrigger;
  16. public VRHandle onTriggerDown;
  17. public VRHandle onTriggerUp;
  18.  
  19. void Start()
  20. {
  21. // 首先要获取响应按键的设备
  22. trackedObject = GetComponent<SteamVR_TrackedObject>();
  23. device = SteamVR_Controller.Input((int)trackedObject.index);
  24. }
  25.  
  26. Vector2 startPoint;
  27. Vector2 endPoint;
  28. //获取触摸偏移 ,旋转左手零件库,小部件什么的。
  29. public float GetTouchPadDeltaPos(SteamVR_Controller.Device device)
  30. {
  31. if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis0))
  32. {
  33. endPoint = startPoint = device.GetAxis(EVRButtonId.k_EButton_SteamVR_Touchpad);
  34. }
  35.  
  36. //按下后滑动
  37. if (device.GetTouch(SteamVR_Controller.ButtonMask.Axis0))
  38. {
  39.  
  40. if ((device.GetAxis(EVRButtonId.k_EButton_SteamVR_Touchpad) - endPoint).sqrMagnitude > 0.01f)
  41. {
  42.  
  43. startPoint = endPoint;
  44.  
  45. endPoint = device.GetAxis(EVRButtonId.k_EButton_SteamVR_Touchpad);
  46.  
  47. //Vector2 deltaVector = endPoint - startPoint;
  48. //float deltaPosY = endPoint.y - startPoint.y;
  49.  
  50. float deltaPosX = endPoint.x - startPoint.x;
  51.  
  52. //使用delta
  53. //device.TriggerHapticPulse (1000); // 用这个可以震动手柄
  54. //target.Rotate (0, 0, deltaPosX * 100);
  55. return deltaPosX;
  56. }
  57. }
  58. return 0f;
  59. }
  60.  
  61. void Update()
  62. {
  63.  
  64. // Press 和 Touch 除了圆盘,其他基本通用 Touch可以直接响应圆盘
  65. // GetPressDown 和 GetTouchDown
  66. // GetPress 和 GetTouch ___ 类似键盘的GetKey
  67. // GetPressUp 和 GetTouchUp
  68. //以下不全写了,没必要,就主要以GetTouch 试一下所有按钮
  69.  
  70. //按下圆盘
  71.  
  72. if (device.GetPress(SteamVR_Controller.ButtonMask.Touchpad))
  73. {
  74. //打印触摸的位置
  75. print(device.GetAxis(EVRButtonId.k_EButton_SteamVR_Touchpad));
  76. }
  77.  
  78. // Trigger键
  79. if (device.GetTouch(SteamVR_Controller.ButtonMask.Trigger))
  80. {
  81. Debug.Log("我是手柄上的trigger键,保持按下状态");
  82. if (onTrigger!=null) {
  83. onTrigger ();
  84. }
  85.  
  86. }
  87.  
  88. if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Trigger))
  89. {
  90. Debug.Log("我是手柄上的trigger键,按下状态");
  91. if (onTriggerDown!=null) {
  92. onTriggerDown ();
  93. }
  94.  
  95. }
  96. if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Trigger))
  97. {
  98.  
  99. Debug.Log("我是手柄上的trigger键,松开状态");
  100. if (onTriggerUp!=null) {
  101. onTriggerUp ();
  102. }
  103. }
  104.  
  105. //触摸圆盘
  106. if (device.GetTouch(SteamVR_Controller.ButtonMask.Touchpad))
  107. {
  108. Debug.Log("我是左手柄上的触摸屏,手指保持触摸状态");
  109. }
  110.  
  111. // 菜单键 (三横线)
  112. if (device.GetTouch(SteamVR_Controller.ButtonMask.ApplicationMenu))
  113. {
  114. Debug.Log("我是手柄菜单键,保持按下状态");
  115. }
  116.  
  117. //手心键(随便取个名^^) 左右两边可以按但其实是一个键!
  118. if (device.GetTouch(SteamVR_Controller.ButtonMask.Grip))
  119. {
  120. Debug.Log("我是左手柄左右侧按键,保持按下状态");
  121. }
  122.  
  123. // 这些键位都有了!! 好像还有个System键把!!能用吗? 经过短时间测试,不要用,没效果不说,容易导致其他的都不灵还要重新连接手柄!
  124. //查看定义可以知道: public const ulong System= (1ul << (int)EVRButtonId.k_EButton_System); // reserved reserved了,reserved什么意思?保留! 不是留留给你的 ^ ^!
  125. if (device.GetTouch(SteamVR_Controller.ButtonMask.System))
  126. {
  127. print("你看不见我!");
  128. }
  129.  
  130. //以下三个获取 追踪设备的姿态(矩阵等信息),按键的状态等等,请自行研究,欢迎回帖补充
  131. device.GetPose();
  132. device.GetState();
  133. device.GetPrevState();
  134.  
  135. //还没完!继续
  136. // vive 有个Trigger键,有一定键程,那么你按下这个trigger到什么程度会触发呢?
  137. //经过测试,大概是 75%的样子!!(why?为什么要研究这个,有意义么? Of Course!)
  138. // 因为 device.GetHairTrigger(), hairTrigger:一触即发的意思!就是说Trigger键你可以轻轻一碰就能触发!
  139. if (device.GetHairTriggerDown())
  140. {
  141. print("看到我时,食指不要动,看你按到了多少?");
  142. }
  143. // 你肯定按了0.1,也就是10%的键程,我怎么知道?
  144. //print("因为你按了:" + device.hairTriggerDelta);
  145. // 那么,修改了hairTriggerDelta,是不是就修改了 一触即发的键程? √
  146.  
  147. //修改一触即发键程为一半,再按按试试看!
  148. if (Input.GetKeyDown(KeyCode.A))
  149. {
  150. device.hairTriggerDelta = 0.5f;
  151. }
  152.  
  153. // 最后!
  154. //Axis,轴
  155. //经测试,Axis0对应的是圆盘SteamVR_Controller.ButtonMask.Touchpad ,都可以用
  156. //Axis1,对应的是trigger键位!
  157. // 在SteamVR_Controller.ButtonMask类里面定义了还有2,3,4Axis呢,它们对于啥呢?
  158. //它们不对应啥,猜想一:这个是SteamVR!,又不是只给火腿肠vive专用,还有其他VR设备呢,如果其他设备手柄轴用的多呢?
  159. // 二:Axis2,3,4能对应菜单键和手心键吗?no no no , 感受一下轴和按钮的区别就明白了,轴一般是范围值,button是yes or no;
  160.  
  161. if (device.GetTouch(SteamVR_Controller.ButtonMask.Axis0))
  162. {
  163. Debug.Log("触摸盘");
  164. }
  165. if (device.GetTouch(SteamVR_Controller.ButtonMask.Axis1))
  166. {
  167. Debug.Log("trigger键");
  168. }
  169. if (device.GetTouch(SteamVR_Controller.ButtonMask.Axis2))
  170. {
  171.  
  172. }
  173. if (device.GetTouch(SteamVR_Controller.ButtonMask.Axis3))
  174. {
  175.  
  176. }
  177. if (device.GetTouch(SteamVR_Controller.ButtonMask.Axis4))
  178. {
  179.  
  180. }
  181.  
  182. }
  183.  
  184. //把圆盘划成4个象限区域按钮,强行用圆盘变出一些按钮以防按钮不够用!
  185. public enum TouchPadButton
  186. {
  187. Default,
  188. UpLeft,
  189. UpRight,
  190. DowmLeft,
  191. DownRight
  192. }
  193.  
  194. public TouchPadButton GetTouchButton()
  195. {
  196. TouchPadButton touchButton = TouchPadButton.Default;
  197. var device = SteamVR_Controller.Input((int)trackedObject.index);
  198.  
  199. if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis0))
  200. {
  201.  
  202. Vector2 pad = device.GetAxis(EVRButtonId.k_EButton_SteamVR_Touchpad);
  203. if (pad.x >= && pad.y >= )
  204. {
  205. touchButton = TouchPadButton.UpRight;
  206. }
  207.  
  208. if (pad.x >= && pad.y <= )
  209. {
  210. touchButton = TouchPadButton.DownRight;
  211. }
  212.  
  213. if (pad.x <= && pad.y >= )
  214. {
  215. touchButton = TouchPadButton.UpLeft;
  216. }
  217.  
  218. if (pad.x <= && pad.y <= )
  219. {
  220. touchButton = TouchPadButton.DowmLeft;
  221. }
  222.  
  223. }
  224. return touchButton;
  225. }
  226. }

4.手柄圆盘键的自定义划分
  将一个触摸板按照4象限划分成4个按键
    通过坐标轴值来划分
  将一个触摸板按照4象限旋转45度划分成4个按键
    通过斜率值或角度来划分

5.UI交互
  1.插件:Vive Input Utility.unitypackage 导入
  2.文档
    3DUI.docx

6.瞬移
  1.插件:Vive - teleport.unitypackage 导入
  2.使用文档
    瞬移.docx

HTCVive使用的更多相关文章

  1. HTCVIVE定位器更新之后,定位器指示灯不亮,重置基站固件操作指南。

    HTCVIVE定位器更新之后,定位器指示灯不亮,固件修复指南 建议您重置基站固件,操作如下:请您使用手机来拍照运行中基站的“激光发射器”面板,并且数一下是否有17颗LED灯,如果没有17颗,则基本可以 ...

  2. 惠普披甲过VR寒冬,花费巨资开发VR游戏

         2016被称为VR元年,各大公司都在积极推动该领域的研究,其中HTC.0culus.索尼的成绩是最高的,不仅推出了自家研发的头显,而且销量还很可观.惠普在VR领域自然也有所投入,但是并没有比 ...

  3. 如何透过HTC Vive拍摄Mixed Reality (混合现实)影片

    https://www.vive.com/cn/forum/1706?extra=page%3D1 也许你是一位开发者,想为自己的HTC Vive游戏制作酷炫的宣传片:或者你是游戏主播,想为观众带来高 ...

  4. VR定制 AR定制 就找北京动软VR开发团队(VR案例 AR案例)

    我们长期承接丰交互软件.游戏项目外包: VR/AR内容应用定制.VR.AR游戏项目外包(有主流测试硬件设备) VR全景应用.视频外包 请提供贵公司的信息,我们将提供高大上的VR案例欢迎联系我们给您提供 ...

  5. HoloLens外包团队:HoloLens有一个严重缺陷,但微软并不想改

    微软的HoloLens自公布以来,几乎获得了一边倒的赞美声.它使用了增强现实(AR)技术,在现实世界中叠加一层虚拟影像,能让人仿佛置身魔法世界.但从最新的Hololens硬件体验上看,它可能有一个致使 ...

  6. 承接Hololens游戏外包

    近日,微软宣布第三批微软Hololens开发者版开始发货,包括:头显.头显手提包和一个遥控器.前两批开发者版本分别在今年3月30日和5月9日开始发货的. 第三批AR头显Hololens开发者版发货 虽 ...

  7. 承接Hololens内容定制外包

    近日,微软宣布第三批微软Hololens开发者版开始发货,包括:头显.头显手提包和一个遥控器.前两批开发者版本分别在今年3月30日和5月9日开始发货的. 第三批AR头显Hololens开发者版发货 虽 ...

  8. 承接Unreal4外包虚幻外包,北京正规公司

    VR产业链的现状 去年Facebook 20亿美元收购虚拟现实技术Oculus VR,提高了大家对VR设备.而国内,红杉资本投资蚁视,更是引爆了资本市场对VR/AR 的关注.其中有四块是我们较为常见且 ...

  9. VR软件定制外包团队:国内设备开发公司已超90家

    昨日是UNITE 2015 BEIJING大会的第二天,相比于新手训练营和VR Day活动,昨天的大会更加注重分享和展示.Unity 创始人David Helgason在也大会上进行了Unity 5 ...

随机推荐

  1. django-内网项目上线测试部署步骤

    1.安装python环境 由于测试环境只有内网,所以在外网同系统上安装python. wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5 ...

  2. python中的新式类与旧式类

    在python2中,有新式类与旧式类的区别: 首先创建一个类: class Sb(object): pass 如果创建时继承自object,说明这是一个新式类,不写object,说明是一个旧式类: 那 ...

  3. 一直觉得用java很不顺心

    一直觉得用java很不顺心,今儿想明白一个事情.如果把汇编比作石器时代,c作为冷兵器时代,c++作为工业革命之后的热兵器及机械化时代,而c#之类则进入了现代科学世界,至于go,python之流,大概可 ...

  4. Java学习08 (第一遍) - SpringMVC

    写一下午的好多居然丢失...自动保存也只是保存丢失后的 那就不多写了,简单写: Spring:(自己画的) 官网的: 写一个Spring的例子: Eclipse http://repo.spring. ...

  5. hdu2089-不要62-(数位dp)

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  6. 云笔记项目-Java反射知识学习

    在云笔记项目中,补充了部分反射的知识,反射这一部分基础知识非常重要,前面学习的框架Spring和MyBatis读取xml配置文件创建对象,以及JDBC加载驱动等都用了反射,但只知道有这个东西,具体不知 ...

  7. 简化Getter 与 Setter 的插件 Lombok

    参考文档:https://www.jianshu.com/p/365ea41b3573 第一步:添加依赖 <dependency> <groupId>org.projectlo ...

  8. Pandas排列和随机采样

    随机重排序 import pandas as pd import numpy as np from pandas import Series df = pd.DataFrame(np.arange(5 ...

  9. Cobbler安装CentOS7系统时报错 curl:(7)Failed connect to 10.0.0.201:80;Connection refused

    问题原因: 其他涉及到http服务的端口全部都改成了81端口.只有 /etc/cobbler/settings 这里没有改. [root@mage-monitor- ~/]#grep -E " ...

  10. java项目测试或者不使用request,如何获取webroot路径

    1.使用jdk中的方法,然后根据项目编译后的文件存在的位置,获取到classes目录,然后向上级查询获取String path = EngineTest.class.getResource(" ...