HTC Vive开发笔记(一)

  来了公司之后一直在做陕西的博物馆相关项目,之前主要接触的AR方面的内容,年后回来总算有机会接触HTC Vive开发了,今天就大概说下自己学习的一点点心得吧。但今天所说的内容与代码层的相关甚少,因为HTC 官方提供的Unity插件已经很强大了,几乎不需要自己动手写太多东西,所以主要解释下相关组件的用法。   做VR头盔的开发,最主要的地方还是他的控制器的交互功能的开发,比如如何让控制器和按钮交互,如何实现点击地板让人物移动过去,类似这样的功能。而官方现在又出了一个帮我们解决了交互这部分的插件,叫做Vive Input Utility再结合本身的SteamVR插件目前来说简单的功能完全足够了。首先下载好这两个插件导入到Unity工程中。会出现两个目录一个SteamVR,一个HTC.UnityPlugin,下面分别介绍这两个插件:
  SteamVR是HTC VIVE开发的基础插件,有了它我们就可以简单的搭建一个VR场景来体验了,比如我们创建一个Plane,然后里面随便放些东西,然后将SteamVR/Prefabs里面的[CameraRig]和[SteamVR]两个预制体拖到场景里,再把原来的Camera删掉,就可以运行带上头盔体验你自己搭建的VR场景了。在[CameraRig]下面有两个Controller对象,和一个Camera对象分别对应HTC Vive的两个手柄和头盔,而手柄对象上有一个脚本SteamVR_TrackedObject 是管理控制器的,比如可以通过他的index属性拿到他的标签,而这个标签有什么用呢,就是可以通过SteamVR_Controller的Input方法传入这个标签作为参数来获取当前使用的控制器对象。这个对象的类叫SteamVR_Controller.Device。而这个类里面有很多和控制操作相关的方法,比如GetTouch()意思是判断是否点击了控制器的某个键,比如参数传SteamVR_Controller.ButtonMask.Trigger 就是判断是否点击了扳机键,具体可以判断的函数都在SteamVR_Controller.Device类里,这里就不一一列举,SteamVR_Controller.ButtonMask里的枚举就是控制器里的各种按键,名字起的都很见名知意,也是主要通过它们来实现控制器和虚拟世界里各种东西的交互。再说一下[CameraRig]下的Controller下面的Model对象,这个其实就是你的控制器在VR世界里显示的模型,默认显示的就是控制器本身的样子。所以如果你想要替换控制器的样子就可以通过替换它来实现了,比如替换成一把枪,弓箭什么的。目前我所知道的SteamVR的插件的东西就这些,而他插件里的脚本都放在SteamVR/Scripts下面了,可以之后慢慢学习。
  接下来再来说一下Vive Input Utility插件,刚才知道了基础开发插件以后,我们就可以自己写一个射线,然后通过射线碰撞来和按钮什么的做交互,也可以写一个曲线和地面碰撞,再通过点击某个按钮移动到对应的位置。这些都是在VR开发中常见的功能,完全可以自己动手实现。但是呢,有了这个插件,就可以帮我们省去这部分时间,因为官方提供的这个插件已经帮我们处理好了一些简单的控制器交互,可以使我们花更多精力在自己的业务逻辑开发上。在HTC.UnityPlugin/ViveInputUtility/Examples里面存放着这个插件的许多例子,比如控制器发射线点击按钮,telepot地面移动等等。比如要实现控制器发送射线和按钮交互只需要添加HTC.UnityPlugin/ViveInputUtility/Prefabs/VivePointers预制体就可以了,这样我们在一个自己建立的VR场景里你就会发现你的控制器会带一个射线,然后配合UGUI的各种组件交互。下面主要讲一下Telepot这个功能,在我们添加了VivePointers这个预制体以后,他默认的是直线,我们在它下面找到EventRaycaster这个对象,在他上面加上ProjectileGenerator组件,就可以发现他会变成一个曲线,可以供我们选择地板。然后只要将我们需要能够移动过去的地面加上Teleportable组件,就说明这是一个可以移动到的物体,然后就可以通过控制器移动过去了。不过需要注意的是Teleportable里面的几个参数其中Pivot就是指定Camera(Head)对象就行,也就是头盔,但是Target要指定[CameraRig]和VivePointers两个预制的父节点,因为控制我们自己移动的主要就是[CameraRig]对象决定的,而控制器发出的射线是靠VivePointers的,我之前就是把Teleportable里的target指定成了[CameraRig]结果发现人是可以移动过去,不过射线还停留在原地,所以指定父节点就是为了统一将他们两个都移动过去,这样就不会出现我刚才的问题了。
 以上就是今天花的一点点时间总结出来的一点学习笔记,以后有新的想记录的东西会继续更新~

fantasycoding.net 2016-2024 © All rights Reserved京ICP备2020039454号-1