根运动 (Root Motion) – 工作原理

来源:互联网 发布:国际淘宝网官方网站 编辑:程序博客网 时间:2024/05/19 01:07

http://blog.csdn.net/myarrow/article/details/45505085


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) 的关键帧片段,以强制更改美工设置的授权位置。

7. 循环姿势

     循环姿势 (Loop Pose)(就像混合树 (Blend Trees) 或转换 (Transitions) 中的姿势融合 (Pose Blending))在引用根变换 (Root Transform) 时出现。计算根变换 (Root Transform) 之后,姿势 (Pose) 变得与之相关。开始 (Start) 和停止 (Stop) 帧之间的相对姿势 (Pose) 差异将被计算出,并分布在 0-100% 的片段范围中。

8. 通用根运动 (Generic Root Motion) 和循环姿势 (Loop Pose)

      此项的工作原理本质上与类人根运动 (Humanoid Root Motion) 相同,但不使用身体变换 (Body Transform) 来计算/预计根变换 (Root Transform),而是使用根节点 (Root Node) 中的变换集。姿势 (Pose)(在根运动 (Root Motion) 骨骼下变换的所有骨骼)与根变换 (Root Transform) 相关。


0 0