使用Presence平台升级的手部跟踪API,我们在Meta Quest平台的最新更新中将手部跟踪引入到了《神秘岛》(Myst)中,取名为“Hands & More”。我们非常兴奋,终于让玩家可以在Quest上玩《神秘岛》而不需要物理控制器!在本文中,我们将讨论在《神秘岛》中实现手部跟踪的演变和迭代,特别是在Unreal Engine 4.27.2中增加对其的更多支持。
嘉宾文章:Hannah Gamiel
Hannah Gamiel是Cyan工作室的开发总监,该工作室是最初创作《神秘岛》游戏的团队,并参与开发了包含虚拟现实支持的新版《神秘岛(2020)》。她最初拥有纯粹的技术背景,现在协助领导所有项目的制作,并管理Cyan的商务和技术工作。她曾参与开发《神秘岛(2020)》、《见证者》、《编织,周年纪念版》、《异界》、《Firmament》(即将推出)等作品。
设计阶段与考虑因素
设计手部跟踪的导航方式
如果让你想象去某个地方,你可能会想到用手指指吧?这就是为什么我们选择在《神秘岛》中使用“指向”方法进行移动。
当你处于传送模式时,你可以朝你想去的地方指向,然后传送环将出现在你的目的地。当你“取消指向”(通过伸展其他手指,或者将食指拉回手掌)时,传送将执行。
当你处于平滑移动模式时,用你自由移动优势的手(可以在我们的控制设置中配置,但默认为左手)指向某个方向,将开始平滑地朝该方向移动。
在使用指向进行移动的测试中,我们发现手部跟踪有时在食指和中指被手的其他部分遮挡时不太可靠。系统无法确定这些手指是完全指向还是完全“闭合”在手中。因此,我们在代码中添加了一些“偏差因子”来实现更稳定的移动启动/执行,稍后我们将在讨论有关在Unreal Engine中对开箱即用的手部跟踪支持进行的更改时进行详细说明。
转向
“指向”方法并不适用于所有导航用途。在转向方面,我们最初将指向与手腕旋转相结合。比较玩家的手腕和相机的正向向量可以指示转向的方向(以及转向的大小)。由于我们希望在所有模式之间保持“指向”主题的一致性,所以我们最初尝试了这种方法。
然而,在舒适度测试中出现了问题。在测试中,大多数玩家希望伸直手掌向前指向,就像在游戏之外指向某物时一样。而当你的手掌向下面对地面时,左右旋转手腕(绕手腕的上轴)确实具有挑战性,且运动范围非常有限,尤其在试图背离胸部方向时。
即使让玩家用手掌朝内部指向前方也存在同样的问题。你可以将手腕朝内弯曲很多,但将手腕朝外弯曲时运动范围却不同。
那么我们是如何解决这个问题的呢?我们最终将转向分配给了“竖起大拇指”的手势,而不是指向手势。
想象一下竖起大拇指的手势。然后向右和向左旋转手腕。注意,即使不具有巨大的运动范围,用拇指在这个手势中指向“左”和“右”是相对一致的。
这就是我们在手部跟踪模式中最终确定的转向方法。虽然用拇指指向并不是最直观的转向方式,但实际上它是最舒适和一致的方式。
在使用快速转向时,从竖起大拇指的位置向左或向右旋转手腕将进行单次快速转向。然后,你必须将手放回“中心”(直立)位置以重置快速转向命令,并且还需要等待一个很短的冷却时间再次转动手腕来触发快速转身。
通过平滑转动,当你将手腕呈拇指向上的姿势转动时,你会开始向左或向右旋转,只有当你通过一个阻止转动发生的“死区”后才会发生转动。
处理运动和物体交互姿势之间的冲突
当然,指着手指是一个过于宽泛的手势,不能假设只用于导航。人们会使用相同的指点手势来按按钮或与世界中的其他物体进行交互,这只是出于习惯或个人的期望。如果你走向(但没有走到)一个按钮,伸出手指按下它,然后突然(并且不希望)在游戏中靠近它(或无意中启动传送),那将是相当突兀的!
我们通过阻止任何运动代码在“移动”手势的手在可交互对象的一定范围内时触发来防止在玩家可能正在与某物进行交互时发生移动。这个范围经过多次调整以达到在玩测试的基础上的“最佳位置”。
我们发现,这个“最佳位置”大约是距离食指指尖骨的世界空间位置大约25厘米的地方。《神秘岛》中有各种大小的可交互对象(从小按钮到非常大的杆)布置在宽敞的空间和狭窄的走廊中,所以我们经过了大量的测试来确定这个数字。我们最初尝试了60厘米(约2英尺),但这会阻止玩家在仍需要靠近物体时发生移动。同样,25厘米以下的距离会导致在玩家试图抓取或触摸物体时触发不希望的玩家移动。
我们最好的测试区域之一是《神秘岛》中的发电机房,你需要穿过一个狭窄的入口,然后立即面对一个充满按钮的面板。当交互测试区域过大时,玩家无法通过入口并朝面板移动,因为它检测到与食指范围内的按钮。
也就是说,25厘米是适用于《神秘岛》的具体数值。其他游戏可能需要根据自己的标准对这个数值进行调整,以实现类似的效果。
为手部追踪设计物体交互
目前,《神秘岛》中的所有可抓取的交互都是针对手部追踪而设计的-旋转阀门,打开门,按下按钮,翻动书页等等。
这些交互是基于我们之前在《神秘岛》中使用触控控制器设置的。在那里,按下抓握按钮会自动将你的手在游戏中的网格表示混合为“抓住”姿势,要么是握拳(如果是空的),要么是抓取物体。对于手部追踪,我们添加了代码来判断你是否已经弯曲手指足够“抓取”某物,并启动前述的相同逻辑。
例如,当你使用手部追踪时,当你的手悬停在可抓取的物体上时,你的手的颜色会变成橙色(这与在Myst VR中不使用手部追踪时发生的情况完全相同)。当你握紧手指开始“抓取”一个可交互物体时,一个橙色的球体会取代你的手模型,表示手连接到物体的位置。
我们之所以采用这种方法,而不是制作定制的可调姿态手部模型,或者允许你的手/手指看起来可以与这些物体的一部分进行物理交互,是因为我们希望这些交互暂时与我们在触控控制器方面提供的交互功能保持一致。
不过,按下按钮的方式有所不同。因为按钮不是可抓取的物体,所以不需要抽象化,我们允许你简单地使用可调姿态手模型上每个手指关节之间的生成的胶囊碰撞器来按下按钮。因此,你可以因此做出各种奇怪而有趣的事情-例如只使用小拇指或无名指关节与游戏中的所有按钮进行交互,如果你真的想这么做的话。
这个实现方式手势交互方式在游戏中与触控手柄按钮的交互方式稍有不同,通常我们期望玩家使用手柄上的夹持按钮来设置手型为“指向”的模型以便能够在游戏中准确地按下按钮。利用手部追踪技术,可以以更灵活的手型进行操作,因此在准确性相同的情况下,按下按钮的方式也有更多的选择。
菜单/用户界面交互
在与菜单交互方面,我们采用了 Meta 在 Quest 平台上使用的相同交互模式:通过大拇指和食指之间的二指捏合,可以在任意一只手中实现。这种方式既可用于打开我们的游戏内菜单,也可用于与菜单中的元素进行交互。既然玩家在首次启用手部追踪时已经学会了在操作系统级别菜单中使用这种方式,那就没必要重新发明轮子了!
向玩家传达这些信息
由于手部追踪在 Quest 上并不像触控手柄那样常见,而且可能有些人是第一次玩《迷霧》(甚至是第一次玩 VR 游戏!),我们在向玩家传达关于手部追踪的所有信息时都力求周到。我们确保包含了另一个“控制器示意图”的版本,专门用于描述手部追踪交互(在《迷霧》中启用时),并向玩家显示特定的通知,告诉他们如何用手进行移动。
此外,我们认为提醒玩家如何获得流畅的手部追踪体验也非常重要。在《迷霧》的菜单中,玩家会收到通知,如果确保房间光线充足并将双手保持在视野范围内,手部追踪的稳定性会更好。
Meta 也会告知玩家这对于良好追踪手部环境至关重要,但我们意识到有些玩家可能会在未先了解 Meta 的相关声明的情况下直接进入游戏,因此我们选择进行提醒以防他们忘记了。
继续阅读第二页:Unreal 引擎的修改»
在 Unreal 引擎中进行的修改
这一部分将会更加技术性,请做好准备!
我们目前在《迷霧》中使用的是 Unreal Engine 4.27.2。Meta 在 Unreal Engine 中有一些用于手部追踪的基础代码,但对于像我们这样需要更好手势和可信度检测的游戏,这还远远不够。目前,Meta 在手部追踪方面的许多手势检测和物理库仅在 Unity 中可用,因此我们需要在这方面进行一些基础工作,以便在 Unreal Engine 中能够识别简单手势,如“大拇指朝上”和“指向”手势。
此外,还有其他一些元素需要开发人员自己实现,以便创建一个可交付的手部追踪项目,我将在下面详细介绍。
系统手势干扰修复
Oculus 的左手系统手势(用于菜单按钮)会在开始手指捏合时触发,而不是等待捏合保持相同状态一段时间后触发。我们通过修改 Oculus 输入库中的事件,使其在捏合完成后(等待系统手势填充确认圆圈)触发一个通知事件,而不是在捏合进行时触发。
多平台构建稳定性
将 Oculus Hand 组件与任何蓝图进行序列化会导致其他平台(如 Xbox)在本地化步骤中出现错误。这是因为 Oculus Hand 组件是 OculusVR 插件的一部分,该插件仅在 Windows 和 Android 上可用,因此在构建其他平台时无法引用它的任何组件。
虽然 Unreal Engine 5 并不正式支持本地化,但对于 Unreal Engine 4 中的开发者来说,根据项目的需要,保持启用本地化仍然是有益的。因此,在为所有平台打包的游戏中,在蓝图层级上包含手部组件是不可行的。
我们的解决方案是只在需要时生成和销毁 Oculus Hand 组件。每当检测到手部追踪启用或禁用时,在我们的触控手柄上使用C++组件实现这个功能,而且该功能仅在为Quest构建的Android版本上启用。手部组件源代码和所有手部追踪代码都被排除在所有其他平台之外。
不幸的是,这意味着如果你是一个仅使用蓝图的项目,并且针对多个平台使用Unreal Engine 4进行本地化处理,并且正在考虑为Quest实现手部追踪,那么你可能需要将你的项目转换为源项目,以避免在除Quest之外的平台上进行本地化处理时出现问题。
自定义全手势识别
在虚幻引擎中,除了系统手势的手指捏合之外,内置输入库中没有任何有意义的全手基于手势识别。这意味着如果你做出了拇指朝上的手势或需要其他手指都握成拳头的手指指向手势,虚幻引擎中没有任何内置的东西会通知你正在发生的特定手势。
我们的解决方案是在Oculus Hand组件中实现自己的骨骼旋转检测,带有可调节的容差,以推断以下情况:
发生了指向手势(使用食指)
发生了抓取行为
发生了拇指朝上手势
所有这些都会作为输入事件被触发,我们可以在C++中绑定它们,我们在其中包含了大部分基础玩家控制器、角色和触控手柄代码。
手势和跟踪稳定性调整
在为虚幻中的Myst实现和测试手部追踪支持时,我们注意到当手指被手的其他部分遮挡时,对某些手指的跟踪稳定性存在一些问题。例如,如果你:
用所有的手指远离你的朝向抓住某物
直接朝向你的食指
在用所有的手指远离你的朝向抓住某物的情况下,我们注意到手部追踪有时可能会认为你的小指没有紧握在拳头中,就好像它稍微松弛了一样。实际上,当手指被手的背面遮挡时,即使它没有低信心跟踪,所有手指在握拳时的跟踪精度也不是特别高。这对于我们期望玩家可以抓住诸如阀门或杆的物体并进行转动/移动而不会过快松开手的情况造成了问题 – 手部追踪系统可能认为你不再抓住物体,因为它认为你松弛了你的手指。
在将食指指向远离你的情况下,有时手部追踪系统会认为中指比实际放松,甚至连同食指一起指向。这对我们的导航和移动系统造成了问题。如果系统不再认为你只是用食指指向,它可能会认为你正在尝试抓住某物并阻止你移动,或者不经意间执行一个你还没有准备好发起的传送。
我们针对这两种情况的解决方案是为这些场景下我们允许的有问题手指放松程度添加一些单独的门槛,以便我们将一个手判断为“不抓住”或“不指向”。事实上,往往是跟踪系统会认为手指比实际放松更多,而不是相反。我们将这些门槛直接构建到我们决定通知用户手势的地方 – 就是Oculus Hand组件中。
Oculus Hand组件的其他实用工具
为了实现我们自定义的手势识别,我们对Oculus Hand组件的源代码做了很多修改,但我们还对一些实用函数进行了修改。我们编写的其中一个功能是一个实用工具函数,用于获取手部碰撞上与世界空间中的某一点最近的点。它还会返回最近的骨骼的名称。我们在不同的交互中使用这个实用工具函数进行各种输入验证。
值得一提的是,我们发现当手指被手的其他部分遮挡时,手部追踪系统的跟踪稳定性存在一些问题。无论手的深度如何,将跟踪可靠性提高到手腕骨骼处的一致性最好,因此我们更经常在该位置进行测试。
总结
手部跟踪可以是游戏中非常强大且易用的增加。对于《Myst》来说,虽然需要一些工作,但我们采用了“聪明”的方法,试图将其与现有的输入系统结合起来,这样就不需要对整个游戏进行太多的整体性更改。我们的目标是创建出一种直观且舒适的用户体验,而不是在后台构建一个完全独立的输入系统。
Meta与Unreal Engine配套的分支默认支持手部跟踪,并且可以被能够进行引擎更改的团队使用。但是,为了让其能够识别出有用的整体手势,需要进行一些修改。我们非常期待Meta在Unreal中对手部跟踪的支持能够与他们在Unity中提供的相当。与此同时,对于习惯于在Unreal中进行基于源代码项目开发的团队来说,他们会发现有足够的灵活性来使手部跟踪与项目相匹配。
– – — – –
我们很乐意听取大家对我们的流程的意见,并了解是否有兴趣让我们在Unreal上提供一个类似的系统供大家使用和构建。您可以通过info@cyan.com与我们联系,或者在Twitter上联系我(Hannah)@hannahgamiel。感谢阅读!
0