【Unity动画系统】详解Root Motion动画在Unity中的应用(一)

Root Motion动画与普通动画的区别

普通动画:动画文件里记录的是物体的绝对坐标和方向,在播放动画时,Unity会根据Animation中记录的值,直接修改游戏对象的坐标和方向,每一帧的坐标和方向都是通过插值计算得出来的,所以在动画播放的下一个循环的开头时,游戏对象的坐标值或者角度值都会被直接修改成初始值。

Root Motion动画:一般是动画师在制作动作的时候会在动画上添加逻辑驱动物体运动

Unity中应用RootMotion,Unity会通过动画文件里记录的绝对坐标和方向,以及当前游戏对象的缩放比例,计算出游戏对象在上一帧的相对位移和相对转角然后再根据相对位移和相对转角来移动游戏对象,所以当动画播放到下一个开头时,游戏对象的坐标并不会被修改成初始值。Unity会让游戏对象乘以缩放矩阵、旋转矩阵以及平移矩阵。

在Unity中应用Root Motion,需要在Animator组件上勾选

总结:

动画文件会直接修改每一帧里游戏对象的坐标值和角度值,Root Motion动画则通过相对位移和转角来移动对象。

控制Root Motion动画

Root Motion通过动画文件计算出游戏对象上一帧的位移,那么我们就可以使用deltaPosition来获取位移量。

在游戏对象使用OnAnimatorMove方法,Unity就不会用动画来驱动游戏对象的移动,把控制权交给我们,此时Root Motion也把操控权交给了脚本。

我们可以用代码来复现Root Motion:

Animator animator;void Start(){animator = GetComponent<animator>();
}private void OnAnimatorMove(){transform.position += animator.deltaPosition;	//游戏对象坐标值直接加上位移量
}

Generic动画中的Root Motion机制

Root Motion在Generic动画中指的就是将角色根骨骼的运动应用到游戏对象身上。

Generic下根骨骼只有一根,一般根骨骼在Unity中会设置为Root Node,唯一作用就是记录模型的位移和旋转。

在Generic动画中,应用Root Motion指的就是把动画中根骨骼节点上的绝对坐标和绝对角度,转换为游戏对象的相对位移和相对转角

Humanoid动画中的Root Motion机制及相关配置

        在Humanoid动画中,由于使用了Avatar系统,动画文件不再包含对具体骨骼的描述,也就无法通过指定根骨骼来应用root motion。

        Unity为解决这个问题,在humanoid动画中通过分析骨骼的结构,计算出模型的重心center of mass,也可以称为body transform。

点击上述按键,可以在预览动画中看见重心

脚本中通过animator.BodyPosition和BodyPosition来访问它的坐标和方向。

Root Transform Rotation:root motion的旋转特指绕y轴的旋转。

Root Transform Position(Y):沿y轴的位移。

Root Transform Position(XZ):沿x和z轴的位移,也就是水平平面的位移。

Unity会根据具体动画计算重心在水平平面的投影,把投影当作Root Motion的“根骨骼节点”来对待。

中心点被称作Root transform,脚本中通过animator.RootPosition和RootRotation来访问它的坐标和指向。

在humanoid动画中,Unity会计算出一个Root Transform。Root Motion会把动画文件中描述的Root Transform的坐标和角度值,转换为相对位移和相对转角,并以此来移动游戏对象.

Humanoid 动画下root motion原理:在这里Avatar把互不兼容的骨骼结构下的根位移转,转换为了统一的Unity重心位移,这样一来,同一套带有root motion的动画就可以在不同骨骼结构的人形角色上表达位移。

Root Transform Rotation

Humanoid中没有根骨骼,就把重心body transform的方向当作动画的朝向.一般是root motion动画直接选Original。

Root Transform Position(Y)

Feet和Original的区别:

在humanoid动画中,因为动画的复用会使得动画发生一系列的变形, 简单来说,动画原本是针对A模型制作的,那么original或者说原点就是A模型播放动画时的原点,当我们使用B模型复用这个动画时,没办法保证Avatar转移后的原点还能够保证其原来的准确性。

如果选择Original效果不佳,可以考虑选择Feet。

Root Transform Position(XZ)

Based Upon:指的是重心在水平平面的投影位置

为什么角色移动会下沉?不该处理垂直位移的动画在控制角色对象的垂直位移

为什么角色走着走着变歪了?说明不该处理旋转的动画在处理游戏对象的旋转

动画属性中Root Motion的变换

Root Transform Rotation:root motion的旋转特指绕y轴的旋转。

Root Transform Position:沿y轴的位移。

Root Transform Position:沿x和z轴的位移,也就是水平平面的位移。

Root Transform Rotation

Bake Into pose:表示把它当作普通的骨骼动画来处理,而不是将根骨骼节点的旋转当作root motion的一部分处理。

不勾选的话会启用上面的Root动画,勾选的话则会启用下面的Hips动画。

解释:比如我们做前进动画的时候,由于左右肩膀是会跟着晃动的(正常),所以在动画片段里面会产生旋转.而我们只把它当做是前进移动的动画,所以作为控制的时候只需要它的z轴上的位移来计算速度,以符合脚步的频率.由走路引起的旋转,只是作为走路姿态(bake into pose 其中pose 的意思就是姿态)的一部分,而不应该作为root motion控制移动的计算条件(因为root motion自己是不能判断你拿这个动画是作为前进动画还是旋转动画,所以就只能由你来指定)。

总结:

什么时候勾选Bake into pose,当不希望动画带动游戏对象旋转时。

在旋转的动画中一般是不用勾选的,因为就需要用它来带动我们的角色对象旋转。

但在比如前进、后退、待机等动画来说,我们就可以勾选这里,以避免因动画文件本身的瑕疵而给我们带来的旋转。

loop match:代表了这个动画在角度上的吻合度。

如果这个动画在播放中转角过大,那么就会显示红色,告诉我们如果勾选bake into pose,则会带来不好的效果。

要不要勾选Bake into pose这个选项取决于我们需不需要动画来驱动游戏对象的旋转,而至于能不能勾选,则要参考loop match是红色还是绿色了。

Based Upon:游戏对象在动画开始时对准的方向是哪里。

Root Node Rotation:让游戏对象在动画开始时对准跟骨骼节点的指向方向,是Unity根据整个动画片段中root node的姿态算出来的,一般不准,如果想要修正动画的话,可以在下面的Offset(偏移量)进行修改。

Original:这个动画本来的朝向。

Root Transform Position(Y)

Bake into pose:把它当作普通的骨骼动画来处理, 而不要将骨骼节点在垂直方向上的位移当作root motion的一部分来处理。

勾选后的跳跃中骨骼不会被计算,动画的跳跃不会带动游戏对象,不会产生瑕疵。

Based Upon:垂直方向上把模型的哪个位置对齐到游戏对象的原点上。

Offset:偏移量

Root Transform Position(XZ)

一般待机动画、原地转身动画、原地起跳动画都可以勾选。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/661935.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TouchGFX 总结

文章目录 使用中文字体多屏幕间交换数据UI to MCUMCU to UI API文档参考横竖屏切换 使用中文字体 添加一个textArea&#xff0c;默认的英文文本可见&#xff0c;输入中文字体后就看不见了&#xff0c;是因为这个默认的字体不支持中文&#xff0c;改一下字体就可以了&#xff1…

『大模型笔记』Code Example: Function Calling with ChatGPT

Code Example: Function Calling with ChatGPT 文章目录 一. Code Example: Function Calling with ChatGPT二. 参考文献一. Code Example: Function Calling with ChatGPT from openai import OpenAI from dotenv import load_dotenv import json# --------------------------…

【软件开发规范篇】JAVA后端开发编码格式规范

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

定制开发AI智能名片商城小程序:玩转积分制度的成功案例

在数字化浪潮席卷而来的今天&#xff0c;企业营销方式不断创新&#xff0c;力求在众多竞争对手中脱颖而出。其中&#xff0c;积分制度以其直观、有效的特点&#xff0c;成为了众多企业的营销利器。某时尚品牌“潮流前线”便是其中的佼佼者。他们通过定制一款AI智能名片商城小程…

Unity涂鸦纹理实现

文章目录 前言实现过程UV坐标和UI坐标对齐修改像素代码 前言 心血来潮实现下场景中提供一张纹理进行涂鸦的功能。 最终实现效果: 实现过程 UV坐标和UI坐标对齐 这里的纹理使用了UGUI的Canvas进行显示&#xff0c;所以这里使用一张RawImage。 因为Unity的视口坐标是以左下角…

2024最新AIBotPro开源码AI Web 应用支持GPT-4全模型

2024最新AIBotPro开源码AI Web 应用支持GPT-4全模型&#xff0c; 支持AI绘画/插件联网/自定义插件/AI知识库等等。 内有详细的图文搭建教程

2024年第二十一届 五一杯 (C题)大学生数学建模挑战赛 | 多目标优化问题,深度学习分析 | 数学建模完整代码解析

DeepVisionary 每日深度学习前沿科技推送&顶会论文&数学建模与科技信息前沿资讯分享&#xff0c;与你一起了解前沿科技知识&#xff01; 本次DeepVisionary带来的是五一杯的详细解读&#xff1a; 完整内容可以在文章末尾全文免费领取&阅读&#xff01; 首先&…

Springboot+Vue+小程序+基于微信小程序电影票网购系统

Java电影票购买管理系统&#xff0c;Maven管理工具&#xff0c;MyBatis数据库操作&#xff0c;idea平台开发&#xff0c;后台的前端为Vue&#xff0c;前台客户端为小程序&#xff0c;功能丰富&#xff0c;还有电影周边购买功能&#xff0c;请在最下方二维码处联系我即可&#x…

windows下安装onlyoffice

文章目录 1、 安装ErLang2、 安装rabbitmq3、 安装postgresql4、 安装onlyoffice(社区版) 1、 安装ErLang 下载地址&#xff1a;https://erlang.org/download/otp_win64_24.2.exe opt_wind64_24.2.exe 直接运行&#xff0c;一步一步安装 2、 安装rabbitmq 下载地址&#xf…

【C++】初识string类

一、熟悉string类 1.1 string类的由来&#xff1a; C语音中的字符串需要我们自己管理底层空间&#xff0c;容易内存泄露。而C是面向对象语音&#xff0c;所以它把字符串封装成一个string类。 C中对于string的定义为&#xff1a;typedef basic_string string; 也就是说C中的str…

公共 IP 地址与私有 IP 地址区别有哪些?

​  IP 地址是分配给互联网上每个设备的唯一数字 ID。 IP 地址可以在 Internet 上公开使用&#xff0c;也可以在局域网 (LAN)上私有使用。本文&#xff0c;我们主要探讨公共 IP 地址和私有 IP 地址之间的区别。 公共IP地址&#xff1a;公共IP地址是用于访问Internet的向外的I…

Kubernetes leader election 源码分析

1. leader election leader election 通过多个副本抢占资源锁的方式实现单实例运行。在 Kubernetes 中&#xff0c;[Configmap|Lease|Endpoint] 可以作为资源锁的实现。 1.1 示例 直接看 leader election 代码容易晕&#xff0c;这里从示例入手&#xff0c;看 leader electi…