本文将讲述动画里“布娃娃系统”的发展,作为一个AAA游戏必不可少的大杀器!
一、什么是布娃娃系统
**布娃娃物理系统:**在物理引擎中代替传统静态动画的可变性角色动画系统,也称为“动画顺滑实时演算混合动画系统),传统的动画系统就是播放一段已经设置好的动画,但是缺少了物理(缺少交互感),布娃娃物理系统就是在传统的动画上加上物理
举个例子:一个在播放idle动画的角色,被其他角色碰撞之后,并不会做出反应,我们或许可以加一个状态机,使其对碰撞事件做出反应,例如碰到之后倒地/倒退的动作。但如果我们没有这这个动作,我们可以通过程序来填补这部分的空白,让idle动画对结合周围的物体做出相应的变化,这就是布娃娃系统。
二、动画物理流程上的变化
关于动画系统,可以查看上一篇文章——动画系统的发展
再来看上面这张图,未加入物理的动画如第一条流程:
输入的状态: 例如行走中的角色受到击打
处理前面状态的逻辑: 将角色击打这个信号进行逻辑处理,得到下一个动作应该播放“受击动画”
剪辑、混合: 将 “行走动画” 与 “受击动画” 进行混合用于过度(Montage)
输出姿势: 将混合的姿势输出
加入物理的流程如第二条流程:
告诉物理,这是最终要播放的动画: 字面意思
输入到模拟,此时这个对象周围可能有其他物体,需要一同计算物理: 将物理表现和动画进行一个混合
三、如何设计布娃娃系统
大部分以前的游戏里,模型上大多都是只挂载了一个胶囊体, 但这就无法做出最上方那种 两个球员之间亲密接触的效果了,因此我们肯定要重新设置模型上的碰撞体,让碰撞体尽可能地贴合模型,且能够令模型不僵硬(关节能够转动)
基于上述原因,布娃娃系统的碰撞体变采用人体骨骼的架构,在骨骼上装上碰撞体。
现在来思考下面两个问题:
1、人体有206块骨骼,所以每个角色都配置206个碰撞体?
2、每个骨骼质量按照人体的质量分布?
**关于第一个问题,**在每个骨骼上都加上碰撞体的结果就是——“眼睛都花了”,而且这还会带来巨大的运算量,与动画混合后的实际表现效果也不尽人意,因此我们只在主要的骨骼上添加物理,如下图
关于第二个问题, 在人真实质量的基础上,臀部质量大,四肢质量小,质量的比例如下图(取自顽皮狗的经验)
四、如何使物理跟随动画
上面为将角色全权交付给物理进行处理(相当于动画完全放弃了对角色的控制),类似于人在完全失去意识情况下(此时角色正在播放Idle动画),可见此时 Idle动画已经被完全吞了,如何让物理和动画共存?
答案是: 驱动角色的还是以动画为主,减少物理混合的比例,即寻找物理的位置,也就是动画希望我们在世界空间中到达的位置,并直接使用动画的速度
五、对骨骼进行限制——关节(铰链)
限制关节的旋转范围,图一中蓝色的区域为可以自由旋转的范围,红色的为极限范围(可以短时间内达到的角度,但是之后必须按照某一逻辑回到蓝色区域)
六、如何让角色更加聪明
**方案一:**预测,通过引擎模拟下一帧,预先判断是否会碰撞,让角色做出躲避的动作
**方案二:**加强学习,让角色自己去学习站起来,给出一个策略:“增加不倒的概率”方向去学习,最后得到的效果如上,是不是跟现实中的人相差无几了?
参考
Physics Animation in Uncharted 4- A Thief’s End - YouTube
Physics Driven Ragdolls and Animation at EA From Sports to Star Wars
Machine Learning Summit: Ragdoll Motion Matching
Machine Learning Summit: Ragdoll Motion Matching的解说