使用Presence Platform 升级后的手部追踪 API ,在 Meta Quest 平台上对Myst的最新更新引入了手部追踪,名为“Hands & More”。终于让用户在没有物理控制器的情况下在 Quest 上玩Myst !在这篇文章中,“神秘岛”将讨论在Myst中实现手部跟踪的演变和迭代——特别是在虚幻引擎 4.27.2 中添加对它的更多支持。
20220811.webp
为手部追踪设计导航
图片表明你想去哪里。你可能想过指点,对吧?这就是为什么我们选择在Myst中使用“指向”方法进行移动。

当你处于传送模式时,你可以指向你想去的地方,传送环就会出现在你的目的地。当您“取消指向”时(通过伸展其余手指,或者只是将食指拉回手掌),就会执行传送。

当您处于平滑移动模式时,以自由移动为主的手(可以在我们的控件设置中进行配置,但默认为左手)指向将开始沿着您所指的方向平滑地移动您。

在使用指向进行游戏测试时,我们发现当您的其他手部遮挡时,用食指和中指进行手部跟踪有时会变得不可靠。系统不确定这些手指是完全指向还是完全“封闭”在您的手中。我们在代码中添加了一些“捏造”因素,以说明在这方面更稳定的运动启动/执行——我们稍后会在讨论对开箱即用的手部跟踪所做的更改时对此进行讨论虚幻引擎中的支持。

车削
'point' 方法不适用于所有导航用途。在转动方面,我们最初将指点与手腕旋转相结合。比较玩家的手腕和相机的前向矢量将指示转弯的方向(以及转弯应该有多大)。我们最初尝试了这一点,因为在所有模式之间保持导航的“指向”主题似乎很直观。

然而,在舒适度测试中出现了并发症。在游戏测试中,大多数玩家都会将手掌朝向地面指向前方,就像尝试指向游戏外的某物时一样。当您的手掌面向地面时,左右旋转手腕(围绕手腕的上轴)具有挑战性,并且活动范围非常有限,尤其是在试图转离胸部时。

即使您要求玩家手掌朝内指向他们面前的某物,这个问题也是一样的。您可以将手腕向身体方向弯曲很多,但将手腕远离身体弯曲时,您不会获得相同的运动范围。

那么我们是如何解决这个问题的呢?我们最终将转向指定为“竖起大拇指”手势,而不是指针指向手势。

想象一下竖起大拇指。现在左右转动手腕。请注意,即使您没有大范围的运动,在此手势中用拇指指向“左”和“右”仍然相当一致。

这就是我们决定开启手部跟踪模式的原因。尽管用拇指指向似乎不是最直观的转向方式,但它确实最终成为最舒适和一致的方式。

使用快速转动时,将手腕从竖起大拇指的位置向左或向右旋转会启动一次快速转动。然后,您必须将手放回“中心”(笔直向上)位置以重置快照,并等待很短的冷却时间再次启动快照转身。

平稳转动时,在竖起大拇指的位置转动手腕将开始向左或向右转动——一旦您离开一个“死区”,在您通过阈值之前不会发生转动。

处理运动和对象交互姿势之间的冲突
当然,指向手指的手势过于宽泛,无法假设仅用于导航。出于习惯或他们自己的期望,人们会做出相同的指向手势来按下按钮或与世界上的其他事物交互。走到(但不是直接到)一个按钮,用手指按下它,然后在游戏中突然(并且不希望地)靠近它(或无意中启动传送),这将是非常不和谐的!

我们防止在玩家可能与某物交互时发生移动的方法是,当做出“移动”手势的手在可交互对象的特定范围内时,防止任何移动代码触发。这个范围已经根据游戏测试进行了多次调整,以达到一个好的“最佳位置”。

我们发现这个最佳位置距离食指指尖骨骼的世界空间位置大约 25 厘米。Myst充满了各种尺寸的交互式对象(从小按钮到非常大的杠杆),排列在宽敞的空间和狭窄的走廊中,因此我们需要进行大量测试才能确定这个数字。我们最初尝试了 60 厘米(约 2 英尺),但当玩家仍需要靠近物体时,这会阻止移动发生。同样,当玩家试图抓住或触摸物体时,任何低于 25 厘米的东西都会导致触发不希望的玩家运动。

我们最好的测试区域之一是神秘岛的发电机房,在那里您穿过狭窄的入口通道,然后立即看到一个装满按钮的面板。当交互测试区域过大时,由于检测到食指范围内的按钮,玩家无法通过入口进入面板。

也就是说,25 厘米是专门为Myst工作的。如果其他游戏想要实现类似的东西,他们可能需要调整这个数字,并考虑到自己的标准。

为手部追踪设计对象交互
目前, Myst中所有可抓取的交互都与手部跟踪配合使用——转动阀门、打开门、按下按钮、翻书页等等。

交互搭载了我们已经为Myst设置的 Touch 控制器。在那里,按下握把按钮会自动将游戏中您手的网格表示混合成“抓握”姿势,或者将您的手握成拳头(如果是空的)或抓住一个物体。通过手部跟踪,我们添加了代码,可以对您何时将手指弯曲到足以“抓住”某物并启动与前面提到的相同的逻辑进行有条件的猜测。

例如,当您使用手部追踪并且您的手悬停在可抓取的东西上时,您的手部颜色会变为橙色(这正是您在Myst VR 中不使用手部追踪时会发生的情况)。当您通过开始将手指卷成拳头来抓住可交互对象时,橙色球体将替换您的手部网格,并表示手与对象的连接位置。

我们之所以采用这种方法,而不是为您的手制作自定义可摆出的网格(或让您的手/手指看起来与这些对象的某些部分进行物理交互),是因为我们希望交互与我们提供的交互相同现在触摸控制器端。

按下按钮的工作方式有所不同。由于按钮不是可抓取的对象,因此不需要抽象,相反,我们允许您使用在可摆手网格上的每个手指关节之间生成的胶囊碰撞器简单地按下按钮。正因为如此,你可以做各种奇怪而有趣的事情——比如如果你真的想的话,只用你的小指或无名指的指关节来与游戏中的每个按钮进行交互。

这种实现方式与触摸控制器与游戏中按钮的交互方式略有不同,因为我们通常希望玩家使用控制器上的抓握按钮将手设置为一个姿势的“手指指向”网格,以获得准确的游戏内按钮压在他们的头上。借助手部追踪,您可以用手创建的姿势显然具有更大的灵活性,因此以相同的准确度按下按钮的方式也显着增加。

菜单/用户界面交互
对于与菜单的交互,我们最终采用了 Meta 用于 Quest 平台的相同交互范例:拇指和食指之间的两指捏合,一只手。这既可以用来打开我们的游戏内菜单,也可以用来与菜单中的元素进行交互。当玩家第一次在 Quest 上启用手部跟踪时,已经在操作系统级别的菜单中教导他们这样做,在这里重新发明轮子是没有意义的!

将所有这些传达给玩家
因为手部追踪在 Quest 上不像 Touch 控制器那样普遍,而且因为可能有些人是第一次玩Myst(甚至是玩他们的第一款 VR 游戏!),所以我们尽量考虑我们的方式将所有有关手部追踪的信息传达给玩家。我们确保包含另一个版本的“控制器图”,专门用于描述手部跟踪交互(在Myst中启用时),我们向玩家展示专门的通知,告诉他们如何用手移动。

此外,我们认为一旦启用,提醒玩家如何获得流畅的手部追踪体验至关重要。玩家会在Myst的菜单中收到通知,如果他们确保自己在光线充足的房间内并将手保持在视野范围内,手部追踪的稳定性会更好。

Meta 还告知玩家这些是良好追踪手部追踪环境的关键,但我们认识到有些玩家可能会在没有首先解析 Meta 的通知的情况下进入游戏,因此我们选择提醒人们以防他们忘记了。

在虚幻引擎中进行的引擎修改
这是它将获得更多技术性的地方……系好安全带!

我们目前正在为Myst使用 Unreal Engine 4.27.2 。Meta 有一些用于虚幻中手部跟踪的基本代码——但对于像我们这样需要更好的手势和信心检测的游戏来说还不够。Meta 用于手部跟踪的大部分手势检测和物理库目前仅在 Unity 中可用,因此我们需要在这方面做一些基础工作,以便在虚幻。

此外,人们还需要为可交付的手部跟踪项目实施其他一些元素,我将在下面详细介绍。

系统手势垃圾邮件修复
即使您开始捏合,Oculus 左侧系统手势(用于菜单按钮)也会触发,而不是等待确认捏合已处于相同状态一段时间。我们通过更改 Oculus 输入库中的事件来解决此问题,以等待捏合完成(等待系统手势填充其确认圈),然后再触发通知事件,而不是在进行中时这样做。

多平台构建稳定性
使用任何蓝图序列化的 Oculus Hand 组件将导致其他平台(例如 Xbox)的构建在本地化步骤中中断。这是因为 Oculus Hand 组件是 OculusVR 插件的一部分,该插件仅适用于 Windows 和 Android,因此在构建其他平台时无法在蓝图中引用其任何组件。

虚幻引擎 5 中并未正式支持原生化,但对于使用虚幻引擎 4 的人来说,根据项目的需要保持启用它可能仍然是有益的。因此,对于为所有平台打包的游戏,在蓝图级别包含手组件是不可行的。

也可以看看
《侠盗猎车手 5》、《荒野大镖客 2》和《黑手党》VR 模组在游戏发行商的法律投诉后被撤下
我们对此的解决方案是,只要检测到手部跟踪已启用或禁用,我们只会在 Touch 控制器上使用 C++ 生成和销毁 Oculus Hand 组件,并且此功能仅适用于为 Quest 构建的 Android 版本。手部组件源和我们所有的手部跟踪代码都被排除在所有其他平台之外。

不幸的是,这意味着如果您是一个仅蓝图项目的开发人员,该项目针对多个平台并利用虚幻引擎 4 中的本地化,并且您正在考虑为 Quest 实现手部跟踪,您可能必须将您的项目转换为源项目,以避免为 Quest 以外的平台构建本地化问题。

自定义全手手势识别
在 Unreal 中,Oculus 输入库中没有内置有意义的基于全手的手势识别(系统手势的手指捏合除外)。这意味着,如果您做出竖起大拇指的手势或指点手势,需要将所有其他手指都塞进去,那么虚幻引擎中没有内置任何东西来通知您该特定手势的发生。

我们对此的解决方案是在 Oculus Hand 组件中实现我们自己的骨骼旋转检测,具有可调节的容差,以推断何时:

一个手指点(用食指)正在发生
正在发生抢夺
正在发生竖起大拇指的手势
所有这些都作为输入事件被触发,我们可以在 C++ 中绑定到,这是我们存放大部分基本玩家控制器、角色和触摸控制器代码的地方。

手势和跟踪稳定性调整
在虚幻中实现和测试对Myst的手部追踪支持时,我们注意到某些手指在被您的其余手部遮挡时的追踪稳定性存在一些怪癖。例如,如果您是:

用你所有的手指背对着你去抓东西
将食指直接远离您

在所有手指都背对着你的情况下抓东西的情况下,我们注意到手部追踪可能偶尔会认为你的小指没有被你的拳头包围,就好像它稍微放松了一样。事实上,当你的手指被手背混淆时,所有手指的跟踪准确度并不是特别高,即使它不认为跟踪信心很低。当我们期望玩家抓住阀门或杠杆之类的东西并继续转动/移动它们而不会太快松开时,这是一个问题——手部跟踪系统可能会决定你不再抓住物体,因为它认为你放松了你的手指。

在将食指远离您的情况下,有时手部跟踪系统会认为您的中指比实际更放松,甚至用食指指向也是如此。这是我们的导航和移动系统的问题。如果系统不再认为您只是用食指指向,它可能会认为您正试图抓住某些东西并阻止您移动,或者在不知不觉中执行您尚未准备好启动的传送。

对于这两种情况,我们的解决方案是添加一些单独的手指阈值,以便在我们将手视为“不抓”或“不指向”之前,我们允许在这些情况下有问题的手指放松多少。通常情况下,跟踪系统认为手指比实际更放松,而不是相反。我们将这些阈值构建到我们决定通知用户手部正在做出的手势的地方——就在 Oculus 手部组件中。

Oculus Hand 组件的其他便捷实用程序
我们对 Oculus Hand Component 源代码进行了大量修改以实现我们自己的自定义手势识别,但我们也对其进行了一些修改以实现一些实用功能。我们编写的其中一个函数是一个实用程序,用于从世界空间中的其他点获取手部碰撞的最近点。它还返回最接近的骨骼的名称。我们将此实用功能用于不同交互的各种输入验证。

值得一提的是,我们发现无论手的深度如何,腕骨的跟踪可靠性都是最一致的,因此我们比其他人更频繁地对该骨骼位置进行测试。

结束的想法
手部追踪可以成为您游戏中真​​正强大且易于使用的补充。对于Myst来说,这需要一些工作,但我们的工作很“聪明”,因为我们试图将它与我们现有的输入系统联系起来,这样我们就不需要对整个游戏进行太多的总体更改。我们的目标是创建一种直观且舒适的用户体验,而无需在后端构建完全独立的输入系统。

Meta 的 Unreal Engine 分支提供开箱即用的手部跟踪支持,绝对可以被能够进行引擎更改的团队使用。话虽如此,它需要一些修改才能让它识别有用的全手手势。我们真的很期待看到 Meta 在 Unreal 中对手部跟踪的支持与 Unity 中提供的支持相当。同时,在虚幻引擎中处理基于源代码的项目的团队应该会发现他们将有足够的灵活性来进行手部跟踪以适应他们的项目。