Unity3D动画中Root Motion的概念和使用

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com

Unity3D的Mecanim动画系统可以直接复用3DS MAX中制作的动画文件中的位移,这个就是通过applyRootMotion选项来达成的,我们只需要在使用Animator控制动画播放的同时,设置Animator组件的applyRootMotion字段为true就可以了。

applyRootMotion,从字面上理解来看,是“应用于根节点的运动”,官方文档的解释如下:

The Root Transform is a projection on the Y plane of the Body Transform and is computed at runtime. At every frame, a change in the Root Transform is computed. This change in transform is then applied to the Game Object to make it move.

直接翻译的意思是:

root transform是指body transform在在Y平面上的投影(即Y=0的平面,可以理解为模型所站立的“地面”。且这个投影是在运行时执行计算。在每一帧,root transform的每一个变化都会被计算。然后这些变化将会作用到game object上,使得它发生运动

也就是说,root motion就是指:在动画中物体产生的位移,可以在运行时,让绑定了Animator组件的game object,也发生实际的位移。且这个位移,是根据播放动画中每一帧物体的位移,在 X 和 Z 轴上投影计算而得

对于某些技能动画,整个动画是有一定位移的,但是动画的位移是动作设计师在设计时根据动作需要调出来的,位移是跟动作的幅度直接相关和匹配的。那么在释放技能的时候就只需要直接播放动画,只要应用这个 Root Motion 的特性,就可以很好的完成角色在播放动作的同时进行移动,动作播放完毕之后就在动画结束帧角色所在的位置。而不要额外地做计算工作。接下来看下animation clip inspector面板上若干和root motion有关的属性选项

animation clip inspector 界面上的一些属性介绍

Animation Clip Inspector

以下是Unity 2019.3版本的animation clip inspector面板的一些属性介绍

  • Root Transform Rotation: 根节点的旋转信息
    • Bake Into Pose:勾选后会将根节点每一帧的旋转方向信息烘焙到动画的骨骼运动中,在整个动画播放的过程中,根节点的旋转信息就不会在通过 Root Motion 作用到播放该动画的 GameObject 上了,这就意味着这个动画播放的过程中,该物体的 Transform 中的 Rotation 值不会因为动画中物体做了任何旋转而发生改变,而是会保持一个恒定的值,和该动画播放之前的旋转值保持一致;
    • Based Upon:根节点旋转的参考基准,这一项中有两个选项值OriginalRoot Node Rotation。分别指的是动画文件中指定的旋转值和根节点旋转信息。Original可以理解为动画中原点的旋转值,因为在整个动画播放的过程中,所有骨骼肯定都会有旋转和位移的变换,但是动画的原点其实一定都是确定的。
    • Offset:旋转角度与参考基准的偏移(以度为单位)
  • Root Transform Position(Y):根节点位移信息(Y 轴)
  • Bake Into Pose:勾选后会将根节点每一帧在垂直 Y 轴方向上的运动信息烘焙到动画的骨骼运动中,在整个动画播放的过程中,根节点在 Y 轴方向的所有位移信息不会通过 Root Motion 作用到播放该动画的 GameObject 上,这就意味着我们在场景中看到物体在 Y 轴上有位移,例如向上或者向下移动,但是该物体的 Transform 中的 Position 信息不会发生改变,会跟动画播放之前的 Position 信息保持一致;
  • Based Upon:在选中 Bake Into Pose 之后会变成 Based Upon (at Start),不勾选的时候是 Based Upon。不烘焙的话,那么 Root Motion 中 Y 轴的变化就依赖于选择的Original或者Root Node Position的 Y 轴位移变化,如果选择烘焙的话,那么就以这个动画的起始帧的 Y 轴作为整个动画 Root Motion 的 Y 轴位移,在整个动画播放的过程中,Y 轴的位移都是恒定不变的;
  • Offset:垂直方向上的偏移
  • Root Transform Position(XZ):根节点位移信息(水平面,XZ 轴)
    • Bake Into Pose:勾选后会将根节点每一帧在水平面(X 和 Z 轴)方向上的运动信息烘焙到动画的骨骼运动中,在整个动画播放的过程中,根节点在 X 和 Z 轴方向的所有位移信息不会通过 Root Motion 作用到播放该动画的game object 上,这就意味着在场景中看到物体在水平面上移动,但是该物体的 Transform 中的 Position 信息不会发生改变,会跟动画播放之前的 Position 信息保持一致,假如动画中物体会向前移动 3 米,我们会看到物体在整个动画播放过程中确实在向前移动,播放到最后一帧时确实向前移动了 3 米,但是当这个动画播放完毕之后,切换到任何其他的动画时,物体会直接闪回这个动画播放前物体所在的位置,所以通常需要保留动作位移的动画都不会勾选这个选项。那这个选项有神马用捏?例如某些待机动画,我们其实希望物体只是做一个待机动作,但是实际上不想让物体在水平方向上有位移,这个时候就可以勾选这个选项了,到时候看起来物体就像是钉在水平面上了;

简单总结

Unity中动画的变换种类

  1. body transform:动画发生的位移和旋转,只是单纯的动画效果,不会影响模型自身在世界空间中的实际位置和朝向。
  2. root transform:动画发生的位移和旋转,会改变模型实际的位置和旋转。

apply motion和bake into pose选项的作用和组合

勾选界面面板中的apply root motion选项,用来启动root transform。勾选界面面板中的bake into pose选项,用来启动body transform。组合勾选后的类型如下:

情况序号 apply root motion bake into pose 类型
1 true true body transform
2 false true body transform
3 true false root transform
4 false false root transform

描述:

如果对于一个动画,一旦勾选了Bake into pose,那么他的旋转(rotation),或者位移(Y、ZX)就变成了动画效果的一部分,而不会影响模型本身的旋转和位移。如果没有勾选bake into pose,那么这个动画的旋转和位移能否作用于模型,取决于apply root motion 是否为true。如果为true,那么会改变模型实际上的位移和旋转,反之那么只有动画效果,没有对模型的实际位移和旋转。

参考网页

Unity5.x Animator之RootMotion Unity apply root motion和bake into pose之间的联系