设备追踪所能获得的数据是有限的,这导致我们在VR中的形象通常就只是一双飘浮着的手。然而,我们不可能和一个只有头和手的游戏角色聊天社交或者并肩作战。利用有限的追踪数据生成完整的全身角色动态,这对VR社交和多人游戏至关重要。
Pärtel Lang是一个独立游戏开发者,致力于研究游戏人物的动态系统构建。他成立了一家专门研究动作算法的公司。今年,为了开发VR游戏Dead and Buried,Pärtel Lang又领导研发了一套全新的VR运动解决方案,名为VRIK。
这篇文章介绍了VRIK开发过程中遇到的主要挑战和相应的解决方法,包括如何利用有限的头部和手部运动信息设计出可信的全身运动,如何设计脊柱、下肢和手臂的运动,如何处理角色的移动。
如何在多人VR游戏中解决IK(Inverse Kinetics)问题
消费级VR产品的兴起为游戏的设计和程序构造带了来许多新的挑战,其中就包括关于角色的运动。我在们VR中看到的自己是什么样的?我们在VR中看到的别人又是什么样的?现在的动作追踪技术仅仅局限于用户的头部和手部,那么,我们应该如何呈现用户的躯体?
现在市面上绝大多数的VR游戏根本不去设计玩家的身体。然而,在多人VR游戏中,玩家总要看到其他玩家,那就需要做出其他玩家的身体,总不能让玩家看着队友就一双手和一个脑袋飘在空中吧。
这里的难题在于,如何用仅有的动作追踪数据生成合理可信的全身身躯,不会让人觉得别扭、觉得假,要能够尽量保持玩家的沉浸感和临场感。
这篇文章给出了一个新的反向运动学(inverse-kinematics,先确定子骨骼位置,反向推导出其所在骨骼链上n级父骨骼位置,从而确定整条骨骼链的方法)解决方案,叫做VRIK. 这个解决方案是为Oculus平台上一个多人在线第一人称射击游戏Dead and Buried开发的。在这个游戏中,需要完整呈现出玩家和其他玩家的游戏化身。这篇文章将介绍在开发过程中遇到的主要挑战和解决办法。
从已有追踪数据生成全身动态
VR头显和手部控制器可以提供这样的数据:首先是玩家的位置,这是一个三维矢量;然后是头显和两个手部控制器分别的旋转信息,是一个包含四个信息的数据。但是,设备几乎给不出什么关于玩家躯干姿势的信息。通常来说,对于获得的信息有几种处理方式。反向动力学是一种常见的处理末端感受器(在这里就是手和头)位置信息,利用这些这些信息来生成整个关节链角度的技术。但是在现在的条件下,数据量不足以仅靠反向动力学技术本身生成的结果。
仅仅凭借头部和手部的追踪信息无法得出确定的位置,这意味着在处理这个任务时需要引入一些实际经验。距离控制器佩戴位置越远的身体部位,越容易出现计算错误从而破坏沉浸感。我们只能“猜”,但是我们要尽量利用手头的信息,猜得聪明一点儿。在这里,观察人们玩游戏时的动作能提供很多帮助和启发。
要创造出好的动作处理方案,要注意以下几个主要问题:
- 找到最放松的姿势。根据观察,这意味着在能够模拟大部分人体动作的同时,避免极端角度和长时间保持单一姿势。在多人游戏里,还要注意手势和头部姿势的表达要自然。
- 动作要好看,还要有Feel。维持动作的美观和风格非常重要,要配合游戏的主题,符合角色的身份,即使有些动作和玩家的真实动作不一致,也要保持游戏角色动作的美观。
- 移动动态。控制器无法得到关于玩家下半部分躯体姿势的信息,那我们怎么知道应该往哪儿搁脚呢?是选模拟的算法、程序性计算的算法,还是使用某种混合解决方法?
- 保持平衡。由于手和头是和控制器绑定了,所以脚的位置和脊柱的弯曲特别重要,关系到最终的姿势是否平衡。
- 支持不同的身体比例。无论是玩家还是游戏中的角色,样子都是多种多样。动作设计要支持不同的身体比例。
- 处理无效的信息输入。有时控制器信号会弱,或者玩家取下了一部分控制器然后暂时离开了,这时我们如何防止游戏角色姿势扭曲?
VRIK运动解决方案
目前还没有现成的全身IK方案能够满足VR内容开发的具体要求。我们需要的处理方案不仅要达到一定的动作精度和整体质量,还必须高效,因为VR本身对CPU已经是比较大的负担了。不仅如此,在多人游戏中,每一个玩家角色的生成都高度依赖全身IK方案实时计算,因此VR对IK方案的性能要求和计算频率需求都很高。每一个地方都要经得起细看,经得起与玩家真实的身体比较。
考虑到这些因素,我们决定要创造一个新的解决方案(VRIK)专用于处理三控制器信源数据。这是一个综合了分析(analytical)和探索(heuristic)的混合算法,可以实现两种做法各自的优点。这个解决方案按序处理每个身体部分的位置,允许玩家对身体动态的完全控制。这是通过以下的步骤细节实现的。
第1步:脊柱
如上所述,这个方案需要一步一步处理不同的身体部分。因为头部位置是定位的基准,所以这个方案将头显的位置和角度输入作为所要达成动作的基础要求。
首先需要确定脊柱和脖子的弯曲和旋转角度。观察人们的动态,我们可以得知通常人们在向上或向下看、转向或者歪头的时候,脊柱弯曲的程度。
在确定脊柱弯曲的时候,不仅头显的旋转数据很重要,手部控制器的数据也非常有价值,因为它有助于我们猜测胸骨的最终角度。如果你试着举起手,在手不动的前提下向左或向右转头,你会注意到胸部受到手位置的影响,从而进一步影响到脊柱旋转的角度。举起或者放下一只手的时候也是这样。尽管也可以在胸部不动的限制下做到这些动作,但是显然放松脊柱,产生自然的弯曲,这样的动作会舒服的多,这也就是我们想要达到的目标。
因此,在脊柱动态的计算中,头显获得的数据是最重要的,可以确定角色在水平面上的位置和高度,同时手部控制器可以修正胸部旋转的角度。
左边是计算了手部控制器位置数据后生成的脊柱位置,右边不考虑手部控制器位置信息
第2步:运动动态
角色的移动是动作处理方案要处理的最复杂的问题。在没有任何下肢信息的条件下,角色动作要生动、灵敏,看上去要自然,不能像机器人(除非游戏角色就是个机器人)。要是处理得不好,人物动态就会好像被头拖着走的牵线木偶一样。
Dead and Buried最初的动作处理方案是经典的八向度自上而下的动作控制:根据头部定位器和游戏角色头部之间的水平距离变化来判断是否发生了移动,如果距离变化超过了一定的阈值就触发踏步行走的动画。角色转身也是同样的原理。
但是,实践中发现,对于像Dead and Buried这样快速移动的射击游戏来说,这种方式太慢太不精确了。而且,转向和踏步的动画混合树(blend tree,混合树用于允许通过按不同程度组合所有动画的各个部分来平滑混合多个动画)是冲突的,而当时又没有能实现同时转向和踏步的很好的方式。所以,我们最终决定完全靠程序来计算人物移动,从而获得对人物脚部的完全控制。
这一移动算法以脚步位置为基准工作。角色的脚和踏步动作和位置绑定,除非踏步动作触发,否则脚一律不动。然后,计算何时由哪一只脚踏步、落脚点在什么位置就成了最大的问题。真实的人类在移动会有一些横步来保持平衡,所以算法也要考虑到这一点。
一旦脚部和踏步动作绑定之后,由于我们通过手部控制器可以得知手部的位置,而脊柱的弯曲也已经确定了,我们就能比较准确地估计出角色建模的重心(CoM, center of mass)和压力中心(CoP, center of pressure)。后者基本上是在左脚与右脚的正中,前者则可以通过快速估计头显和双手控制器构成的三角形的形心来确定。
重心Center of Mass,压力中心Center of Pressure,平衡矢量Balance Vector
我们需要把人物保持平衡的能力转化为一个标量值,以作为衡量踏步动作发生的触发器。这个标量值可以很高效地描述为重力矢量的反向与压力中心到重心矢量的角度。这个角度越大,人物就越不平衡,所以当这个角度超过一定的阈值,踏步就触发了。而这个踏步的方向就是这个平衡矢量在水平地面的正交投影。
同样,在某一点上的转向也有一个角度阈值。这里要注意踏步的那只脚不能踏另一只脚,不能两只脚打架。纯计算的移动方式让我们可以利用从这一步位置到下一步位置之间的光线衍射(Ray-casting,对实现许多多边形的碰撞产生的光线效果起加速作用)探测前进方向上的障碍物。在出发踏步之前确认路径前方的状况有助于实现好看并且符合逻辑的有效移动。
在现实生活中,除非失去了平衡,一般来说,人在迈步之前是不会左摇右摆的。通常人们在开始移动的同时就开始抬脚了。(虽然头显的移动会导致平衡标量值的变化)但我们却不能仅仅靠头显移动的信息来判定踏步的发生,因为我们无法确定头像的突然加速是因为玩家抬脚要走路了,还是玩家从掩体向外探了一下头。但我们还是能够把头显和手部控制器的运动速度作为一个预测工具,降低基于速度的平衡角度阈值来提高移动方案的灵敏度。
第3步:下肢
解决了脊柱和移动问题后,就可以把脚绑定到脚步位置了。最简单的腿部IK是利用三个关节的数据算三角函数,速度很快而且能得出非常精确的解析解。这里的主要问题是它只能处理三个关节,而且最终只能算出脚踝的位置。对于VR来说,把脚踝的位置锚定到脚步位置并不是一个很好的办法,因为这样一来游戏角色就不可能踮脚,并且缩小了头部的移动范围。因此,VRIK运用了双重三角计算(一次给出膝关节的位置解,然后是踝关节),这样把脚趾而不是脚踝锚定到脚步位置上。
解决下肢问题之后,我们有可能会遇到头的位置太高,脚没办法踩到地面的问题。这里你必须决定是让脚飘浮着,还是说把脚锚定住,让头的位置不固定。从我的经验来说,最好还是固定脚。因为从第三方的视角看起来,脚飘在地面上看上去比头部位置的偶尔的不精确要糟糕多了。因此,我们的运动方案移动了脊柱的位置,髋部的位置也随之移动,从而脚趾可以达到预定的目标位置。
第4步:手臂
和下肢一样,手臂也可以用三角计算的方式解决。这里我们遇到最大的挑战倒不是上臂或者小臂,也不是手,而是肩膀。人的手臂并没有那么大的移动范围,你不能简单地随着手的方向来转动肩部的骨骼。比如说,用左手从右肩拔出武器有时会导致肩膀向后侧。不过,因为在前面,我们计算出了胸骨的位置和面向,我们就可以利用这一点来辅助上肢的计算。VRIK运用了一整套具体规则和角度调整来处理肩膀的运动,而且限制了肩膀的旋转来保证肩膀的运动不会超出可信的范围。
因为这套解决方案无法得到关于手肘的任何信息,所以对手臂的弯曲它只能猜测。但这个猜测建立在三个信息源之上:玩家在现实世界中的位置信息,手部控制器的旋转角度,以及手部控制器与胸骨的相对位置。但实际上,手骨可以在不移动肘部的情况下转动,所以这种猜测也不是完备的,但它还是能够提供一个看上去比较自然和放松的结果。VRIK利用上述的三个信息来源和实践经验,构造了一个手臂转动平面矢量,事实证明这能够比较好地表现出大部分手势,而且动作还能做得比较好看。
总结
VRIK更接近分析和探索式算法的综合,这一点不同于大部分全身IK运动解决方案,它们通常在本质上属于探索式算法(heuristic,又译作启发式)。VRIK的这种设计使得开发者可以根据VR开发具体需求的不同,在每一步插入定制规则和定制程序,而不会被算法本身限制。就性能表现而言,VRIK可能超过了其他的全身IK运动解决方案。这个方案在与我们公司自己的Final-IK中的一个组成方案对比时已经好几次产生了更优的效果。
VRIK在实现更真实的VR角色方面又前进了一小步。未来,我们计划进一步改善这个算法,加上内部冲突回避机制,拉伸和挤压机制,眼动机制和关节运动限制等。
来源:vrzinc