Unity开发之SteamVR—VRTK简介

2023-09-24 6 0

一、什么是VRTK
VRTK全称是Virtual Reality Toolkit,前身是SteamVR Toolkit,由于后续版本开始支持其他VR平台的SDK,如Oculus、Daydream、GearVR等,故改名为VRTK,它是使用Unity进行VR交互开发的利器,以二八原则来看,开发者可以使用20%的时间完成80%的VR交互开发内容。
在Unity Asset Store上搜索 VRTK 下载导入即可(根据当时VRTK更新到的版本下载即可,不一定还能下载到lz的这本版本3.2.0)。
下图是VRTK的作者在Twitter上分享的一张图片。作者使用了黄金思考圈的方式告诉大家:为什么开发VRTK,采用什么方式,以及VRTK是什么。
二、VRTK能实现VR开发中大部

分交互效果,开发者只需要挂载几个脚本,然后设置相关的属性,就能实现我们想要的功能:

  • 支持SteamVR、Oculus、Daydream等SDK
  • VR模拟器,不需要VR硬件即可调试
  • 基于头盔和手柄的激光指针
  • 基于头盔和手柄的曲线指针
  • 游玩区域光标
  • 指针交互
  • 可以为物体设置拖放区域
  • 多种移动方式:瞬移、Dash Movement、Touchpad Movement、Move in place/Run in place Movement
  • 攀登
  • 物体交互:Touching、Grabbing 、Using
  • 双手联动操作物体:缩放、冲锋枪等需要双手持握的物体
  • 物体高亮
  • 手柄震动反馈
  • 手柄效果: 高亮, 透明, 隐藏
  • 预制常见物体的交互方式:按钮、杠杆、 门、抽屉、 滑动条、把手
  • 面板菜单、环形菜单
  • 使用指针与UGUI进行交互
  • 对UI元素进行拖拽
  • ...
VRTK通过事件驱动进行相应的交互开发,对于手柄发送的各种事件,使用VRTK_Controller_Event脚本,这是在配置过程中首先要挂载到手柄控制器上的脚本。另外,对于其它的交互事件,也会提供相应的unity事件处理,比如VRTK_BasicTeleport_UnityEvents(瞬移事件处理)、VRTK_InteractGrab_UnityEvents(抓取事件处理)、VRTK_InteractTouch_UnityEvents(触摸事件处理),对于各事件发生的不同阶段,都会有对应的处理接口,类似于uGUI中Button的OnClick事件处理形式。当然,你也可以通过代码进行手动添加事件处理函数。
三、VRTK目前支持的例子
VRTK版本是 VRTK 3.2.0
通过插件提供的demo测试,总结例子如下:
001_CameraRig_VRPlayArea
显示[CameraRig]预制件使用情况的简单场景。
002_Controller_Events
一个简单的场景,在控制台窗口中显示来自控制器的事件。
003_Controller_SimplePointer
一个具有基本对象的场景,可以通过按下来激活来自控制器的激光束Touchpad。指针事件也显示在控制台窗口中。
004_CameraRig_BasicTeleport
具有基本对象的场景,其可以使用控制器激光束遍历以指向游戏世界中的对象,其中用户将通过按压Touchpad控制器来传送到该对象。当Touchpad释放时,用户被传送到激光束终点位置。
005_Controller_BasicObjectGrabbing
一个具有选择对象的场景,可以通过用控制器触摸它们并按下Grip按钮来抓取它们。释放抓握按钮将使物体沿抓取控制器的方向和速度推进。场景还演示了控制器触摸它们时对象的简单突出显示。交互事件也显示在控制台窗口中。
006_Controller_UsingADoor
具有门可交互对象的场景设置为usable当按下控制器Trigger按钮使用门时,门打开(或者如果门已经打开则关闭)。
007_CameraRig_HeightAdjustTeleport
与选择不同高度的对象,可以使用控制器的激光束在一个对象指向和如果激光束在物体的顶部指向则向用户被传到对象的顶部被遍历场景。此外,它表明如果用户踏入不在对象上的游戏区域的一部分,则用户将落到最近的对象。这也使得用户能够仅通过站立在物体上来攀爬物体,因为从耳机的位置进行地板检测。
008_Controller_UsingAGrabbedObject
具有可交互对象的场景,可以抓取(按下Grip控制器按钮)然后使用(按下Trigger控制器按钮)。桌子上有一把枪可以被拿起来射击,或者是一个奇怪的盒子,当拿起并使用顶部旋转时。
009_Controller_BezierPointer
然而,具有可以使用控制器遍历的不同高度对象的选择的场景,而不是仅仅指向直梁,该梁是弯曲的(在贝塞尔曲线上),其允许在用户不能看见的物品上攀爬。
010_CameraRig_TerrainTeleporting
具有地形对象的场景和可以使用控制器激光束指针遍历的不同高度的3d对象的选择。它显示了高度调整传送器如何用于爬升和减少游戏物体以及穿越地形。
011_Camera_HeadSetCollisionFading
在游戏区域周围有三面墙的场景,如果用户将头部放入任何可碰撞的墙壁中,则耳机会渐变为黑色,以防止看到不需要的物体剪裁伪影。
012_Controller_PointerWithAreaCollision
演示如何使用控制器指针遍历世界但是光束显示投影的游戏区域空间以及空间是否与任何对象发生碰撞的场景,则禁用远程传送操作。这意味着可以创建一个用户无法传送到的区域的级别,因为它们允许用户剪辑到对象中。
013_Controller_UsingAndGrabbingMultipleObjects
一个场景,通过连续按住抓取按钮或按下抓取按钮一次拾取并再次释放来演示如何抓取可交互对象。场景还显示使用按钮可以按住以继续使用或按下使用按钮一次开始使用,再按一次停止使用。这允许多个对象同时进入其使用状态,如此示例场景中所示。
014_Controller_SnappingObjectsOnGrab
具有选定对象的场景,演示对控制器机制的不同捕捉。两把绿色枪,轻剑和剑使用一个Snap Handle,它使用一个空的游戏对象作为可交互对象的子项作为抓取的方向点,因此对象的旋转和位置与给定的旋转和位置相匹配Snap Handle。红色枪使用基本捕捉,不需要精确度,也没有提供不影响物体旋转但是将物体中心定位到控制器上的捕捉点的捕捉手柄。红色/绿色枪利用Precision Snap不影响抓取物体的旋转或位置的物体,并在控制器捕捉点接触物体的位置拾取物体。
015_Controller_TouchpadAxisControl
使用控制器触控板控制的R / C汽车场景。在触摸板上上下移动手指将导致汽车向前或向后行驶。将手指移动到左侧或右侧Touchpad会导致汽车朝那个方向转动。按下Trigger将导致汽车跳跃,这利用触发轴,按下触发器越多,汽车将跳越高。
016_Controller_HapticRumble
一个带有易碎盒子和剑的场景。剑可以被拾起并在盒子里摆动。控制器在适当的振动下隆隆声,取决于剑击中盒子的力度。如果被剑击得足够硬,盒子也会分开。
017_CameraRig_TouchpadWalking
一个场景,通过向前和向后滑动手指向该方向移动,演示如何使用触摸板在游戏世界中移动。在触摸板上左右滑动手指朝向该方向。旋转是通过游戏中的用户在场所空间中物理地旋转他们的身体来完成的,并且无论耳机看起来哪种方式都是用户向前走的方式。蹲伏也是可能的,如在这个场景中所证明的,并且结合耳机碰撞褪色脚本,它可以检测到不想要的碰撞(例如,如果用户在蹲伏时行走时站立)并将其位置重置到最后的已知位置。
018_CameraRig_FramesPerSecondCounter
在耳机视图中心显示每秒帧数的场景。按下触发器会生成一个新球体,按下触摸板会生成十个新球体。最终当存在大量球体时,FPS将下降并展示预制件。
019_Controller_InteractingWithPointer
一个场景,显示控制器指针梁如何用于切换可交互对象上的使用操作。按触摸板激活光束并将其瞄准对象将切换其使用状态。它还演示了如何通过使用捕捉到游戏对象的可交互对象来创建游戏菜单可以触发操作。按应用菜单按钮显示连接到控制器的立方体,该控制器具有菜单选项。将光束指向立方体上的另一个控制器将相应地选择菜单选项。
020_CameraRig_MeshTeleporting
具有网格对撞机的对象的场景,用于演示高度调整传送器如何用于使用网格对撞机上下爬升物体。
021_Controller_GrabbingObjectsWithJoints
具有可伸缩对象集合的场景,该对象附加到具有关节的其他对象。该示例显示Interactable Objects可以具有不同的附加机制,以确定将对象连接到控制器的最佳方式。固定接头适用于保持像立方体这样的物体,因为它们完美地跟踪控制器,而弹簧接头在抽屉上工作良好,在操作时可以使其自然滑动。最后,旋转轨道在门上运行良好,可以自然控制门的摆动。还有一个角色关节对象,可以通过拉动每个相关部分来操纵不同的形状。
022_Controller_CustomBezierPointer
一个场景,演示了Bezier指针如何将复杂的对象传递给它以生成跟踪器光束和指针的光标。在场景中,具有旋转的粒子对象用于演示贝塞尔指针梁的不同外观。
023_Controller_ChildOfControllerOnGrab
一个场景,演示抓取机制,抓取的对象成为控制器抓取的孩子。这适用于需要绝对跟踪控制器的对象,并且在任何情况下都不希望脱节。该对象成为控制器的扩展。现场用弓箭示例演示了这一点,其中弓可以被拾取并跟踪到控制器,而另一个控制器负责拾取箭头以在弓中射击。
024_CameraRig_ExcludeTeleportLocation
一个场景,通过将命名标记应用于对象或应用特定名称的脚本,显示如何通过远程移植来排除某些对象。在场景中,通过在其上ExcludeTeleport设置标记来从传送位置中排除黄色对象,并且通过将ExcludeTeleport附加到其上的脚本排除黑色对象。该ExcludeTeleport脚本没有方法,只是用作占位符。
025_Controls_Overview
一个场景,展示现有的交互式控件,不同的设置方式以及如何对它们发送的事件做出反应。
026_Controller_ForceHoldObject
一个场景,显示如何在游戏开始时抓取对象并防止用户丢弃该对象。场景自动抓住两把剑到每个控制器,并且不可能掉落任何一把剑。
027_CameraRig_TeleportByModelVillage
演示如何在不需要世界指针的情况下传送到不同位置并在表示游戏世界的迷你地图的对象上使用目标事件抽象类的场景。触摸并使用地图上的对象将用户传送到指定位置。
028_CameraRig_RoomExtender
一个场景,通过乘以伴侣边界中的物理步骤来演示扩展物理室空间比例空间的概念。较高的乘数意味着用户可以在游戏区域中进一步行走,并且可以通过按下按钮来切换步行乘数。
029_Controller_Tooltips
演示使用预制件ObjectTooltip和预制件向游戏对象和控制器添加工具提示的场景ControllerTooltips。
030_Controls_RadialTouchpadMenu
演示使用预制件向控制器和其他对象添加动态径向菜单的场景RadialMenu。
031_CameraRig_HeadsetGazePointer
一个场景,演示了将指针连接到耳机的能力,以允许用于远程传输的凝视指针或由世界指针支持的其他交互。的Touchpad右控制器激活所述凝视光束,而Touchpad左控制器上激活从天空为世界指针无人驾驶飞机投射的光束可以附着到任何对象。
032_Controller_CustomControllerModel
演示如何使用控制器的自定义模型而不是默认HTC Vive控制器的场景。它使用两个简单的指针代替默认控制器,并根据是否按下了抓取按钮或使用按钮显示简单的状态更改。
033_CameraRig_TeleportingInNavMesh
一个场景,演示如何使用烘焙的NavMesh来定义允许用户传送到的区域。
034_Controls_InteractingWithUnityUI
演示如何与Unity UI元素交互的场景。场景使用VRTK_UIPointer右侧控制器上的脚本,允许使用简单指针光束与Unity UI元素进行交互。左侧控制器控制耳机上的简单指针,以演示与Unity UI元素的凝视交互。
035_Controller_OpacityAndHighlighting
演示如何更改控制器的不透明度以及如何突出显示控制器元素(如按钮甚至整个控制器模型)的场景。
036_Controller_CustomCompoundPointer
一个场景,演示Bezier指针如何仅在传送位置有效时才能显示对象(传送光束),并且可以沿着跟踪曲线创建动画轨迹。这个场景提供了一个纹理环境,用于测试传送,墙上的一些活跃的“等离子”球体可以用指针激活,另一个球体也可以被抓取和发射。
037_CameraRig_ClimbingFalling
一个演示如何设置具有不同活动的攀爬机制的场景。具有VRTK_InteractableObject组件的各种对象分散在整个级别中。它们都具有GrabAttachMechanic设置为Climbable。
038_CameraRig_CameraRig_DashTeleport
一个场景,显示传送行为,并演示了使用广播的RaycastHit数组的方法。在示例中,破折号方式中的障碍物在破折号正在进行时关闭其网格渲染器。
039_CameraRig_AdaptiveQuality
仅与Unity 5.4及更高版本兼容
场景在耳机视图的中心显示每秒的帧数。此脚本的调试可视化显示在耳机视图的顶部边缘附近。按下触发器会生成一个新球体,按下触摸板会生成十个新球体。最终当存在大量球体时,FPS将丢弃并演示脚本。
040_Controls_PanelMenu
演示如何将可交互的面板预制件附加到游戏对象以提供其他设置的场景。
041_Controller_ObjectSnappingToDropZones
使用VRTK_SnapDropZone预制件为一系列对象设置预定捕捉区域的场景,并演示如何仅将某些类型的对象捕捉到某些区域。
042_CameraRig_MoveInPlace
一个场景,演示用户如何通过以步行方式摆动控制器或通过利用头部摆动运动的现场跑步来移动和穿越碰撞器。
043_Controller_SecondaryControllerActions
一个场景,演示了使用一个控制器抓取对象的能力,并通过抓取和拉动第二个控制器来缩放它。
044_CameraRig_RestrictedTeleportZones
使用VRTK_DestinationPoint预制件设置预定义传送位置集合的场景。

代码编程
赞赏

相关文章

【数据结构周周练】034 奇偶排序算法原理详解(上海大学832计算机组成原理与数据结构原题)
考研结束,一起聊聊考研中的故事
【积跬步以至千里】关于文化自信与支持国产的个人理解,附加WPS关闭广告或消息推送
【数据结构周周练】033 冒泡排序算法原理详解及代码分享
【数据结构周周练】032 折半插入排序算法原理详解及代码分享
【数据结构周周练】031 直接插入排序算法原理详解及代码分享