找回密码
 立即注册
查看: 220|回复: 0

Cyan为Quest作品《神秘岛(Myst)》带来裸手交互跟踪

[复制链接]
发表于 2022-8-12 10:17 | 显示全部楼层 |阅读模式
查看引用/信息源请点击:映维网Nweon
正式支持裸手交互
映维网Nweon 2022年08月01日)使用Presence Platform升级的Hand Tracking API,开发商Cyan为Quest平台的作品《神秘岛(Myst)》带来了裸手交互跟踪。现在,Quest用户无需控制器都可以畅玩这款冒险作品。日前,团队撰文介绍了在《神秘岛》中实现手部追踪的过程,下面是映维网的具体整理:


在这篇博文中,我们将讨论在《神秘岛》中实现手部追踪的演变和迭代,特别是在Unreal Engine 4.27.2中为其添加更多支持。
设计阶段和注意事项
1. 设计手部追踪导航
如果要告诉别人走到哪个位置,你会怎么做?你会用手指指,对吧。所以我们选择在《神秘岛》中使用“指向”方法进行移动。


对于传送模式,你可以用手指指向目的地,然后传送环就会出现。当你伸出其余的手指,或简单地收回伸出的手指,系统就会执行远程传送。
对于平滑移动模式,你可以用主导手(可以在控制设置中配置,但默认情况下是左手)进行指向,然后角色将开始沿你所指的方向平滑移动。
我们发现,当用手指测试动作时,如果手指被手的其余部分遮挡,用食指和中指进行手部追踪有时并不可靠。系统不确定手指是属于指向状态还是收回到手中。所以我们在代码中添加了修正因数,稍后我们将进一步讨论。
2. 转弯
“指向”方法并不适用于所有导航用途。谈到转弯,我们最初将指向与手腕旋转相结合。比较玩家的手腕和摄像头的前向矢量可以指示转弯的方向(以及转弯应该有多大)。我们最初尝试了这一点,因为在所有模式之间保持导航的“指向”主题似乎非常直观。
然而,舒适度测试中出现了问题。在游戏测试中,大多数玩家都是手掌朝地指向前方。当手掌面向地面时,左右旋转手腕是一项挑战,并且运动范围非常有限,尤其是当尝试从胸部转开时。
即便你让玩家手掌朝右地指向前方,这个问题同样存在。你可以将手腕向身体方向弯曲很多,但将手腕向远离身体的方向弯曲时,你将无法获得相同的运动范围。
我们是如何解决这个问题的呢?最后,我们将转向指定为“竖起大拇指”的手势,而不是指针指向的手势。
想象一下竖起大拇指。现在左右转动手腕。请注意,即使你的动作幅度不大,但在这个手势中,你的拇指指向“左”和“右”依然相当一致。
尽管用拇指指向似乎不是最直观的转弯方式,但它确实是最舒适、最连贯的转弯方式。
对于快速转弯,从拇指向上的位置向左或向右旋转手腕,可以启动单次快速旋转。然后,你必须将手放回“中心”位置,以实现重置快速转向,并额外等待非常短的冷却时间,然后就可以再次启动快速转向。
对于平稳转弯时,当你离开“呆区”时,在拇指向上的位置转动手腕将开始向左或向右旋转。
3. 处理运动和对象交互姿势之间的冲突
当然,手指指向的手势应用范围太宽,不能假设它只用于导航。出于习惯或自己的期望,人们会做出同样的指向手势来按下按钮或与世界上的其他事物交互。走到(但不是直接走到)一个按钮前,用手指按它,然后突然(毫无意识地)启动传送,这将非常影响游戏体验。
当玩家进行交互时,我们防止移动发生的方法是:当做出“移动”手势的手在可交互对象的特定范围内时,防止任何移动代码触发。这个范围已进行多次调整,以达到基于测试的“甜蜜点”。
我们发现这个甜蜜点距离食指指尖骨骼的世界空间位置大约25厘米。《神秘岛》充满了各种大小的交互对象(从小按钮到非常大的杠杆),排列在宽阔的开放空间和狭窄的走廊中,所以我们投入了大量的测试来确定这个数字。我们最初尝试了60厘米,但当玩家依然需要靠近物体时,这阻止了移动。同样,当玩家尝试抓取或触碰物体时,任何小于25厘米的物体都会引发非本意的玩家移动。
我们最好的测试区域之一是发电机房。在那里,你需要通过一条狭窄的入口通道,然后立即会遇到一个充满按钮的面板。当交互测试区域太大时,玩家无法穿过入口并向面板移动,因为它检测到食指范围内的按钮。
换句话说,25厘米是专门针对《神秘岛》。其他游戏可能需要根据实际情况调整这个数字。
4. 设计用于手部追踪的对象交互
现在,《神秘岛》中所有可抓取的交互都是为转动阀门、打开大门、按下按钮、翻阅书页等而构建。
所述交行户是基于我们根据Touch控制器而为《神秘岛》进行的设置。对于这一点,按下抓取按钮会自动将游戏中手部网格表示融合到“抓取”姿势中,要么是卷成拳头状,要么是抓取对象。在手部追踪方面,我们添加了将对手指何时弯曲到足以“抓取”某物,并启动与前面提到的相同逻辑进行限定猜测的代码。
例如,当使用手部追踪时,当手部悬停在可抓取物体上时,手部颜色会变成橙色。当你开始将手指卷成拳头状并抓取一个可交互的对象时,一个橙色的球体将取代你的手部网格,并表示手附着到对象的位置。
之所以采用这种方法,而不是为手部制作定制的可定位网格,或者让手/手指看起来与对象的某些部分进行物理交互,是因为我们希望裸手交互能够匹配Touch控制器的体验。
但按下按钮的效果不同。由于按钮不是可抓取的对象,因此不需要抽象,相反,我们允许你使用生成的capsule collider在可定位手部网格的每个手指关节之间简单地按下按钮。你可以做各种奇怪有趣的事情,因为这就像只使用你的小拇指或无名指的指关节来与游戏中的每个按钮交互。
与通过Touch控制器来和游戏中按钮的交互方式相比,这种实现方式略有不同,因为我们通常希望玩家使用控制器的抓握按钮将手设置为posed“手指指向”网格,以便在游戏中准确按下末端的按钮。通过手部追踪,你可以用手创建的姿势明显更加灵活,因此可以用更多的方法以同样的精度按下按钮。
5. 菜单/UI交互
为了与菜单进行交互,我们最终采用了Meta在Quest平台使用的相同交互范式:拇指和食指相捏。这既可以用来打开游戏中的菜单,也可以与菜单中的元素进行交互。当玩家第一次在Quest中启用手部追踪时,他已经在操作系统级菜单中学会了这一点,所以重新发明轮子毫无意义。

  • 将所有这一切传达给玩家**
对于Quest,手部跟踪不像Touch控制器那样常见,而且可能有人是第一次开完《神秘岛》(甚至是第一次玩VR游戏!),所以我们尽量考虑如何将所有关于手部追踪的信息传达给玩家。我们确保包含专门用于描述手部追踪交互的“控制器图解”,并向玩家显示专门的通知,告诉他们如何准确地用手进行移动。
另外,我们认为一旦启用,提醒玩家如何拥有流畅的手部追踪体验至关重要。《神秘岛》的菜单会向用户告知,如果他们确保自己在光线充足的房间里,并将手放在视场之内,手部追踪的稳定性会更好。
Meta同样会告诉玩家,这是良好手部追踪环境的关键,但我们认识到,有些玩家可能没有注意Meta的告知并直接进入游戏,因此我们选择再次提醒大家,以防他们忘记。
7. 在Unreal进行引擎改动
我们目前正在为《神秘岛》使用Unreal Engine 4.27.2。Meta提供了用于在Unreal中进行手部追踪的基本代码,但对于像我们这样需要更好的手势和置信度检测的游戏而言并不足够。Meta的大部分手势检测和用于手部追踪的物理库目前仅在Unity中可用,因此我们需要在这方面进行基础性的改动,以获得能够在Unreal中识别的简单手势,如“竖起大拇指”和“手指指向”。
8. 系统手势垃圾修复
如果你开始按压,即便不是等待确认按压已处于相同状态一段时间,Oculus左手系统手势(用于菜单按钮)都会触发。我们通过将Oculus输入库中的事件更改为等待按压完成(等待系统手势填充其确认圈),然后再触发notify事件来修复这个问题,而不是在事件进行时这样做。
9. 多平台Build稳定性
与任何Blueprint一起序列化的Oculus Hand Component将导致其他平台(如Xbox)的Build在本地化步骤中中断。这是因为Oculus Hand Component是OculusVR插件的一部分,而所属插件仅针对Windows和Android启用,因此在构建其他平台时,不能在Blueprints中引用其任何component。
在Unreal Engine 5中没有官方支持本地化,但对于Unreal Engine 4中的用户来说,根据项目的需要保持启用状态可能依然有用。因此,在Blueprint level为所有平台打包的游戏纳入一个hand component不可行。
我们的解决方案是,每当检测到手部追踪启用或禁用时,我们只会在Touch控制器生成和销毁C++中的Oculus Hand Component,并且所属功能仅在为Quest构建的Android Build中启用。hand component源代码和我们所有的手部追踪代码都被排除在其他平台之外。
遗憾的是,这意味着如果你是一名开发者,拥有一个面向多个平台的Blueprints-only项目,并在Unreal Engine 4中利用本地化,同时正在考虑为Quest实现手部追踪,你可能必须将项目转换为源项目,以避免Quest以外平台的本地化问题。
10. 自定义全手手势识别
在Unreal中,Oculus输入库中没有内置有意义的全手手势识别。这意味着,如果你做了一个竖起大拇指或手指指向等要求其他手指塞进去的手势,Unreal不会通知你发生了这个特定的手势。
我们的解决方案是在Oculus Hand Component中实现我们自己的骨骼旋转检测,从而推断何时:

  • 手指指向(食指)正在发生
  • 抓取动作正在发生
  • 出现竖起大拇指的手势
所有这一切都会作为可以在C++中绑定的输入事件激发。
11. 手势和追踪稳定性调整
在Unreal中实现和测试《神秘岛》的手部追踪支持时,当某些手指在被手的其余部分遮挡时,其追踪稳定性存在一定的问题。例如,如果你:

  • 在抓取物品时所有手指都背对你,亦即被手背遮挡
  • 在用食指指向时举直举高手部
我们注意到,在抓取物品时所有手指都背对你,手部追踪有时可能会认为你的小指没有夹在拳头里。事实上,当抓取物品时只看到手背的时候,所有手指的追踪精度并不特别高。这是一个问题,因为当我们希望玩家抓住阀门或杠杆等物品,继续转动/移动它们,并且不会很快放开的时候,手部追踪系统可能会认为你不再抓取物品,因为它会认为你松开了手指。
在用食指指向时举直举高手部时,有时手部追踪系统会认为你的中指比实际更放松,甚至会认为你是同时用中指和食指进行指向。这是我们导航和移动系统的一个问题。如果系统不再认为你只是用手指进行指向,它可能会认为你在尝试抓住什么,从而阻止你移动,或者无意中执行了一个你还没有准备好启动的远程传送。
对于这两种情况,我们的解决方案都是添加单独的手指阈值,在我们认为一只手“不抓”或“不指”之前,我们允许在这些情况下有问题的手指放松。通常情况下,追踪系统认为手指比实际更放松,而不是相反。我们将所述阈值纳入到在Oculus Hand Component之中。
12. 其他方便的实用程序
为了实现自定义手势识别,我们对Oculus Hand Component源进行了大量修改,但我们同时为了它的一些实用性功能而进行了修改。我们编写的功能之一是一个用于从世界空间中的其他点获取手部碰撞最近点的一个实用程序。它同时返回最接近的骨骼的名称。我们将这个实用程序功能用于不同交互的各种输入验证。
值得一提的是,我们发现无论手的深度如何,对腕骨的追踪可靠性都是最一致的,因此我们比其他人更经常地对所述骨骼位置进行测试。
13. 写在最后
手部追踪可以成为游戏中一个非常强大的附加功能。对于《神秘岛》而言,这需要一定的工作,但我们尝试将其与现有的输入系统相结合,这样我们就不需要对整个游戏进行太多整体性的更改。我们的目标是创造一种直观舒适的用户体验,而不需要在后端构建一个完全独立的输入系统。
Meta的Unreal Engine分支提供了开箱即用的手部追踪支持,可以由能够更改引擎的团队使用。话虽如此,它需要一定的修改才能识别有用的全手手势。我们真的非常期待看到Meta对Unity的手部追踪能够赶上Unreal。同时,能够在Unreal中轻松处理基于源代码的项目的团队应该会发现,他们有足够的灵活性来根据项目实现手部追踪。

---
原文链接:https://news.nweon.com/99452

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-25 07:41 , Processed in 0.157509 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表