Animator之RootMotion

2023-11-18

Unity3D 中 Generic 动画导入设置和 Root Motion 之间的关系

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

那么怎么来利用这个特性达成我们想要的一些效果呢?这个 applyRootMotion 到底指的是啥呢?

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.

翻译过来的意思,应该是这样的:

根节点的运动变换其实就是整个物体运动变换通过 Y 轴垂直在水平面上的一个投影。根节点的运动变换在动画的每一帧中都会进行计算。计算出来的根节点变换结果都会应用在播放动画的对象上,让该对象按照根节点的运动变换进行移动。

这段话大体的意思就是,RootMotion 这个玩意就是作用于动画物体在 X 轴和 Z 轴上的位移的,而且这个位移是根据实际播放的动画中每一帧物体的位移在 X 和 Z 轴上投影计算出来的。

这个特性非常赞特别是对于某些技能动画,整个动画是有一定位移的,但是动画的位移是动作设计师在设计时根据动作需要调出来的,位移是跟动作的幅度直接相关和匹配的。

那么在释放技能的时候就只需要直接播放动画,并且应用这个 Root Motion 的特性就可以很好的完成角色在播放攻击动作的同时进行移动,动作播放完毕之后就在动画结束帧角色所在的位置,切换为待机动作就 OK 了。

看起来很牛逼的样子对不对?是的,确实很牛逼。但是还有很多事情需要我们都一一了解以后,我们才能做出我们想要的东西的。

下面我们先岔开一下话题,好好说说这个 Animation Import Settings 中『Animations』Tab 页中各项设置的作用。

  • Import Animation,勾选这个才可以导入动画到 Unity 工程中;
  • Bake Animations,这个选项只在使用 Humanoid 动画并且使用到了 IK 特性的时候才可用;
  • Anim.Compression,这个是关于动画压缩选项的,默认会选择 Keyframe Reduction 这个是『压缩关键帧』,就是 Unity 会自行重采样动画的关键帧,还有两个选项『Off 和 Optimal』,一个是关闭动画压缩,一个是最优化压缩(应该是压缩效率最高,动画效果失真度可能也较高)
  • 选择了Keyframe Reduction 或者Optimal压缩选项,就会有三个用于控制压缩选项的系数配置, Rotation Error,Position Error 和 Scale Error,这个三个参数默认都是 0.5,越小呢精度就越高也就是说动画的失真度越小。
  • Clips,这个下面列出了这个 FBX 文件下包含的所有动画,我们在默认的动画文件基础上新建和删除动画片段 (Animation Clip),当然每个动画片段都是可以指定起始帧和结束帧的; 以下的设置都是针对单个动画片段滴:
    • Loop Time,勾选这个选项之后,如果 Animator 处于播放这个动画状态时,在播放完第一遍这个动画片段之后,会自动循环从起始帧再次开始播放动画,如此循环往复。如果我们不勾选这个选项,例如 Animator 一直处于播放这个动画的状态,那么动画会定格在动画的结束帧,直到我们通过 Animator 切换这个 Animator 状态机的状态,切换到其他的动画;
      • Loop PoseCycle Offset,在勾选了 Loop Time 之后生效的两个选项,Loop Pose 用于控制动画循环播放时,从结束帧切换到起始帧时,动画的动作可以无缝的衔接上,Cycly Offset 就是用于控制循环的时候起始帧偏移用的;
    • Root Transform Rotation,根节点的旋转信息
      • Bake Into Pose,勾选后会将根节点每一帧的旋转方向信息烘焙到动画的骨骼运动中,在整个动画播放的过程中,根节点的旋转信息就不会在通过 Root Motion 作用到播放该动画的 GameObject 上了,这就意味着这个动画播放的过程中,该物体的 Transform 中的 Rotation 值不会因为动画中物体做了任何旋转而发生改变,而是会保持一个恒定的值,和该动画播放之前的旋转值保持一致;
      • Based Upon (at Start) 或者Based Upon,根节点旋转的参考基准,有两个选项『Original 和 Root Node Rotation』这两个分别指的是动画文件中指定的旋转值和根节点旋转信息,其实我更愿意将 Original 理解为动画中原点的旋转值,因为在整个动画播放的过程中,所有骨骼肯定都会有旋转和位移的变换,但是动画的原点其实一定都是确定的,这样理解感觉更简单也更形象一些,勾选了 Bake Into Pose 之后,就会变成 Based Upon 而不勾选 Bake Into Pose 就会保持为 Based Upon (at Start),这个目前还木有理解为啥;
      • Offset,旋转角度与参考基准的偏移(以度为单位);
    • Root Transform Position(Y),根节点位移信息(Y 轴)
      • Bake Into Pose,勾选后会将根节点每一帧在垂直 Y 轴方向上的运动信息烘焙到动画的骨骼运动中,在整个动画播放的过程中,根节点在 Y 轴方向的所有位移信息不会通过 Root Motion 作用到播放该动画的 GameObject 上,这就意味着我们在场景中看到物体在 Y 轴上有位移,例如向上或者向下移动,但是该物体的 Transform 中的 Position 信息不会发生改变,会跟动画播放之前的 Position 信息保持一致;
      • Based Upon 或者Based Upon (at Start),这个貌似有点不一样哦,在选中 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 作用到播放该动画的 GameObject 上,这就意味着我们在场景中看到物体在水平面上移动,但是该物体的 Transform 中的 Position 信息不会发生改变,会跟动画播放之前的 Position 信息保持一致,假如动画中物体会向前移动 3 米,我们会看到物体在整个动画播放过程中确实在向前移动,播放到最后一帧时确实向前移动了 3 米,但是当这个动画播放完毕之后,切换到任何其他的动画时,物体会直接闪回这个动画播放前物体所在的位置,所以通常我们需要保留动作位移的动画都不会勾选这个选项。那这个选项有神马用捏?例如某些待机动画,我们其实希望物体只是做一个待机动作,但是实际上不想让物体在水平方向上有位移,这个时候就可以勾选这个选项了,到时候看起来物体就像是钉在水平面上了;
    • Mask,这个掩码主要是用于控制动画播放过程中,各个骨骼之间的运动变换的
      • Definition,可以选择从动画文件创建也可以选择使用其他动画文件中已经创建好的配置;
      • Transform,这个就是动画文件中所有骨骼的层级关系,可以选择勾选那些需要应用动画中运动变换的骨骼;
    • Curves,这个主要用于设置某些跟动画相关的参数用,例如控制整个动画播放过程中的速度参数之类的,在动画播放的过程中可以通过 Animator.GetFloat(ParamName) 函数来读取曲线的值,曲线的 X 轴为动画的时间轴,Y 轴为曲线的值,曲线可以通过曲线编辑器进行增加关键点,调整曲线斜率进行编辑,读取时默认会根据当前动画播放的进度作为 X 轴的值进行读取,一个动画片段可以有多个曲线;
    • Events,这个是用于在动画播放的过程中触发事件的,例如整个动画中有起跳和落地两个事件需要在准确的时间点触发并通知到游戏中其他的对象,那么就可以在 Events 时间轴上新增事件通知,设置好触发的方法名称和参数,在播放该动画的 GameObject 上确保有某个脚本中有与该事件通知的方法签名一致的方法就好了,当动画播放到触发通知时间时,就会向 GameObject 广播该时间通知,脚本中方法签名一致的方法就会被回调了,那我们就可以做我们需要做的事情了。

说了这么多貌似跟 Root Motion 不是很相关的东西,那么究竟我们今天的主题是啥呢?肯定还是 Root Motion 这货。主要因为动画导入时的设置对于 Root Motion 的应用影响非常直接,所以前面絮絮叨叨地把这个动画导入设置都罗列了一遍。

回到正题,Generic动画应用Root Motion 有以下几个特点:

  1. Root Motion 仅仅作用于 GameObject 在 X 和 Z 轴上的位移变换,不影响 Y 轴上的位移。例如现在播放一个从地上向前空翻之后落地的动画,设置 Animator 的 applyRootMotion 为 True,也就是应用 Root Motion,那么动画在播放过程中,物体会在水平方向和垂直方向上都按照实际动画的运动轨迹进行运动,如果将 applyRootMotion 设置为 False,那么我们就只能看到动画在原地起跳然后再落地,动画中原本应有的在水平方向的位移就没有了;
  2. Root Motion 与导入动画时设置 Root Transform Position(XZ) 是直接相关的,如果我们选择了将 X 和 Z 轴方向上根节点的位移烘焙到动画骨骼运动中的话,那么动画播放过程中不论我们是否将 Animator 的 applyRootMotion 设置为 True 还是 False,动画播放过程中物体在 X 和 Z 上的移动是一定的,因为这个已经被烘焙到骨骼动画中,只要动画播放,物体就会移动,但是在动画播放的过程中 GameObject 的 Position 值不会改变,在动画结束后我们切换到其他动画的时候,其他动画开始播放时的 GameObject 的位置会回到这个动画播放前的位置,所以如果我们需要对某个动画应用 Root Motion 的话,那么这个动画在导入的时候就不要烘焙其在 X 和 Z 轴方向上的 Root Transform Position,让 Unity 自行根据动画中根节点的位移进行位移计算 GameObject 的位置信息;
  3. 注意 Root Motion 与 Rigidbody.Velocity 属性的关系,如果有两个动画 A 和 B,播放 A 动画的时候,希望 A 动画应用 Root Motion,而在播放 B 动画的时候不想应用 Root Motion,那么就直接在切换到动画 B 的时候,将 Animator 的 applyRootMotion 设置为 False 就 OK 了。但是如果播放动画的 GameObject 带有 Rigidbody 组件,那么需要注意一点,在播放 A 动画时 Rigidbody 的 Velocity 并不会在切换到 B 动画时清零,也就是说如果 A 动画的运动速度较快,那么切换到 B 动画的时候,如果希望 B 动画播放的时候 GameObject 按照自己的设定轨迹运动,就需要自行手动在切换到 B 动画之前将 Rigidbody 的 Velocity 属性清零,防止 GameObject 按照 A 动画的运动惯性继续运动。这个问题在没有 Rigidbody 组件的 GameObject 上不会存在;

这边再岔开一下,说说这个动画跟Rigidbody之间的关系:

  1. 如果我们没有将 Root Transform Position 的 Y 和 XZ 轴进行烘焙的话,那么在动画播放的过程中,Rigidbody 将会自动获得动画中物体运动的速度信息,直接通过 Rigidbody.Velocity 属性就可以获得;
  2. 如果我们将 Y 轴进行烘焙,那么 Rigidbody.Velocity 在 Y 轴上的值将会一直为 0,对于 XZ 轴也是一样的,如果烘焙了 XZ 轴的位移,那么整个动画播放过程中,Rigidbody.Velocity 在 X 和 Z 轴上的值都会为 0;
  3. 如果播放动画的物体没有 Rigidbody 组件,那么动画的运动都会仅仅按照动画实际的位移来进行逐帧播放,不会出现上文中提到的动画播放切换之后还存在的运动惯性问题,因为物理引擎依赖于 Rigidbody 组件,如果没有该组件,所有动画的播放都只是逐帧播放动画,不会存在速度的概念只有移动位移。
  4. Rigidbody 使用使用重力对于动画在 Y 轴上的位移没有任何影响,不论是否对 Root Transform Position 的 Y 轴进行了烘焙。

Unity5.x Mecanim Animator使用详解:http://blog.csdn.net/yupu56/article/details/53468023


Unity5.x 动画Animator使用IK动画:http://blog.csdn.net/yupu56/article/details/53382046

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Animator之RootMotion 的相关文章

  • Unity3D之MonoBehaviour

    Unity3D中的MonoBehaviour是一种基于组件的编程架构 用于开发游戏和应用程序 它是Unity引擎中用于创建行为的基类之一 并且可以让你通过重写其方法来定义对象在游戏运行时的行为 首先 在Unity中创建一个游戏对象并向其添加
  • Unity3D 地形(Terrain)设置

    这篇说的是Unity地形 关于Unity3D是什么 我就不多做解释了 由于工作原因 该系列原创教程不定期更新 每月必然有更新 谢谢各位 Unity地形 新建地形 如图在菜单中新建一个地形 就会在 中看到Terrain对象 如果要修改地形参数
  • Unity的C#编程教程_59_字典 Dictionary 详解及应用练习

    文章目录 C Dictionary Introduction C Dictionary Looping through Dictionary C Dictionary When to Use C Dictionary Using Dicti
  • VS2017调试unity没有解决方案

    1 VS2017之前的版本调试unity 需要下载 Visual Studio Tools for Unity 2 VS2017内置了Visual Studio Tools for Unity 3 首先打开 帮助 gt 关于 已安装程序中查
  • Unity3d中使用OnGUI()函数判断“键盘按下抬起”功能的新方法。

    private bool flagJudgeDownAllow true 开始值为true void OnGUI key Event current FunctionKeyCodeV1 key private void FunctionKe
  • unity中通过touch旋转、放大和缩小物体以及滑动方向的判断

    unity中通过touch旋转 放大和缩小物体以及滑动方向的判断这个需求在游戏开发中也是非常频繁 话不多说直接上代码 using System Collections using System Collections Generic usi
  • Unity3D射线检测

    射线检测主要用于像子弹是否打中物体 捡取物品等情况 本来面向百度想找例子看看 不过没找到合适的 还是自己总结尝试吧 以下测试Unity3D版本 2017 4 2f2 射线的检测步骤如下 1 Ray 这个类为了产生一个射线 如果我们想要场景中
  • Unity笔记-打飞碟游戏

    目的 创建一个打飞碟游戏 简陋 游戏要求 游戏要分多个 round 飞碟数量每个 round 都是 n 个 但色彩 大小 发射位置 速度 角度 每次发射数量可以变化 游戏过程中 仅能创建 n 个飞碟 且不容许初始化阶段生成任何飞碟 飞碟线路
  • Vuforia Virtual Button(虚拟按钮)使用技巧

    最近一直在摸索Vuforia的使用 Virtual Button算是一个比较容易吸引人眼球的功能 在经过一些测试后 我来总结下自己在探索过程中得到的一些经验 1 如何新建一个Virtual Button工程 导入Vuforia sdk 后把
  • protobuf C#编译

    protobuf C 编译 标签 protobufc 2016 08 30 23 22 342人阅读 评论 1 收藏 举报 分类 工作记录 2 版权声明 本文为博主原创文章 未经博主允许不得转载 1 下载protobuf代码 https g
  • 【Unity3d】Animator和Animation组件使用注意事项

    一 Animator一般用于人物动画控制 特点是动画是持续的 可能有动作切换 Animation一般用于间断性的动画的控制 比如一个场景特效的播放 只播放一次就完了 二 实测Animation速度比Animator快10 左右 内存占用没测
  • Unity3D【脚本】 按键盘Esc弹出退出面板 确定退出游戏 取消关闭面板

    按键盘Esc弹出退出面板 确定退出游戏 取消关闭面板 效果图 脚本 using UnityEngine using System Collections public class Exit MonoBehaviour public Game
  • unity 读取和写入Excel中文出现乱码解决方法

    在编辑器中读取和写入中文一切正常 发布出来只要是中文就会出现乱码 解决方法 将C Program Files Unity Editor Data Mono lib mono unity 目录下的I18N dll和I18N CJK dll复制
  • unity3d 理解刚体(Rigidbody)和碰撞体(Collider)以及触发器(Is Trigger),边学边更新

    unity3d 理解刚体 Rigidbody 和碰撞体 Collider 以及触发器 Is Trigger 边学边更新 分类 Unity3D 2014 04 01 16 50 2755人阅读 评论 2 收藏 举报 刚体 Rigidbody
  • 【Unity灯光与渲染技术】Global Illumination全局光照

    本系列主要参考Unity灯光与渲染技术教程Unity Lighting And Rendering 同时会加上一点个人实践过程和理解 分割线 这篇文章主要讲全局光照 在看教程的时候就有一个点不是很理解 就是作者开启物体的static这个选项
  • Unity3D之Rigidbody

    目录 常用的Rigidbody属性和方法 rigidbody AddForce rigidbody AddTorque rigidbody velocity rigidbody angularVelocity rigidbody Sleep
  • Unity使用spine动画

    Unity使用spine动画 在 Unity 中 常常使用 Spine 来制作一些动画 引擎本身并不能直接播放 Spine 动画 需要额外导入一个 RunTime 插件库才能支持 官网插件导入 当然 也可以到 Spine 官网关于 Unit
  • Unity3d获得android和ios设备的唯一标识

    android为mac地址 ios为advertisingIdentifier 函数都比较简单 网上也搜得到 我也就不多说了 主要是对于我们没做过安卓和IOS开发的人来说 整合进工程有各种的问题 我也就直接上网盘了点击打开链接 代码包里看得
  • Mecanim Any State

    Any State表示任意状态 任意状态是 一个一直存在的特殊状态 他的存在是为了保证你在无意转移至某个你当前正处于的特殊状态而准备的 为你的状态机中的每个状态设置相同的对外转移是一个快捷的方式 假如有Walk Run Fly Die这四个
  • unity dots jobSystem 记录

    Looking for a way to get started writing safe multithreaded code Learn the principles behind our Job System and how it w

随机推荐

  • 数据库中索引会失效的几种情况(oracle)

    文章目录 数据库中索引会失效的几种情况 oracle 1 没有 WHERE 子句 2 使用 IS NULL 和 IS NOT NULL 3 WHERE 子句中使用函数 4 使用 LIKE T 进行模糊查询 5 WHERE 子句中使用不等于操
  • 输入两个正整数,输出它们的最大公约数和最小公倍数

    include
  • python 列表元组字典集合相关知识

    python 数据类型 列表 可变数据类型 列表的创建 或者 list 列表的索引 由下标0开始 最后一个为 1 列表的切片 list start end step 列表的计算 支持 等方法 列表的方法 格式 列表名称 方法名字 index
  • 如何结束8080端口的进程

    1 找到8080端口进程 win r 输入cmd打开终端窗口 输入netstat aon findstr 8080 找出所有的进程 2 结束对应的进程 taskkill F PID 53408
  • tinymce 去掉编辑器换行默认增加的p标签

    问题 tinymce 编辑器里面使用回车换行后会自动添加p标签 解决方法 增加forced root block这个属性 替换为空后 换行就没有p标签了 格式 forced root block 删除在tinymce中自动添加的p标签 如下
  • HashMap中为何X % length = X & (length - 1)(求余%和与运算&转换问题)

    目录 一 引出问题 二 结论 三 分析过程 总结 一 引出问题 在前面讲解 HashMap 的源码实现时 有如下几点 初始容量为 1 lt lt 4 也就是24 16 负载因子是0 75 当存入HashMap的元素占比超过整个容量的75 时
  • Pod控制器(一)ReplicaSet

    目录 1 关于Pod控制器 1 1Pod控制器概述 1 2 控制器与Pod对象 1 3 ReplicaSet控制器 1 3 1 ReplicaSet概述 1 3 2 创建ReplicaSet 1 3 3 ReplicaSet管控下的Pod对
  • ajax同步异步的具体事例,Ajax同步和异步(示例代码)

    Ajax在默认情况下是异步执行的 即其属性 async boolean 是否异步 同步和异步的区别 同步 Client 向 Server请求数据 直到该部分数据返回时 Client在请求返回值后的相应程序队列才会按顺序执行 在此期间 Cli
  • 微信小程序 车牌号输入组件

    概述 一个小组件 用于方便用户输入车牌号码 详细 概述 有时候我们开发过程中会遇到需要用户输入车牌号的情况 让客户通过自带键盘输入 体验不好且容易出错 例如车牌号是不能输入O和I的 因此需要有一个自定义的键盘 让客户输入正确的车牌号 详细
  • 基于MyApps低代码平台生成的CRM实现客户的高效管理

    随着市场的发展 客户开始变得越来越重要 因此很多公司开始追求客户数量用尽浑身解数 可盲目发展 一股脑的想要扩大客户数量 也导致企业无法对客户进行有效的管理 不可避免地出现以下问题 1 没有对新客户做好分析 也疏于老客户的管理 导致客户流失的
  • 基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(十七)深度测试

    Vries的教程是我看过的最好的可编程管线OpenGL教程 没有之一 其原地址如下 https learnopengl cn github io 04 20Advanced 20OpenGL 01 20Depth 20testing 关于深
  • 双目标定(二)单目标定基本原理

    主体思路 先处理纯二维平面的畸变问题 此处略过 矫正图片后 再来求解相机内外参数 基本思路是求得每个标定板对应的单应矩阵 再联合优化所有标定板数据得到相机内参矩阵 再得到每个标定板对应的外参 1 标定板平面到像平面的单应矩阵H 则对于每个棋
  • 短视频制作难度大吗?怎么剪辑短视频?

    随着抖音 快手等视频分享软件的兴起 很多人已经开始尝试制作短视频分享 那么 对于视频制作新手来说 短视频的制作难度大吗 其实 只要选对了视频制作软件 视频制作将会变得相当简单 在众多视频剪辑软件中 会声会影因其丰富的视频制作功能 直观的操作
  • python识别图像中的文字

    我们想识别图像中对我们有用的评论 所以需要卡一个阈值来仅仅获得对我们有用的信息 import easyocr 创建reader对象 import json reader easyocr Reader en result list reade
  • git --amend用法

    git commit amend 这个命令是让我们可以对上一次提交有修改 可以修改文件也可以修改说明 不产生新的commit 在我们有一次提交 然后提交之后评审发现代码有问题 我们没有进行和入 需要重新修改 但是我们又不能产生新的commi
  • IDEA中自动生成类图方法

    1 打开设置 File Setting或windows下按Ctrl Alt S 2 找到 Tools Diagrams 如下图 3 在Java Class Diagrams 中选中需要生成类图的对象 4 选中需要生成类图的对象 然后按Ctr
  • 将形如 0xAABBCC拆分成形如 三个数0xAA,0xBB,0xCC 及逆过程

    将形如 0xAABBCC拆分成形如 三个数0xAA 0xBB 0xCC pre class java private static int Int2Arr int a span span int s new int 3 span span
  • Java Post接口调用

    1 通过Cookies properties管理cookies cookies key1 AspNetCore Session cookies key2 TS01d2d863 cookies key3 ssoinfo cookies key
  • Kalman Filtering – A Practical Implementation Guide (wi_拔剑-浆糊的传说_新浪博客

    Kalman Filtering A Practical Implementation Guide with code 一个开源的C C 库 http kalman sourceforge net index php 另外一个基于末班类的开
  • Animator之RootMotion

    Unity3D 中 Generic 动画导入设置和 Root Motion 之间的关系 Unity3D 的 Mecanim 动画系统可以直接复用 3DS MAX 中制作的动画文件中的位移 这个就是通过 applyRootMotion 来达成