【unity实战】Animator启用root motion根运动动画,实现完美的动画动作匹配

文章目录

  • 前言
    • 1、动画分类
    • 2、如何使用根位移动画?
  • 一、根位移动画的具体使用
    • 1、导入人形模型
    • 2、导入动画
    • 3、配置动画参数
    • 4、配置角色Animator动画状态机
    • 5、使用代码控制人物前进后退
  • 二、问题分析
  • 三、Humanoid动画中的Root Motion机制及相关配置
    • 1、Humanoid动画中的Root Motion机制和动画复用原理
    • 2、Root Motion相关配置
      • 2.1 root transform rotation 根变换旋转
        • (1)bake into pose 烘培成的动作
        • (2)loop match 循环匹配
        • (3)based upon 依据:根旋转的基础
      • 2.2 root transform position 根变换位置
        • (1)bake into pose 烘培成的动作
        • (2)based upon 依据
      • 2.3 Root Transfom Position (XZ) 根变换位置(XZ)
        • (1)bake into pose 烘培成的动作
        • (2)based upon 依据
    • 3、总结:`humanoid`动画配置最近实践
  • 四、问题修复
    • 1、角色下沉问题修复
    • 2、走着走着角色走歪了
  • 五、Root Motion动画位移还受到物体缩放的影响
  • 专栏推荐
  • 完结

前言

1、动画分类

在游戏开发中,我们常见的动画文件一般分为两种:

  • in place原地动画:也就是不带位移的动画
  • root motion根运动动画:也就是自带“根位移”的动画

这种所谓自带“根位移”的动画能够带来的好处是显而易见的,它有效地避免了角色动画和实际位移不同步的现象。比如我们经常可能会出现的滑步问题。
在这里插入图片描述

2、如何使用根位移动画?

如果对Animator的知识还不了解,可以先去查看:【unity游戏开发——Animator动画】

如果在项目中使用自带位移的动画,只需要勾选Animaator上的Apply Root Motion选项即可。
在这里插入图片描述

一、根位移动画的具体使用

1、导入人形模型

模型可以随意选择,这里我使用的是最近很火的:mita米塔模型。
在这里插入图片描述

2、导入动画

如果你还不知道如何使用mixamo,可以查看:【游戏资源】获取免费开源的人物模型,为obj fbx人物模型绑定人形骨骼和人形动画,并导入到unity中使用——mixamo的使用介绍

我们可以从mixamo下载两个前进和后退的root motion根运动动画
在这里插入图片描述

3、配置动画参数

配置动画为人形,且可循环播放
在这里插入图片描述

4、配置角色Animator动画状态机

Animator状态机配置也非常简单,两个bool参数控制动画切换即可
在这里插入图片描述

5、使用代码控制人物前进后退

注意:这里使用的是InputSystem输入控制,如果你还不了解如何使用。可以先去看看:【unity游戏开发——InputSystem】

使用代码控制人物前进后退。因为使用了root motion动画改变位置,所以在这个脚本里,我们完全不需要处理角色的位移。

using UnityEngine;
using UnityEngine.InputSystem;public class PlayerController : MonoBehaviour
{Animator animator;PlayerInput playerInput;Vector2 vector2;void Awake(){playerInput = GetComponent<PlayerInput>();animator = GetComponent<Animator>();}private void OnEnable() {// 输入触发事件,任何输入都会触发该事件playerInput.onActionTriggered += OnActionTrigger;}void OnDisable() {playerInput.onActionTriggered -= OnActionTrigger;}private void OnActionTrigger(InputAction.CallbackContext context){switch (context.action.name){case "Move":// 获取输入的方向值(Vector2类型)vector2 = context.ReadValue<Vector2>();// 如果Y轴方向的值大于0(向前)if (vector2.y > 0f){animator.SetBool("isForward", true);}else{animator.SetBool("isForward", false);}// 如果Y轴方向的值小于0(向后)if (vector2.y < 0f){animator.SetBool("isBackward", true);}else{animator.SetBool("isBackward", false);}break;}}
}

挂载脚本,配置参数
在这里插入图片描述

效果
在这里插入图片描述

二、问题分析

  • 角色似乎并没有走直线,我们只是按了前进和后退,她居然发生了转向,走着走着走歪了。
  • 而且似乎角色的高度也在下降,待机状态下发现人物的脚都陷到了地下了。
    在这里插入图片描述
    这些问题我们后面再一一解决。

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

1、Humanoid动画中的Root Motion机制和动画复用原理

root motion会把动画文件中描述的对游戏对象的坐标和角度值转换为相对位移和相对转角,并以此来移动游戏对象。

generic泛型动画中root motion会把动画文件中描述的根骨骼坐标值和角度值转换为相对位移和相对转角,并以此来移动游戏对象。

那么到了humanoid动画里,由于使用了Avatar系统,动画文件不再包含对具体骨骼的描述我们自然也就无法通过指定根骨骼来应用roo motion

所以unityhumanoid动画中通过分析骨骼的结构,计算出模型的重心center of mass,这个重心也可以被称为body transform,在预览动画这里激活下面这个选项,就可以看见它的重心,一般是在人物的中间位置。
在这里插入图片描述
我们可以把这个unity计算出来的root transform,当做humanoid动画下代表root motion的根骨骼节点,通过这种方式,我们就可以在不同的骨骼结构上复用同一个root motion动画
在这里插入图片描述

2、Root Motion相关配置

unity把root motion划分成了三个部分
在这里插入图片描述

2.1 root transform rotation 根变换旋转

根位置的旋转相关,要注意一下,root motion的旋转特指绕y轴的旋转。

(1)bake into pose 烘培成的动作

勾选表示root motion不使用动画自带的旋转。

(2)loop match 循环匹配

这里的这个红色标记代表了这个动画在角度上的吻合度
在这里插入图片描述
如果这个动画在播放中的转角过大,这里就会提示红色,告诉我们这个动画如果勾选了bake into pose则会带来不好的效果,比如如果我们是带旋转的动画。

而对于动画过程中转角较小的动画,比如说行走这里就会提示呈绿色,告诉我们可以勾选。

总结:要不要勾选bake into pose取决于我们需不需要动画来驱动游戏对象的旋转,而能不能勾选,则要参考这里loop match的红色或绿色提示。

(3)based upon 依据:根旋转的基础

这里指的是游戏对象在动画开始时对准的方向是哪里。
在这里插入图片描述
在这里插入图片描述

  • Original:保持源文件中的原始旋转
  • Root Node Rotation:使用根节点的旋转(仅适用Generic通用动画类型)
  • Body Orientation:保持上半身朝前(仅适用于Humanoid人形动画类型)

Generic和humanoid动画这里的参数有所区别,唯一区别是,Generic动画里的root motion是基于根骨骼root node的,所以这里可以把根骨骼的朝向当做动画的朝向。而humanoid的动画并没有根骨骼,所以Unity就把计算出来的重心body transform身体方向的方向放在这里供我们选择。
在这里插入图片描述
由于humanoid的方向是Unity计算出来的,所以一般情况下也不太准,所以大家如果是使用Mixamo上的动画的话,这里一般选择original原始。

2.2 root transform position 根变换位置

沿y轴的位移

(1)bake into pose 烘培成的动作

将垂直根运动烘焙到骨骼移动。禁用此选项将会存储为根运动。假如移动不勾选根对象可能会上下移动,勾选了根对象不会上下移动,更平稳。一般都是勾选的。

(2)based upon 依据

垂直方向上把模型的哪个位置对齐到游戏对象的原点上。
在这里插入图片描述

  • Original:保持源文件中的垂直位置。默认是original原始,也就是3D美术设置的动画原点。
  • Root Node Position:使用垂直根位置(仅适用Generic通用动画类型)
  • Center Of Mass:保持质心与根位置对其(仅适用Humanoid人形动画类型)。center of mass质心或重心就是我们前面提到过的,unity计算出的那个body transform,选择它的话可以看到游戏对象的位置对齐到了重心的位置。
    在这里插入图片描述
  • Feet:(注意这里英寸是翻译有问题,翻译成才对),保持双脚与根变换位置对齐(仅适用Humanoid人形动画类型)。Feet就是模型的脚,或者说Avatar系统下的脚。在generic动画中是没有脚这个慨念的,它只是处理单纯的骨骼。而在humanoid动画中,借助Avatar我们是可以明确的知道每一块的骨骼对应人体的结构。我们选择feet试一下,可以发现它和original的差别并不大。
    在这里插入图片描述

那么这个feet和original的区别在哪?以及我们应该选择哪一个呢?

我们可以相信Mixamo中的original,因为这个original就是动画美术为我们提供的原点。但是那仅限于generic动画,而在humanoid动画中,因为动画的复用会使得动画发生一系列的变形。

简单来说,动画原本是针对A模型制作的,那么这个original或者说原点就是A模型播放动画时的原点,当我们使用B模型复用这个动画时,我们没有办法保证Avatar转移后的原点,还能够保持其原来的准确性。所以当我们选择original时,如果发现效果不佳,除了调节下面的offset之外还可以考虑这个feet选项。

比如我们当前选择的这个idle动画,在选择original时,角色的脚已经陷到地面以下。
在这里插入图片描述
我们改成feet试一下,发现好了一点。
在这里插入图片描述

2.3 Root Transfom Position (XZ) 根变换位置(XZ)

就是root motion在水平平面上x和z轴的位移设置。

(1)bake into pose 烘培成的动作

将水平根运动烘焙到骨骼移动。禁用此选项将会存储为根运动。可以理解为不勾选根对象会水平运动,勾选了只会播动画根对象不会水平运动。

如果我们不希望这个动画控制角色在水平方向上位移,就勾选这里的bake into pose 烘培成的动作,比如待机动画,原地转身动画,原地起跳动画都可以勾选。
在这里插入图片描述

(2)based upon 依据

在这里插入图片描述

  • Original:保持源文件中的水平位置
  • Root Node Position:使用水平根位置(仅适用Generic通用动画类型)
  • Center Of Mass:保持与根位置对其(仅适用Humanoid人形动画类型)

这里的center of mass指的就是重心在水平平面的投影位置。
在这里插入图片描述

3、总结:humanoid动画配置最近实践

  • bake into pose烘培成的动作:要不要勾选取决于我们需不需要动画来驱动游戏对象,而能不能勾选,则要参考这里loop match循环匹配的红色或绿色提示。
    在这里插入图片描述

  • root transform rotation 根变换旋转的based upon 依据body transform身体方向参数是Unity计算出来的,一般情况下不太准,所以这里我们一般选择original原始
    在这里插入图片描述

  • root transform position 根变换位置的based upon 依据humanoid动画中,因为动画的复用会使得动画发生一系列的变形。这里最好选择feet脚。(注意这里英寸是翻译有问题,翻译成才对)
    在这里插入图片描述

四、问题修复

有了前面的介绍,我们现在可以对Root Motion动画的问题进行修复了。

1、角色下沉问题修复

问题就是不该处理垂直位移的动画在控制角色对象的垂直位移,把动画的root transform position Ybake into pose都给勾上。并把based upon 依据修改成feet
在这里插入图片描述
发现好了很多
在这里插入图片描述

2、走着走着角色走歪了

这就说明我们不该应用前进和后退动画的旋转。那么我们可以把它的root transform rotationbake into pose给勾上,并修改based upon为origina
在这里插入图片描述
如果切换成original还是有点歪的话,大家可以手动调整一下这里的offset偏移。

效果,我们可以看到现在角色不会走着走着歪了,问题解决
在这里插入图片描述

五、Root Motion动画位移还受到物体缩放的影响

还有一点需要注意,那就是Root Motion动画位移还受到物体缩放的影响。比如除了缩放不一样,其他条件完全一样的一大一小两个角色,它的移动距离是不一样的。
在这里插入图片描述
如果大角色的移动速度是1,那么缩放了0.1的小角色移动速度就是0.1。具体可以参考:Unity中Root Motion的核心机制


专栏推荐

地址
【unity游戏开发入门到精通——C#篇】
【unity游戏开发入门到精通——unity通用篇】
【unity游戏开发入门到精通——unity3D篇】
【unity游戏开发入门到精通——unity2D篇】
【unity实战】
【制作100个Unity游戏】
【推荐100个unity插件】
【实现100个unity特效】
【unity框架/工具集开发】
【unity游戏开发——模型篇】
【unity游戏开发——InputSystem】
【unity游戏开发——Animator动画】
【unity游戏开发——UGUI】
【unity游戏开发——联网篇】
【unity游戏开发——优化篇】
【unity游戏开发——shader篇】

完结

好了,我是向宇,博客地址:https://xiangyu.blog.csdn.net,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!
在这里插入图片描述

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

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

相关文章

中间件--ClickHouse-10--海量数据存储如何抉择ClickHouse和ES?

在Mysql数据存储或性能瓶颈时&#xff0c;采用冷热数据分离的方式通常是一种选择。ClickHouse和Elasticsearch&#xff08;ES&#xff09;是两个常用的组件&#xff0c;但具体使用哪种组件取决于冷数据的存储目的、查询模式和业务需求等方面。 1、核心对比 &#xff08;1&…

服务器运维:服务器流量的二八法则是什么意思?

文章目录 用户行为角度时间分布角度应用场景角度 服务器流量的二八法则&#xff0c;又称 80/20 法则&#xff0c;源自意大利经济学家帕累托提出的帕累托法则&#xff0c;该法则指出在很多情况下&#xff0c;80% 的结果是由 20% 的因素所决定的。在服务器流量领域&#xff0c;二…

springboot对接豆包大模型

文档地址: 豆包大模型-火山引擎 模型广场地址: 账号登录-火山引擎 首先来到模型广场&#xff0c;选取你需要的模型,我这边要做图片理解的应用&#xff0c;所以选用了Doubao-1.5.vision-pro. 点立即体验&#xff0c;进入一个新的页面&#xff0c;可以上传图片&#xff0c;然后…

数据通信学习笔记之OSPF其他内容3

对发送的 LSA 进行过滤 当两台路由器之间存在多条链路时&#xff0c;可以在某些链路上通过对发送的 LSA 进行过滤&#xff0c;减少不必要的重传&#xff0c;节省带宽资源。 通过对 OSPF 接口出方向的 LSA 进行过滤可以不向邻居发送无用的 LSA&#xff0c;从而减少邻居 LSDB 的…

智能安全用电系统预防电气线路老化、线路或设备绝缘故障

智能安全用电系统预防电气线路老化、线路或设备绝缘故障 智能安全用电系统&#xff0c;犹如一位忠实而敏锐的卫士&#xff0c;主要针对低压供电网中一系列潜在的危险状况进行了全方位且行之有效的预防和保护。 智能安全用电系统在低压供电网这个复杂的体系中&#xff0c;电气线…

使用Intel Advisor工具分析程序

使用Intel Advisor工具分析程序 Intel Advisor是一款性能分析工具&#xff0c;主要用于识别代码中的向量化机会、线程化和内存访问模式等问题。以下是使用Intel Advisor分析程序的基本步骤&#xff1a; 安装与准备 从Intel官网下载并安装Intel Advisor&#xff08;通常作为I…

【UniApp】Vue2 scss 预编译器默认已由 node-sass 更换为 dart-sass

从 HBuilderX 4.56 &#xff0c;vue2 项目也将默认使用 dart-sass 预编译器。 vue2开发者sass预处理注意&#xff1a; sass的预处理器&#xff0c;早年使用node-sass&#xff0c;也就是vue2最初默认的编译器。 sass官方推出了dart-sass来替代。node-sass已经停维很久了。 另…

智慧能源安全新纪元:当能源监测遇上视频联网的无限可能

引言&#xff1a;在数字化浪潮席卷全球的今天&#xff0c;能源安全已成为国家安全战略的重要组成部分。如何构建更加智能、高效的能源安全保障体系&#xff1f;能源安全监测平台与视频监控联网平台的深度融合&#xff0c;正为我们开启一扇通向未来能源管理新世界的大门。这种创…

C++游戏服务器开发之⑦redis的使用

目录 1.当前进度 2.守护进程 3.进程监控 4.玩家姓名添加文件 5.文件删除玩家姓名 6.redis安装 7.redis存取命令 8.redis链表存取 9.redis程序结构 10.hiredisAPI使用 11.基于redis查找玩家姓名 12.MAKEFILE编写 13.游戏业务实现总结 1.当前进度 2.守护进程 3.进程监…

db中查询关于null的sql该怎么写

正确示例 # 等于null select * from 表名 where 字段名 is NULL; # 不等于null select * from 表名 where 字段名 is not NULL;若需要同时判断字段不等于某个值且不为null select * from users where age ! 30 and age is not null; select * from users where age ! 30 or a…

从“堆料竞赛”到“体验深耕”,X200 Ultra和X200s打响手机价值升维战

出品 | 何玺 排版 | 叶媛 vivo双旗舰来袭&#xff01; 4月21日&#xff0c;vivo X系列春季新品发布会盛大开启&#xff0c;带来了一场科技与创新的盛宴。会上&#xff0c;消费者期待已久的X200 Ultra及X200s两款旗舰新品正式发布。 vivo两款旗舰新品发布后&#xff0c;其打破…

多模态大语言模型arxiv论文略读(三十二)

Proximity QA: Unleashing the Power of Multi-Modal Large Language Models for Spatial Proximity Analysis ➡️ 论文标题&#xff1a;Proximity QA: Unleashing the Power of Multi-Modal Large Language Models for Spatial Proximity Analysis ➡️ 论文作者&#xff1a…

基于贝叶斯优化的Transformer多输入单输出回归预测模型Bayes-Transformer【MATLAB】

Bayes-Transformer 在机器学习和深度学习领域&#xff0c;Transformer模型已经广泛应用于自然语言处理、图像识别、时间序列预测等多个领域。然而&#xff0c;在一些实际应用中&#xff0c;我们面临着如何高效地优化模型超参数的问题。贝叶斯优化&#xff08;Bayesian Optimiz…

Ruby 正则表达式

Ruby 正则表达式 引言 正则表达式&#xff08;Regular Expression&#xff0c;简称Regex&#xff09;是一种强大的文本处理工具&#xff0c;在编程和数据处理中有着广泛的应用。Ruby 作为一种动态、灵活的编程语言&#xff0c;同样内置了强大的正则表达式功能。本文将详细介绍…

kubernetes》》k8s》》删除命名空间

使用 kubectl delete ns 命名空间 --force --grace-period0 如果还删除不掉 需要 kubectl get namespace 命名空间 -o json > x.json vim x.json kubectl replace --raw “/api/v1/namespaces/命名空间/finalize” -f ./x.json

玩转Docker | 使用Docker部署DashMachine个人书签工具

玩转Docker | 使用Docker部署DashMachine个人书签工具 前言一、DashMachine介绍DashMachine简介DashMachine使用场景二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署DashMachine服务下载镜像创建容器创建容器检查容器状态检查服务端口安全设置四、访问Das…

SQL进阶知识:一、高级查询

今天介绍下关于高级查询的详细介绍&#xff0c;包括子查询、连接查询、分组查询等&#xff0c;并结合MySQL数据库提供实际例子。 一、子查询&#xff08;Subqueries&#xff09; 子查询是嵌套在另一个查询中的查询语句&#xff0c;通常用于提供条件过滤、生成临时数据集等。子…

【Git】Git Revert 命令详解

Git Revert 命令详解 1. Git Revert 的基本概念 Git Revert 是一个用于撤销特定提交的命令。与 Git Reset 不同&#xff0c;Git Revert 不会更改提交历史&#xff0c;而是会创建一个新的提交来撤销指定提交的更改。这意味着&#xff0c;使用 Git Revert 后&#xff0c;项目的…

华为S系列交换机CPU占用率高问题排查与解决方案

问题概述 在华为S系列交换机(V100&V200版本)运行过程中&#xff0c;CPU占用率过高是一个常见问题&#xff0c;可能导致设备性能下降甚至业务中断。根据华为官方维护宝典&#xff0c;导致CPU占用率高的主要原因可分为四大类&#xff1a;网络攻击、网络震荡、网络环路和硬件…

招募队员问题

#include <bits/stdc.h> using namespace std;int main() {int n;cin >> n; // 输入队伍人数&#xff08;行数&#xff09;vector<int> maxx(5, 0); // 用于记录每个数字&#xff08;1~5&#xff09;出现的最大连续段长度// 定义二维数组 team&#xff0c;n …