科技魔方

荷兰学生演示如何用反向运动学构建VR环境手指交互

AR/VR

2019年01月29日

   2019年01月29日,日前,一位荷兰学生Tom Kemna通过Unreal引擎为手指应用了基本的反向运动学,并分享介绍了自己的开发历程。以下是映维网的具体整理:

  Tom Kemna实现的效果

  1. 背景

  简单的背景介绍,如果没有兴趣你可以跳过这一段。我是一名学生,而我们正在用HTC Vive Pro开发一款VR恐怖游戏。我希望获得更多与VR交互相关的经验,因此我争取到了玩家角色实现这一职责。在开发过程中,我看到一个视频关于将反向运动学用于上楼梯时双脚,于是我就问自己:嘿,我是否也能这样做呢?

  2. 介绍

  首先,如果你不知道什么是反向运动学,我推荐你看这个视频:

  简单来说,这是为骨骼网格制作动画的方法。在Unreal引擎中,你可以在动画蓝图中采用名为“Two Boned IK”节点的选项来实现这一点。你提供两个位置:一个“效应器”和一个“关节”,而它们将允许允许你操纵骨骼。

  2. 实现

  我已经开发了一个简单的系统:当你抓住对象时,系统将允许你用手指包裹它们。有很多方法可以实现反向运动学,下面我将介绍问题是什么,而我又是如何进行解决。然后,我将简要说明为什么会选择这个解决方案。

  2.1 问题

  对于沉浸感,我们需要双手的操作尽可能逼真。为此,我们需要用手指包裹对象并与之交互,这样我们就不会出现截断或非常静态的双手。

  这是一个问题,我们需要为一堆手指检测碰撞,然后它们需要停留在遇到的第一个对象上。

  2.2 解决方案

  最后,我选择了一个采用常规蓝图逻辑和动画蓝图逻辑组合的系统。

  要实现反向运动学,你需要准备一定的工具:1.正确rigged的骨架网格;2.rig的动画蓝图。3.利用骨架网格的蓝图。

  首先,我们需要找到手指所在的位置。我决定创建隐藏在游戏中的UE4箭头组件,并根据每个箭头的变换计算线条轨迹。

  下面是采用默认Unreal 4手部网格的蓝图视图:

  第三则与反向运动学有关。Unreal引擎允许用户设置Two-Boned反向运动学。如果采用动画蓝图,你可以将每个手指设置为通过两个位置将反向运动应用于两个骨骼。

  最大的障碍是设置效应器位置和关节目标位置。效应器位置是IK尝试放置骨骼的位置,而关节目标位置则是说明骨骼应如何旋转。关节目标位置实际上是一个误导性的名称,因为它位于你希望骨骼旋转的位置的对面,我花费了一定的时间才弄明白这一点。

  我们使用一个关节来旋转骨骼,并通过一个目标来定向骨骼。我们使用常规蓝图中的函数设置值来正确设置所有的值。我在示例项目中创建了三个函数,按以下顺序调用。

  SetAllFingerIK:一个调用SetSingleFingerIK()五次的函数(每个手指一次)。这意味着将代码组合成一个大函数。

  SetSingleFingerIK:每个手指最后都需要调用3个跟踪,所以这是一个line trace 集合。这将计算和设置动画蓝图中的变量。

  LineTraceAlongArrow:根据箭头的变换返回line trace的击中结果。

  3. 选择这一解决方案的原因

  除了单独为所有一切制作动画外,我找不到任何替代方案。当然,单独为所有一切制作动画是一项非常耗时的任务。动态地为手指制作动画是唯一可选的替代性解决方案,而反向运动学可以做到这一点。

  这很难做到这一点的原因是,关于这个具体问题的信息很少,这意味着我必须自己解决这个问题。最后,我自己开发了这样一个系统。如果你想在Unreal引擎中看看具体的实现,这里是一个示例项目。

+1

来源:yivian

推荐文章