/【雷火UX体验设计】游戏中动画效果优化演进——骨骼动画

【雷火UX体验设计】游戏中动画效果优化演进——骨骼动画

骨骼动画(也可以称作绑定动画)是计算机动画中的一种技术。一般对象(或其他有关节的物体)由两部分组成:用于绘制对象的表面(称为网格或蒙皮)和用于为网格设置动画(关键帧)的一组相互连接的层次结构(称为骨骼)。虽然这种技术通常用于为人类和其他动物制作动画,但它是为了使动画过程更加直观,同样的技术可以应用于一些非生命类物体的形变。

该技术由NadiaMagnenat Thalmann、RichardLaperrière和DanielThalmann于1988年引入。这种技术几乎用于所有动画系统,其中简化的用户界面允许动画师控制复杂的算法和大量的几何图形。然而,原则上,该技术的目的不是模仿真实的解剖学或物理过程,而只是控制网格数据的变形。下文将从顶点动画开始,用递进的方式对一系列动画的优化的机理进行介绍。

Figure 1 用于显示面部表情的各种变形目标

顶点动画
顶点动画就是在顶点着色器中对顶点的坐标进行操作进而产生动画效果。物体模型通过顶点的位移来营造出物体不断的形变。在动画的每个关键帧中,都存储了这些形变位置的顶点。上图显示了用于显示面部表情的各种形变目标。

通常来说,得到我们想要的变化效果,是需要通过对每个顶点所在的每一帧都进行精密调整,保证整个动画中每一个顶点的运动轨迹都准确无误。现如今的游戏动画对帧率的要求都不一样,普通影视动画:24-30fps,游戏动画:30-60fps,虚拟现实:90-120fps。假设我们的模型应用在虚拟现实需要有90帧,那么我们需要将每一秒钟每个顶点的90个位置都记录下来,在动画运行的时候,每个顶点在一秒钟更新90次便可完成满帧(流畅)的动画效果。这样的做法非常的直观,动画精度也相当的高。但是要知道顶点数据除纹理之外是最消耗储存内存和显存空间的,且模型越复杂动画帧数越高,占用数据空间也就越大(纹理详见《游戏里常见的动画效果如何实现——顶点动画》的UV坐标章节)。这对运行效能、存储和复用方面来说是非常不利的。很明显,减少顶点位置在动画中的数据量才是优化这个问题的关键,观察上图吃豆人运动的轨迹和标红的位置。


Figure 2 贪吃蛇轨迹图
顶点优化

这个时候就需要引入关键帧和差值计算。从上图能够观察到在红色方块之间的吃豆人基本是遵循着比较简单的运动规律。我们可以通过前后两头红色方块的位置推理或者预测出吃豆人在其中的位置信息,而红色方块所在的位置即我们所说的关键帧。所以我们不需要再保存动画中的每一帧所对应的动画,而是大致的选定几个关键位置的顶点坐标就能模拟出与原轨迹相差不大的动画,这种模拟或者推测轨迹的手段便是所谓的差值计算。


Figure 3 关键帧

在观看动画、电影的时候,人们看画面不卡顿的最低要求便是每秒钟24帧。而在电影和动画制作的过程中,没有人会真的为每一秒制作24个画面,因为这样非常的不划算。但是当1秒钟少于24帧时,你就会觉得很卡,仿佛在看PPT。这时候就需要把在构成一段动画中起到决定性作用的2-3帧差值计算成若干帧,所以差值计算便就显得尤为重要了。


Figure 4 一秒钟里的画面

现在有些智能手机或者电视会装备有一个叫做MEMC的芯片,它可以通过运动补偿的手段实时的补足缺失的画面,类似于差值计算,但是其中算法的机制应该更加的复杂。


Figure 5 运动补偿对比(右边为补偿后)

但真的可以大幅缩减顶点数据,关键帧越少越好吗?答案是否定的。关键帧类似于音频的采样率,采样率越低得到音频就越离散,相对应与原音的差别也就越大。所以关键帧的数量和数据容积之间依然存在一个“甜点”区域。这种优化方案本质上就是通过时间换取空间的一种比较讨巧的做法,很明显它不是完美的,比如开启MEMC的设备普遍会产生画面延迟和拖影,对设备的计算能力也有一定的要求。所以我们的游戏动画优化之路尚未结束。
骨骼动画

这里用《顶点动画》文章中蛇形游动的鲨鱼作为一个例子。对我们来说很难从游动的鲨鱼中找到我们需要插值时所需的关键帧,相对于贪吃蛇的运动来说,它的游动没有比较简单的运动规律可言。非常肯定的是在这种情况我们只能记录下每一帧每个顶点的位置数据,然后再进行周期性的运行。插值和关键帧的优化方案完全不适用,在这种情况下就需要一个新的优化的方案。


Figure 6 蛇形游动的鲨鱼
刚性阶层动画

新的思路就是骨骼动画技术,通过类似刚性阶层动画的手段构造对象内部“刚性”空间,子模型(刚体)本身自己不会形变,只会被关节带动完成移动和旋转来实现总体联动,而“阶层”指的是子模型和刚体的关系。为对象设置动画的骨架由多个关节组成,这些关节中的每一个都具有由位置和旋转组成的变换,并且可能具有与其变换相关的父关节。就像图中的怪兽模型,一些骨骼动画网格将在本地原点有一个节点来帮助建模放置。


Figure 7 Doom地狱骑士以及它的模型骨架

在新的模型骨架下,动画是不再需要保存每一个顶点的信息了。骨骼运动的轨迹完全取代了顶点的运动。我们只需要移动骨骼就可以达成我们想要的动画效果。可以看到地狱骑士骨骼顶点和外部模型顶点不是一个数量级的(类似于表皮细胞和骨骼的差别)。我们只需要逐帧记录下骨骼顶点的位置信息,并使用插值完成整个动画。但是请注意!对象使用的关节不一定直接复制"真实"的关节在人类骨骼中的使用方式(和仿生学依然有很大的差距)。骨架在游戏中,一个角色的脸也可能是由关节组成的——嘴的两侧可能是关节。嘴边的关节可以通过动画来移动,使他们的嘴唇在说话时移动。如果你曾经见过一个高度精细的游戏角色把眼睛转向你,他们这样做是由于他们的眼球与"关节"相连。并且关节也可能被用作"连接"点。例如,一个在游戏中拿着武器的角色,可能是因为武器被连接到了角色的一个关节上。


Figure 8 骑士以及它的模型骨架(绑定姿势)

通常当新模型绑定到其底层骨架(称为绑定的过程)时,它通常被放置在绑定姿势中。例如,人类或这些示例中使用的地狱怪兽,绑定姿势是让网格的腿稍微分开,并将其手臂向两侧伸出。这是为了在建模时更容易访问单个顶点,并将网格置于完全“拉伸”状态,从而更容易将每个顶点加权到正确的关节。在骨架网格物体中加载时,如果没有对其应用动画,它很可能处于此初始绑定姿势状态。
骨骼蒙皮动画

到这一步我们优化的工作似乎完成了,刚性阶层的内部骨骼刚体仿佛能已经很好地胜任了。事实上这依然是不够的,刚性阶层只是粗略的引入了关节这一概念,然后粗暴的满足了总体联动的需求。但是这么做的缺点也很明显,在标记红色的关节处存在着明显的缝隙。因为刚体本身是无法完成形变的,这对于非生物体机器人类一类是没有问题的,但是对于那些有机体且有表皮的生物是不合理且无法接受的。到这里便需要引入一种新的技术叫做蒙皮动画。


Figure 9 关节含有轴承的角色

在骨骼动画中,通常使用称为顶点蒙皮的过程,其中每个顶点位置由多个参考点构成。这对于大量旋转的关节很有用。以肘部为例。图像中我们想要建立一个人体模型,并配有完全可摆姿势的手臂。如果我们试图模拟肘关节,我们最终会得到这样的结果:


Figure 10 顶点蒙皮

在上图的顶点蒙皮示例图中,显示了旋转单独网格时出现的重叠和间隙,而上图显示了如何通过使用单个网格并为顶点使用多个参考框架(在本例中为v0和v1)来避免这种情况。通过这种新的表现手法,关节处的顶点在扭动的过程中会被骨骼所影响,最终会随着总体联动移动到一个合适的位置来避免缝隙的产生,模拟出了表皮的感觉。无论关节如何变化,顶点的最终位置都是由其相对于多个参考点的位置确定的。每个参考点对最终顶点位置的影响程度取决于其权重。每个顶点对每个参考点都有一个权重值,它们加起来为1.0。然后使用这些权重值来进行缩放,通过关节的变换矩阵变换初始顶点位置的结果。


Figure 11 顶点位置公式

最终的顶点位置是通过将每个联合变换 t 乘以顶点或权重位置 v 的结果相加形成的,通过乘以联合权重值 w 来缩放。下面是一些示例,展示了如何使用其参考点计算顶点的位置。


Figure 12 直接顶点权重

首先,这是一个使用直接联合权重的示例。v0 是同样参照关节 j0 和 j1 绘制的,而 v1 是相对于 j1 和 j2 绘制的,其中 j2 的影响更大。在这两种情况下,都使用顶点本地位置,在 v1 的情况下,它比它被加权到的任何一个关节都稍微靠右。当使用加权锚点时,最终位置完全由锚权重位置之间的权重决定。在这个例子中,v0 有两个权重锚  w0 和 w1,每个具有相同的影响。这意味着 v0 将恰好位于 w0 和 w1 的联合变换位置之间的中点。


Figure 13 加权锚点位置

总体来看,在整个优化过程中引入了关键帧,插值,刚性阶层,骨骼蒙皮等手段。从最开始庞大的数据顶点,到通过寻找关键帧来插值求中间结果,并在最后引入骨骼动画,但是依然不可以说有了骨骼动画就能够淘汰顶点动画。顶点动画的优势在于它可以通过庞大的数据量保证整个动画以极高的精度还原原型工程师想要表达的东西。而骨骼动画的优势在于通过骨骼和蒙皮技术,获得更高的数据压缩率,从而达成游戏动画的渲染,可以算的上是各有优劣。其实在不同的画面或者不同的场景下制作游戏动画对应着不同的相对最佳的处理手段,没有所谓意义上最完美的方案,游戏制作漫漫长路永不停息。
往期推荐


本文来自微信公众号“网易雷火UX用户体验中心”(ID:LeihuoUX)。大作社经授权转载,该文观点仅代表作者本人,大作社平台仅提供信息存储空间服务。