【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.mzph.cn/pingmian/4244.shtml

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

相关文章

2013NOIP普及组真题 1. 计数问题

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1961 核心思想&#xff1a; 本来想找规律&#xff0c;后来发现本题的数据范围不大&#xff0c;n为 1 0 6 10^6 106&#xff0c;即使每一位都判断一次&#xff0c;最坏的情况下时间复杂度…

ubuntu20部署ceph17

# 配置3个节点ubuntu 20操作系统源 cat /etc/apt/sources.list deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse deb http://mirrors.aliyun.co…

Int4:Lucene 中的更多标量量化

作者&#xff1a;来自 Elastic Benjamin Trent, Thomas Veasey 在 Lucene 中引入 Int4 量化 在之前的博客中&#xff0c;我们全面介绍了 Lucene 中标量量化的实现。 我们还探索了两种具体的量化优化。 现在我们遇到了一个问题&#xff1a;int4 量化在 Lucene 中是如何工作的以…

git clone 报错 记录

问题 $ git clone http://***.git Cloning into … remote: Enumerating objects: 110841, done. remote: Counting objects: 100% (110841/110841), done. remote: Compressing objects: 100% (46725/46725), done. error: RPC failed; curl 18 transfer closed with outstand…

微服务之并行与分布式计算

一、概述 1.1集中式系统vs分布式系统 集中式系统 集中式系统完全依赖于一台大型的中心计算机的处理能力&#xff0c;这台中心计算机称为主机&#xff08;Host 或 mainframe &#xff09;&#xff0c;与中心计算机相连的终端设备具有各不相同非常低的计算能力。实际上大多数终…

额外加餐-关于使用bitmap来解决缓存穿透的方案

[外链图片转存中…(img-OyLw7puy-1712760065604)] 代码 UserController GetMapping("/sign/count") public Result signCount(){return userService.signCount(); }UserServiceImpl Override public Result signCount() {// 1.获取当前登录用户Long userId User…

[前端] todoList制作

知识点回顾 后代选择器 可以使用多个选择器每个选择器之间用空格分开。只要是后代就会被选择如 <style>div a{color: red;} </style> <div><a href"">我是儿子</a><p><a href"">我是孙子</a></p>…

【ARM 裸机】BSP 工程管理

回顾一下上一节&#xff1a;【ARM 裸机】NXP 官方 SDK 使用&#xff0c;我们发现工程文件夹里面各种文件非常凌乱&#xff1b; 那么为了模块化整理代码&#xff0c;使得同一个属性的文件存放在同一个目录里面&#xff0c;所以学习 BSP 工程管理非常有必要。 1、准备工作 新建…

校车车载4G视频智能监控系统方案

一、项目背景 随着社会的快速发展&#xff0c;校车安全问题日益受到人们的关注。为了提高校车运营的安全性&#xff0c;保障学生的生命安全&#xff0c;我们提出了一套校车车载4G视频智能监控系统方案。该系统能够实时监控校车内部和外部环境&#xff0c;及时发现并处理潜在的…

沪深websocket level2/level1行情推送接入示例

行情接入包 golang packge: package hangqingimport ("bufio""bytes""compress/flate""encoding/json""github.com/gorilla/websocket""io/ioutil""log""net/http""net/url"&quo…

【方案解决思路】RPC服务器不可用

当在SCCM服务器上使用wmic /node:<客户端IP> process list命令时&#xff0c;如果遇到“RPC服务器不可用”的错误&#xff0c;这通常意味着SCCM服务器无法通过RPC协议与远程客户端通信。以下是一些可能的解决步骤&#xff1a; 检查远程客户端的RPC服务&#xff1a; 确保远…

C++下跨平台websocket库及使用示例

websocketpp库使用非常方便&#xff0c;开源&#xff0c;可跨平台&#xff0c;内部实现全部是head文件&#xff0c;无cpp&#xff0c;接口简单易用。源码路径比如 https://github.com/zaphoyd/websocketpp.git 使用方法是&#xff0c;先下载源码包并复制道工程的include目录下…

OpenResty 操作 Redis 和 MySQL

OpenResty 是一个基于 Nginx 的 Web 开发平台&#xff0c;它通过内置的方式集成了 LuaJIT&#xff0c;并内置了很多常用的第三方 Nginx 模块&#xff0c;使得开发人员可以使用 Lua 脚本来扩展 Nginx 的功能&#xff0c;这样就使得 OpenResty 可以非常方便地操作 Redis 和 MySQL…

springBoot加载配置文件

1. 说明 Spring Boot会自动加载application.properties或application.yml&#xff0c;所放置的位置如下表&#xff0c;所有位置的文件都会被加载&#xff08;互补配置&#xff09;&#xff0c;高优先级配置内容会覆盖低优先级配置内容。 自动加载配置文件的目录及优先级 位置优…

selenium 自动化测试课上实操指南1——百度搜索

1.环境准备 下面的所有资源可以从超星班级资料中下载&#xff0c;机房的同学在收到的文件夹中可以找到文件 非本校同学&#xff0c;免费加入学银在线课程&#xff0c;就可以在资料 根目录 > 02 课件新 > week09 web自动化测试02 里下载本次实操资料 1&#xff09;安…

【打工日常】云原生之搭建私有化web在线聊天软件LumenIM

一、LumenIM介绍 1.LumenIM简介 Lumen IM 是一个网页版在线聊天项目&#xff0c;前端使用 Naive UI Vue3&#xff0c;后端采用 GO 开发。 2.LumenIM功能 基于 WebSocket 服务做消息即时推送 支持私聊及群聊 支持多种聊天消息类型 例如:文本、代码块、图片及其它类型文件&…

JAVA对象的实例化内存布局与访问定位刨析

目录 1. 创建对象的方式 1.1 创建对象方式具体描述 2. 创建对象的步骤 2.1 判断对象对应的类是否加载、链接及初始化 2.2 为对象分配内存 2.3 处理并发安全问题

15.接口自动化学习-Mock(挡板/测试桩)

场景&#xff1a; 新需求还未开发时&#xff0c;使用mock提早介入测试&#xff0c;等后边开发后&#xff0c;进行调试 三方接口返回效率低&#xff0c;使用mock技术走通流程 1.mock方式 &#xff08;1&#xff09;如果会写django或flask,可以写简单对应的代码 &#xff08;…

lua编译器介绍

Lua编译器是将Lua语言编写的源代码转换为可执行代码的工具 一、实现原理 Lua编译器的核心任务是将Lua源代码&#xff08;纯文本文件&#xff09;转换为可执行的二进制代码&#xff08;字节码&#xff09;。这一过程通常包括词法分析、语法分析、语义分析、中间代码生成、优化以…

互联网摸鱼日报(2024-04-23)

互联网摸鱼日报(2024-04-23) 36氪新闻 重塑城市&#xff1a;AI驱动的城市模型如何改变治理 Windows将迎来第三方广告&#xff0c;微软终究还是“饿了” 加码内容化&#xff0c;或是京东攻占下沉市场的必由之路 同时押注两条路线&#xff0c;广汽智驾能领先华为和小鹏吗&…