1. 基本概念
在Unity3D动画中,模型的位置、角度经常会发生变化,我们需要决定是否将模型在动画中发生的这些变换化用到实际模型(GameObject)中。
在Untiy3D中将动画中的变换分成两类:
1) Body Transform (pose:姿势)
2) Root Transform (trajectory:轨迹)
我们可以设置动画中的关于模型的一些变换(平移、旋转等)是属于Body Transform(pose)还是Root Transform(trajectory)的一部分。
举例如下(ac001为角色跑步):
在上图中:
1) 如果【Apply Root Motion】未选中:则角色在原地跑步,且Transform中的值没有任何变化
2) 如果【Apply Root Motion】已选中:则角色在场景中跑步,且Transform中的值跟随变化
1.1 Body Transform (Pose:姿势)
身体变换 (Body Transform) 是角色的质心(the mass center of the character)。它用于 Mecanim 重定位引擎,提供最稳定的位移模型。身体方向 (Body Orientation) 是下半身方向与上半身方向的平均,与 Avatar T 字姿势 (T-Pose) 相关。身体变换 (Body Transform) 和方向 (Orientation) 存储在动画片段 (Animation Clip) 中(使用 Avatar 中设置的肌肉定义)。它们是存储在动画片段 (Animation Clip) 中的唯一世界空间曲线。其他一切事项:肌肉曲线和 IK 目标(四肢 (Hands and Feet))相对身体变换存储。
1.2 Root Transform(trajectory:轨迹 实时计算)
根变换 (Root Transform) 是身体变换 (Body Transform) 在 Y 平面上的投影,在运行时计算。在每一帧,根变换 (Root Transform) 中的变化都会计算出来。然后变换的变化会被应用到游戏对象 (Game Object) 上,使之移动。
角色下面的圆表示根变换(Root Transform)
1.3 Bake Into Pose (烘焙为姿势)
Bake Into Pose:也就是将变换设置为Body Transform(pose)的一部分。
如果把变换设置成Body Transform(pose)的一部分,就相当这些变换是属于动画本身的一部分,即无论是否设置Apply Root Motion,在场景中,我们都会看到模型位置或角度的变化。因为Body Transform不影响模型(GameObject)实际的位置和角度,所以这里只是纯粹的动画效果,模型(GameObject)的位置和角度参数值不变
如果设置成Root Transform,Root Transform将影响模型(GameObject)的实际位置和角度(前提是要设置“Apply Root Motion”,如果不设置Apply Root Motion的话,也就是说变换将不应用,场景中的模型(GameObject)位置或角度是不会有变化的<Transform值自然也不变>,就像一个行走动画,可能一直在原地行走)。
1.4 Apply Root Motion
Apply Root Motion作用如下:
1) 决定是否应用Root Transform:
如果勾选【Apply Root Motion】,则应用Root Transform在播放动画的同时,模型(GameObject)的位置和角度会同时跟着变化。如果不勾选【Apply Root Motion】,则不应用Root Transform,所有的Root Transform都将不起任何作用。即相当于所有没有Bake into Pose 的变换都不起作用了。
2) 在动画结束后,将Body Transform中的变化应用到模型:
这里是结束的时候才应用,也就是说动画的时候,模型的(GameObject)position、rorate等参数是不变的,当动画结束之后,开始新的动画之前才会改变,注意这里跟前面提到的Root Transform的区别
2. 实例说明
下面以一个人物行走的动画为例,分析以下几种情况(这里以“Root transform position(XZ)为例)
1) 勾选【Bake into Pose】,不勾选【Apply Root Motion】
勾选”Bake into Pose"后,变换属于Body Transform,所以即使这里未勾选”Apply Root Motion“,但是动画依然会在场景中体现,人物会按照动画的路径行走(但是如果我们观察Inspector中模型的Transform,其值一直不变)。这是因为没有勾选Apply Root Motion,所以动画结束后,变换不会应用到模型;此时,如果开始一个新的动画,模型会瞬间回到起始位置(新的动画开始时候,模型处于行走动画开始时的位置)。
2) 勾选【Bake into Pose】,并勾选【Apply Root Motion】
这里跟上面的情况唯一不同的是,动画结束后,开始新的动画之前,变换会应用到模型。(模型的Transform在新的动画开始之前会发生变化,新的动画开始时候,模型处于上个动画结束时的位置)
3) 不勾选【Bake into Pose】,勾选【Apply Root Motion】
不勾选“Bake into Pose”后,变换属于Root Transform,且勾选了Apply Root Motion,变换会应用到模型(模型的Transform跟着动画不停的变化),自然,新的动画开始时候,模型处于上个动画结束时的位置。
4) 不勾选【Bake into Pose】,不勾选【Apply Root Motion】
这里变换还是属于Root Transform,但是因为没有勾选Apply Root Motion,所以变换将不被应用,所以模型将一直在本地不动,自然,新的动画开始时候,模型处于行走动画开始时的位置
3. 动画片段检视器
动画片段编辑器 (Animation Clip Editor) 设置(根变换旋转 (Root Transform Rotation)、根变换位置 (Root Transform Position)(Y) 和根变换位置 (XZ))让您从身体变换 (Body Transform) 控制根变换 (Root Transform) 投影。根据这些设置,身体变换 (Body Transform) 的某些部分可能会传输到根变换 (Root Transform)。
例如,您可以决定是否要让运动 Y 位置成为根运动 (Root Motion)(轨迹)一部分,或者姿势(身体变换<Body Transform>)的一部分,这就是所谓的烘焙为姿势 (Bake into Pose)。( For example you can decide if you want the motion Y position to be part of the Root Motion (trajectory) or part of the pose (body transform), which is known as Baked into Pose.)
4. 根变换旋转
烘焙为姿势 (Bake into Pose):方向与身体变换(或者姿势 (Pose))保持一致。根方向 (Root Orientation) 保持不变,增量方向 (Orientation) 相同。这意味着,该 AnimationClip 完全不会旋转游戏对象 (Game Object)。 只有拥有类似启停根方向 (Root Orientation) 的 AnimationClip 才会使用该选项。您会在 UI 看到绿灯 (Green Light),告知您某个 AnimationClip 是好的候选片段。合适的候选片段应当是直走或跑步动画。
基于 (Based Upon):该选项允许您设置片段的方向。片段使用身体方向 (Body Orientation) 定向,以循着身体的向前向量。该默认设置适用于大多数动作捕捉 (Motion Capture)(动态捕捉 (Mocap))数据,比如走路、跑步、跳跃,但不能用于扫射之类的动作,这些动作与身体的向前向量垂直。在这种情况下,可以使用偏移(Offset) 设置手动调整方向。最后,您会在导入的片段中找到自动添加授权位移的原始方向 (Original)。它常常与键帧 (Keyframed) 数据配合使用,以遵循美工设置的方向。
偏移 (Offset):为基于 (Based Upon) 选择该项时用来输入偏移量。
5. 根变换位置 (Y)
该项使用根变换旋转 (Root Transform Rotation) 中描述的相同概念。烘焙为姿势 (Bake Into Pose):运动的 Y 分量与身体变换 (Body Transform)(姿势 (Pose))保持一致。根变换 (Root Transform) 的 Y 分量保持不变,增量根位置 Y (Delta Root Position Y) 为 0。这意味着,该片段不会更改游戏对象高度 (Game Object Height)。您再次看到绿灯 (Green Light),告知您某个片段是将 Y 动作合并到姿势的良好候选片段。
大多数 AnimationClip 会启用该设置。只有更改游戏对象 (GameObject) 高度的片段会关闭该设置,比如跳上跳下。
注意:Animator.gravityWeight 由合并到姿势 (Bake Into Pose) 位置 Y 驱动。启用该设置时,gravityWeight = 1,禁用该设置时则 = 0。在状态之间转换时,gravityWeight 用于片段融合。
基于 (Based Upon):您可以按照与根变换旋转 (Root Transform Rotation) 类似的方式从原始方向 (Original) 或质心 (Mass Center)(身体 (Body))中进行选择。还有一个双脚 (Feet) 选项,非常便于 AnimationClip 更改高度(合并到姿势 (Bake Into Pose) 已禁用)。使用双脚 (Feet) 选项时,根变换位置 Y (Root Transform Position Y) 会为所有帧匹配最低的脚 Y。因此,融合点常常停留在双脚周围,以防止在融合或转换时出现浮动问题。
偏移 (Offset):可以按照与根变换旋转 (Root Transform Rotation) 类似的方式,使用偏移 (Offset) 设置手动调整 AnimationClip 高度。
6. 根变换位置 (XZ)
再一次,该项使用根变换旋转 (Root Transform Rotation) 和根运动位置 (Root TransformPosition) (Y) 中描述的相同概念。 烘焙为姿势 (Bake Into Pose): 将用于空闲 (Idles),在这种情况下您希望将增量位置 (Position) (XZ) 强制改成 0。在多次评估之后,它会停止累计增量变化。它也可用于具有基于 (Based Upon)原始方向 (Original) 的关键帧片段,以强制更改美工设置的授权位置。