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

news2024/11/19 17:40:29

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.coloradmin.cn/o/1629350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Docker】Docker 实践(三):使用 Dockerfile 文件构建镜像

Docker 实践&#xff08;三&#xff09;&#xff1a;使用 Dockerfile 文件构建镜像 1.使用 Dockerfile 文件构建镜像2.Dockerfile 文件详解 1.使用 Dockerfile 文件构建镜像 Dockerfile 是一个文本文件&#xff0c;其中包含了一条条的指令&#xff0c;每一条指令都用于构建镜像…

R语言高级数据管理

一&#xff0c;数学函数 绝对值函数abs(x) sqrt(x) 开平方根 不小于某个数的最小整数ceiling(x) 不大于某个数的最大整数floor(x) 四舍五入round(x) sin(x) cos(x) log(x) 二&#xff0c;统计函数 求平均值 > x<-c(2,3,4,5,6,7,8,9,10) > mean(x) 求和 &g…

数学视角下的编程艺术:深入线性代数学习与应用

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…

C#调用skiasharp实现绘制并拖拽图形

SkiaSharp是基于.net的跨平台二维图形库&#xff0c;封装的谷歌的Skia库&#xff0c;SkiaSharp支持在以下平台或运行时中使用&#xff0c;能够在图片中绘图&#xff0c;也提供控件在Winform、WPF等使用。本文学习skiasharp在Winform的基本用法&#xff0c;并参照参考文献5实现绘…

数据集笔记:geolife staypoint聚合的location 最近的10个其他location

数据集&#xff1a;处理geolife数据-CSDN博客 这边的stations&#xff0c;找到每个station 最近的其他10个station 1 读取数据 假设已经读完了&#xff0c;就是locations 2 保留有用的列 locations.drop([center,user_id],axis1,inplaceTrue) locations 3 加载几何形状 使用…

安装配置Maven(idea里面配置)

放在这个路径下&#xff08;如果需要可以免费发给你&#xff0c;dd我就好了&#xff09; D:\IearnSoftware\maven\apache-maven-3.6.1-bin.zip&#xff08;我自己的路径下面&#xff0c;防止忘记&#xff09; 1.首先测试maven在不在&#xff0c;配置对不对 mvn -v 这样就是成…

[Linux][网络][网络编程套接字][一][预备知识][套接字地址结构]详细讲解

目录 0.预备知识1.理解源IP地址和目的IP地址2.理解源MAC地址和目的MAC地址3.端口号4.理解端口号和进程ID5.理解源端口号和目的端口号6.通过IP地址、端口号、协议号进行通信识别7.认识TCP协议和UDP协议8.网络字节序 1.套接字地址结构(sockaddr) 0.预备知识 1.理解源IP地址和目的…

【智能算法】骑手优化算法(ROA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2018年&#xff0c;D Binu等人受到骑手群体竞赛赢得比赛行为启发&#xff0c;提出了骑手优化算法&#xff08;Rider Optimization Algorithm, ROA&#xff09;。 2.算法原理 2.1算法思想 ROA基…

[ESP32]:TFLite Micro推理CIFAR10模型

[ESP32]&#xff1a;TFLite Micro推理CIFAR10模型 模型训练 数据集处理 from keras.datasets import cifar10 from keras.preprocessing.image import ImageDataGenerator from keras.models import Sequential, load_model, Model from keras.layers import Input, Dense, …

mac用Homebrew安装MySQL并配置远程登录

1. 简介 MySQL 是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;后被 Oracle 公司收购。MySQL 使用 SQL&#xff08;Structured Query Language&#xff09;作为查询语言&#xff0c;并提供了强大的功能和性能…

AG32 MCU在触摸屏的应用(AGM FPGA/MCU行业应用)

传统的屏驱MCU常见应用于洗衣机、空调、空调面板、仪器仪表等人机交互界面显示场景中&#xff0c;通常是以段码的形式显示设备运转的时间、温度、测量结果等简单运行数据&#xff0c;随着人机交互需求丰富化&#xff0c;智能家居设备、摩托车、电动车等产品也逐步增加了屏幕显示…

解决Milvus官网提供的单机版docker容器无法启动,以及其它容器进程与Milvus容器通信实现方案【Milvus】【pymilvus】【Docker】

文章目录 问题预备知识方案获取pymilvus获取milvus 实例多容器通信 问题 我的需求是做混合检索单机版可以满足&#xff0c;要走Docker容器部署&#xff0c;还需要和另一个容器中的程序做通信。官方文档提供的Milvus安装启动Milvus方案&#xff0c;见文档&#xff1a;传送门 我…

为什么要学音视频?

一直都在说“科技改变生活”&#xff0c;现实告诉我们这是真的。 随着通信技术和 5G 技术的不断发展和普及&#xff0c;不仅拉近了人与人之间的距离&#xff0c;还拉近了人与物&#xff0c;物与物之间的距离&#xff0c;万物互联也变得触手可及。 基于此背景下&#xff0c;音…

Eclipse 如何设置 Maven 下载源代码和文档

在 Eclipse 的 Windows 菜单下选择属性。 然后在 Maven 选项下&#xff0c;选择下载包的源代码和文档。 保存应用即可。 Eclipse 如何设置 Maven 下载源代码和文档 - Java - iSharkFly在 Eclipse 的 Windows 菜单下选择属性。 然后在 Maven 选项下&#xff0c;选择下载包的源代…

Linux异步io机制 io_uring

io_uring作为2019年的后起之秀&#xff0c;为linux异步网络编程新增一把倚天大剑&#xff0c;让我们简单学习一下&#xff01; 数据结构&#xff1a; a. sq (submition queue)&#xff1a;提交队列&#xff0c;一个存放待执行事件的环形队列 b. cq (completion queue): 完成…

自定义大整数类(初次版本)

例子&#xff1a; #include "X:\Work\Share\CCode\CPlatform\MathExt\_MathExt_out.h"using namespace lf; using namespace std;int main() {_Integer i1 _t("12345678989764581381214575686787987979234234354364");_Integer i2 _t("1234567898…

SpringCloud02(远程调用Feign,网关Gateway,配置中心Nacos)

目录 一、远程调用Feign【要会用】 1. Feign简介 1 什么是Feign 2 准备基础代码 2. Feign入门【重点】 步骤 实现 测试 3. Feign配置Ribbon 1 说明 2 配置 4. Feign配置日志 1 说明 2 步骤 5. Feign使用优化 1 说明 2 步骤 6. 小结 二、网关Gateway 1. 网关…

基于深度学习神经网络的AI图片上色DDcolor系统源码

第一步&#xff1a;DDcolor介绍 DDColor 是最新的 SOTA 图像上色算法&#xff0c;能够对输入的黑白图像生成自然生动的彩色结果&#xff0c;使用 UNet 结构的骨干网络和图像解码器分别实现图像特征提取和特征图上采样&#xff0c;并利用 Transformer 结构的颜色解码器完成基于视…

xfce4 panel 不能显示QQ,钉钉的状态图标

有一段时间不能显示了&#xff0c;之前刚装完系统的时候很长时间内都是好的&#xff0c;所以刚开始肯定是支持显示这些状态图标的。就是因为不能显示的原因&#xff0c;所以还装了lxQt桌面&#xff0c;这个桌面确实不错。不过还是有时会怀念xfce4&#xff0c;想看看能不能解决这…

面经总结(二)(数据库)

数据库常识&#xff1a; 1、数据库系统包含什么&#xff1f; 包含了数据库、数据库管理系统、数据库管理员和应用程序。 数据库&#xff08;DB)&#xff1a;顾名思义是存放数据的仓库&#xff0c;实现数据的持久化。 数据库管理系统&#xff08;DBMS)&#xff1a;类似于操作系…