VR/MR交互:自由抓握物体且不穿模的实现

前言

很多小白用户会有一个误区:看到某些 VR(or MR/XR/各种 R)厂商宣传手势追踪,总以为它和 PC 鼠标指针一样,能够无缝使用在所有存量 VR 应用中。

然而,和 2D 窗口不同,目前 VR 应用及 VR OS 间并没有(也无法有)一个全局的“鼠标指针”(Apple Vision Pro 的 Volume 3D 应用有统一交互的概念,但也远远不够)。

3D 空间下,各个 VR 应用内的交互均是应用自行实现的,如果应用没有实现相应交互(如手势追踪),那用户就没办法使用该交互。

谈到 VR/MR 及手势追踪,一个绕不过的交互就是手模抓握物体,本篇就谈谈 3D 空间中自由抓握物体且不穿模的交互实现。

不穿摸抓取?

本文谈论的不穿摸抓取主要包含:

  • 空手移动手模不穿摸
  • 单手/双手抓握物体时手指不穿进物体
    • 真·自由抓握(实时生成抓握关节姿态)
    • 伪·自由抓握(预设抓取点及关节姿态)
  • 抓握物体后移动不穿摸
  • 特殊
  • 多人游戏

本文只谈论实现的思路,不涉及具体代码。项目实施过程中往往需要根据需求定制一套交互系统,因此不大可能有一个包含万物、又大有全还通用的交互系统。

空手移动不穿模

VR 环境下,虚拟世界手模是由硬件设备(或手势识别) 上报的 Pose 驱动的。

现实世界中并没有虚拟场景中的这些障碍物,因此不能阻挡真实世界中的用户手/手柄。

既然如此,若想让虚拟世界中手模移动不穿模,模型 Pose 和设备上报的 Pose 就得分开:虚拟模型 Pose 追逐设备真实 Pose,但二者可以有偏差,因为模型 Pose 可以被虚拟障碍物阻挡。

常见的两种实现方式:

  • 利用刚体特性,计算并施加力或控制刚体速度,让手模型一直“追逐”真实 Pose;
  • 利用刚体 + 关节(Joint)特性,通过 Joint 连接真实 Pose 与手模,由引擎自动完成“追逐”解算。

在合理的移动速度下,物理系统中的刚体可以被其他碰撞体阻挡,因此手模具备了不穿摸的特性。

为了优化展示效果,当手模 Pose 与真实 Pose 距离过大(或 Joint 受力达到一定阈值)时,大多数游戏会重置手模位置。

真·自由抓握

原理

抓握时,真·自由抓握需要根据物体 Pose 和手 Pose 实时生成抓握的关节手势。

在 VR 游戏中,真·自由抓握反而是不常见的,因为很难控制抓握效果。不过,其真实感要高一些。

一个比较通用的实现思路:

  • 通过一组射线投射或其他 Cast 方式,获取最适合的 HitPoint;
  • 将手模移动到离 HitPoint 最近但不穿摸的点(eg:将手模移动到 HitPoint,并根据 Physics.ComputePenetration 结果后退一段距离)
  • 对每个手指进行逐关节步进(Stepping)抓握,直到关节摸到物体或达到最大弯曲阈值
  • 逻辑上认为此时已完成抓握,通过自行计算、Joint 等方式控制物体 Pose

一般情况下,这种方式可以获取比较自然的抓握姿态,并可对物体任意位置进行抓握。

双手抓握

抓握姿态生成逻辑和单手相同,均通过关节步进生成抓握姿态。

但是,单/双手抓握对物体 Pose 的影响还是有区别的:单手抓握时,物体 Pose 依赖一只手 Pose;双手抓握时,物体的 Pose 依赖两只手的 Pose。

如果通过 Joint 连接手模与物体,那物体姿态由 Joint 解算,需要控制好 Joint 参数;

如果自行计算,则根据需求不同自行实现:如果设计合理,根据两只手的 Pose 计算出“物体应该在的位置”理应不难,得到位置后移动物体及手模即可。

抓握状态下移动不穿摸

和上文空手移动类似,将手模和抓握的物体视作同一个物体,整体看待即可。

某些游戏在阻力过大、双手抓握时两手距离过远等情况下物体会脱手,需要酌情采取实现方法。

伪·自由抓握

原理

这是 VR 应用常用的实现方式,原理也很简单:

  • 给一个物体绑定几个抓握点,每个抓握点绑定预设的抓握 Pose;
  • 抓握时,选取最近的抓握点,手模型切换至抓握点预设的抓握 Pose 完成抓握。

由于是预设的抓握点和抓握 Pose,因此自然不会穿模。

当你抓握点设置的足够多,可以近似为自由抓握。

至于抓握到底是如何执行的,各家有各家的方法:有的游戏直接设置为子物体,有的游戏用 Joint,还有的游戏自己算。

双手抓握

双手和单手在挑选抓握点方面没有本质上的不同,两个手各自选取最近的抓握点即可。

其余注意事项同真·自由抓握。

抓握时移动不穿摸

上同。

特殊

对于门把手、开关等虚拟物体,不再是物体跟手,而是手跟物体。

这种情况下,书写逻辑时,我们的物体脚本需要有可扩展性,至少能根据物体特性执行不同的行为。

多人游戏

我个人认为,在多人游戏中采用伪·自由抓握的方式是最好的,因为其抓握结果是确定的,对同步非常友好。

MR/VR 多人游戏不是竞技就是社交,这些游戏的可抓握物体往往非常有限且可控,真·自由抓握没有优势(想象一下用户拿武器怎么都拿不好的场景)。

梓喵出没博客(azimiao.com)版权所有,转载请注明链接:https://www.azimiao.com/10128.html
欢迎加入梓喵出没博客交流群:313732000

我来吐槽

*

*