《HTCVIVE交互开发实例教程》第52课备课内容介绍

随着 VR 生态的衰落和 ValveKnuckles 控制器的逐步建立,SteamVR 未来将能够为用户提供更多的交互方式,例如手掌追踪和力反馈。最近,Valve 在 Unity 资源商店将 SteamVR 插件更新为版本 2.0。XR技术研究院将根据官方博客和SDK文档介绍本次更新。本文也是《HTCVIVE 交互式开发示例教程》的第一部分。52课备内容。

以下是本文将包含的议程:

1.概览

2.重要更新:输入系统

3.动作

3.1 骨骼输入

3.2振动输出

4.动作集

5.SteamVR输入窗口

6.测试动作

7.动作绑定

8.在代码中使用动作

9.交互系统的变化

10.VRTK能否继续和SteamVR一起使用2.0

1.概览

五年前,SteamVR SDK for Unity 插件的第一个版本在 Unity 资源商店发布。在接下来的时间里,VR生态系统发生了很多变化,很明显出现了很多不同类型的控制器。

随着越来越多的 VR 设备推出,控制器类型趋于碎片化。每次发布新的控制器,都会给开发者带来一些额外的工作——游戏项目需要更改交互代码以适应新设备。从开发的角度来看,不同的控制器有不同的通配符映射,所以当现有的VR应用移植到另一个VR平台时,需要交互适配到目标平台。有鉴于此,Valve 推出了面向 Unity 开发者的 SteamVRUnityPlugin2.0(以下简称 SteamVR2.0)),让开发者在编程时可以专注于用户的动作,而不是特定的控制器按钮。

2.重要更新:输入系统

SteamVR2.0 的一个重要更新是添加了 InputSystem。引入 InputSystem 的目的是为了更符合 OpenXR 并与即将推出的 Knuckles 控制器配合使用。目前大部分主流VR平台都加入了OpenXR开放标准,如右图:

InputSystem 与之前对用户输入的处理有很大不同。使用 SteamVRInputSystem,开发人员可以在应用程序外部定义默认操作并绑定到键盘,而不是将输入视为特定设备上的特定按钮。这样,新设备无需修改代码即可快速适应应用。例如,当开发人员测量玩家是否抓取物体时,它不会测量 Vive 控制器上的 Trigger 键或 OculusTouch 控制器上的 Grip 键是否被按下,而是检查预定义的“Grab”动作是否为 True它。作为开发者,您可以在 SteamVR 中设置 Grab 动作的默认键盘和阈值,当程序运行时,您可以更改这些值以适应玩家的个人喜好。基于这些机制,

3.动作

InputSystem 的核心概念是 Action。基于动作的输入系统对游戏引擎来说更有意义。Unreal仍在继承这些解决方案,Unity目前正在开发的输入系统也将遵循这一原则。开发者需要摒弃之前的“当一个按钮被按下时会发生什么”的想法,而转而使用“当一个动作被做出时会发生什么”的想法。

SteamVR2.0将动作可视化分为以下6种,介绍如下:

3.1 骨骼输入

对于骨骼输入,Knuckles 控制器为 SteamVR 体验带来了手臂追踪,同时还计算出用户手腕的位置vip看看插件使用方法,然后传递给驱动程序,驱动程序将其解析为手部模型的 31 块骨骼,从而给用户带来了更好的沉浸式体验。该功能并非 Knuckles 独有,SteamVR 还可以为 HTCVive 和 Oculus Touch 等设备提供中指状态计算,例如判断手是否张开以及右手是否在触摸板上。同时,Valve 还将与微软合作,减少对 WindowsMR 控制器的支持。

默认情况下,在运行 InteractionSystem 示例场景时可以同时看到手模型和控制器模型。据悉,还有一个辅助组件SteamVR_Behaviour_Skeleton,如右图所示。该组件的使用可以参考InteractionSystem的示例场景。

3.2振动输出

以上都是输入动作。此外,目前还有一个输出动作——振动,用于触发VR控制器上的听觉反馈。调用方法如下代码所示:

  SteamVR_Input._default.outActions.Haptic.Executefloat secondsFromNow, float durationSeconds, float frequency, float amplitude, SteamVR_Input_Sources inputSource);

4.动作集

操作按操作集进行逻辑分组vip看看插件使用方法,以便于组织和管理。Unity 中对应的类是 SteamVR_ActionSet。你可以在不同的场景或应用之间切换来使用不同的动作集,例如应用中的一个场景是在月球上捡起和投掷物体,而另一个场景是在太空中飞行,那么这两个场景是不同的动作集可用的。同时,在新设备交互适配时,开发者只需要配置动作,不要选择修改项目代码。例如,当使用 Vive 控制器时,定义了 Fire 动作。支持 RiftTouch 时,只需要在 Touch 控制器上配置一个匹配 Fire 动作的通配符即可。

SteamVR 插件默认包括三个动作集默认、平台游戏和越野车。开发者还可以在 SteamVRInput 窗口中自行添加或删除动作集。

使用组件 SteamVR_ActivateActionSetOnLoad 手动激活和停用场景中的指定动作集。相应的激活和去激活方法在 Start() 和 OnDestroy() 中实现。如右图所示:

5.SteamVR输入窗口

在 Unity 编辑器中,使用 Window>SteamVRInput 命令打开 SteamVRInput 窗口。在 SteamVR2.0 中,所有操作都使用 SteamVRInput 窗口作为入口点进行管理。首次导出 SteamVR2.0 并运行程序时,会弹出一个对话框说没有 actions.json 文件并询问是否要使用默认值。如右图所示:

选择Yes会将默认的actions.json文件和一些常用的控制器相关的绑定文件复制到当前项目的根目录下,如右图:

该文件将在程序运行时加载,并在程序最终构建时复制到与可执行文件相同的级别。复制完成后,SteamVRInput 窗口会读取文件信息并显示其中包含的动作集以及动作集下的所有动作。如右图所示:

在 Actions 列的右下角,您可以单击加减号按钮来添加或删除操作。每个动作都有一个Name、Type、本地化字符串等数组。其中,类型对应上一节介绍的动作类型;本地化字符串是绑定到用户的动作名称,开发者可以通过 SteamVRAPI 直接访问动作和动作集。

当点击 SaveandGenerate 按钮时,插件将为动作和动作集生成可编程的可访问对象类,并将它们放置在项目的 SteamVR_input 目录中,如右图所示:

此类对象可以在相关组件的下拉列表中选择,如右图所示:

在项目代码中,您可以使用 SteamVR_Input 类来静态引用每个动作和动作集。在每个动作集中,您可以找到对其包含的动作的引用,如以下代码所示:

  void Update()
  {
    if(SteamVR_Input._default.inActions.Teleport.GetStateUp(SteamVR_Input_Sources.Any))     {
          Teleport();
      }
  }

上述代码实现的功能是:当测量到任意控制器发出包含在默认动作集中的Teleport动作时,执行Teleport()函数。

6.测试动作

选择 Window>SteamVRInputLiveView 命令打开一个测试输入窗口。运行程序,窗口会实时显示所有动作集的状态。如右图所示:

当一个动作的值发生变化时,相应的边会以红色突出显示,然后逐渐消失。

7.动作绑定

动作创建后,需要默认绑定动作。打开 VR 控制器,保持 SteamVR 客户端打开,点击 SteamVRInput 窗口中的 OpenbindingUI 按钮,将使用操作系统默认的 Web 浏览器打开 SteamVR 动作绑定页面。在该页面选择要绑定的控制器,点击编辑按钮,进入绑定编辑页面,如右图:

好吧,它看起来像现场篮球比赛的球杆装置吗?Valve是一家游戏公司。这样一来,对于开发者来说,控制器对游戏玩家的友好程度就像对游戏玩家的友好程度一样。

在动作编辑页面,点击各个键盘对面的减号按钮,会弹出窗口询问该按钮绑定的是哪种模式,如右图所示:

一般来说,Single 类型的动作可以设置为 TRIGGER,布尔类型的动作可以设置为 BUTTON。设置好后点击键盘左下角的编辑按钮,在显示为None的位置指定对应的动作,如右图:

绑定所有动作后,点击页面顶部的 ReplaceDefaultBinding 按钮,将绑定设置保存到配置文件中。程序运行时,无论是开发者还是游戏玩家,绑定配置都可以再次更改,但只能体现在游戏中。

默认情况下,每个控制器上的同一个键盘都绑定同一个动作,如果你想为每个控制器设置不同的动作,例如右手控制器按下触摸板传送,左手控制器按下touchpad 使用 needle 选择对象,因此在这些情况下,您可以取消选中页面上的 MirrorMode 复选框,然后为每个控制器分配不同的操作。

也可以在绑定编辑界面进行动作测试。点击页面顶部的InputDebugger按钮进入测试页面。在这个页面上,每个动作的状态、动作绑定的按钮、控制器的实时数据都会实时显示。如右图所示:

8.在代码中使用动作

下面以访问平台动作集下的移动动作为例,演示如何获取动作状态并执行以下步骤:

打开 SteamVR 示例场景 SimpleSample,选择游戏对象 [CameraRig],为其挂载 SteamVR_ActivateActionSetOnLoad 组件,并指定启用平台动作集,如右图:

2.创建一个新的 C# 脚本并将其命名为 GetMoveAction.cs。编译后的代码如下:

  using UnityEngine;
  using Valve.VR;
  
  public class GetMoveAction : MonoBehaviour
  {
      void Update()
      {
          if (SteamVR_Input.platformer.inActions.Move.GetChanged(SteamVR_Input_Sources.Any))
          {
              Vector2 pos = SteamVR_Input.platformer.inActions.Move.GetAxis(SteamVR_Input_Sources.Any);
              Debug.Log(pos);
          }
      }
  }

3.返回场景,将此脚本挂载到任意游戏对象,保存场景运行程序,当你在任意控制器上触摸触摸板时,控制台会输出如下信息:

9.交互系统的变化

从功能上看,本次更新并没有给InteractionSystem增加太多的特性,这也可以从InteractionSystem的更新文档中推断出来,如右图所示:

InteractionSystem 的示例场景已重新设计,如右图所示:

在当前的示例场景中,除了包含大部分之前的 SteamVR2.0 演示外,还添加了一些新功能。例如,投掷部分得到了扩展,增加了遥控和遥控车、简单的按钮、手榴弹和一些手的例子。

随着版本的更新,InteractionSystem 已经大幅支持 InputSystem。在源码中可以看到InteractionSystem开始使用InputSystem配置的行为进行交互驱动,如右图:

所以读者可以通过阅读InteractionSystem的源码进一步了解InputSystem的使用。

10.VRTK能否继续和SteamVR一起使用2.0

从上面的描述可以看出,如果VRTK没有新版本更新,理论上是不能使用VRTK的(当前版本是3.2.1)结合SteamVR2.0 用于开发,除非克隆 VRTK 源代码并自行更改。这个也可以在 AssetStore 中找到,如右图所示:

所以VRTK当前版本(3.2.1)不支持SteamVR2.0。使用VRTK的开发者可以继续使用SteamVR1.2.3 用于开发,可以从以下位置下载 SteamVRPlugin 的旧版本:github.com/ValveSoftware/steamvr_unity_plugin/releases。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 网站程序 《HTCVIVE交互开发实例教程》第52课备课内容介绍 https://www.wkzy.net/game/8476.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务