【博客节选】再谈Unity 的 root motion

节选自 【Unity实战笔记】第二十三· root motion变更方向攻击 (OnStateMove + rootmotion + rigidbody 使用的一些问题)

小伙伴们应该对root motion非常困惑,包括那个bake into pose。

在这里插入图片描述
当xz bake into pose后,角色攻击动画与父节点产生偏移,动画结束后,模型还会瞬移归位。

如何理解?先看一下这位看过Mecanim源码的人的介绍:

根节点运动(Root Motion)

  • 这里的根节点运动并不是一般意义上的“动画中的根节点的运动”,而是Mecanim动画系统处理根节点运动的一些列相关功能,以下都直接称之为RootMotion,而Mecanim一般称原本动画中对根节点的运动为< Root Transform >;
  • Mecanim有很具有特色的RootMotion处理功能,这里首先要提出两个概念:
    - Scene Root,模型文件中骨骼中真正的根节点,一般名称就是Scene Root,
    - Model Root,是Mecanim系统中模型语义上的中心节点;
  • 在非人形动画(Generic)中,默认没有Model Root,开发者可以指定任何节点为Model Root,而人形动画(Humanoid)中,Model Root不是任何一根具体的骨骼,而固定是人形骨骼的重心,在Unity给出的API中,根据导入配置选项差别,也称为Body或者Center of Mass;
  • 一旦骨骼对象拥有Model Root,其上的动画就会有RootMotion的语义,其详细意义是将Model Root在模型空间内的变换映射至Scene Root上,换句话说,RootMotion可以在原动画中不包含RootTransform时在Runtime时根据设置计算得到RootTransform;
  • RootMotion为开发者提供了两种处理计算得到的RootTransform的方法,一种是保留根变换,一种将根变换烘焙进Model Root中,也就是Unity官网解释的RootTransformBodyTransform方法;具体使用方法取决于Animator和AnimationClip的设置;
  • 应用RootTransform,也就是在Animator处开启Apply Root Motion,计算得到的RootTransform就会实际变换Scene Root,而应用BodyTransform,也就是选择对应Bake Into Pose,计算得到的RootTransform就会只变换Model Root,Scene Root会保持不变

    根节点运动(Root Motion)逻辑控制方案
  • Unity提供了一套代码支持逻辑管理RootMotion而不是让Animator直接管理的需求,在Animator组件的同级任意组件中实现OnAnimatorMove()回调接口即可;
  • 实现接口后Animator原本的RootMotion就不会生效,但是RootMotion计算得到结果会分别保存在Animator.rootPosition,Animator.rootRotation,Animator. deltaPosition, Animator. deltaRotation中,代码中根据需求使用;

在这里插入图片描述

  • ① Scene Root,对应 RootTransform
  • ② Model Root,对应 BodyTransform

如果不应用root motion,不bake into pose,就是一个原地动画,①不动和②也不动。
如果不应用root motion,bake into pose,①不动,②动。
如果应用root motion,bake into pose,①不动,②动。
如果应用root motion,不bake into pose,那就是②跟随①运动。

如下(出自我 第十一篇文章《动画基础》7.6.2 节):
在这里插入图片描述

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

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

相关文章

网站服务器常见的CC攻击防御秘籍!

CC攻击对网站的运营是非常不利的&#xff0c;因此我们必须积极防范这种攻击&#xff0c;但有些站长在防范这种攻击时可能会陷入误区。让我们先了解下CC攻击&#xff01; CC攻击是什么 CC是DDoS攻击的一种&#xff0c;CC攻击是借助代理服务器生成指向受害主机的合法请求&#x…

JAVA:Spring Boot @Conditional 注解详解及实践

1、简述 在 Spring Boot 中&#xff0c;Conditional 注解用于实现 条件化 Bean 装配&#xff0c;即根据特定的条件来决定是否加载某个 Bean。它是 Spring 框架中的一个扩展机制&#xff0c;常用于实现模块化、可配置的组件加载。 本文将详细介绍 Conditional 相关的注解&…

使用python爬取网络资源

整体思路 网络资源爬取通常分为以下几个步骤&#xff1a; 发送 HTTP 请求&#xff1a;使用requests库向目标网站发送请求&#xff0c;获取网页的 HTML 内容。解析 HTML 内容&#xff1a;使用BeautifulSoup库解析 HTML 内容&#xff0c;从中提取所需的数据。处理数据&#xff…

PostgreSQL 数据库源码编译安装全流程详解 Linux 8

PostgreSQL 数据库源码编译安装全流程详解 Linux 8 1. 基础环境配置1.1 修改主机名1.2 配置操作系统yum源1.3 安装操作系统依赖包1.4 禁用SELINUX配置1.5 关闭操作系统防火墙1.6 创建用户和组1.7 建立安装目录1.8 编辑环境变量 2. 源码方式安装&#xff08;PG 16&#xff09;2.…

(基本常识)C++中const与引用——面试常问

作者&#xff1a;求一个demo 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 内容通俗易懂&#xff0c;没有废话&#xff0c;文章最后是面试常问内容&#xff08;建议通过标题目录学习&#xff09; 废话不多…

Java并发编程 什么是分布式锁 跟其他的锁有什么区别 底层原理 实战讲解

目录 一、分布式锁的定义与核心作用 二、分布式锁与普通锁的核心区别 三、分布式锁的底层原理与实现方式 1. 核心实现原理 2. 主流实现方案对比 3. 关键技术细节 四、典型问题与解决方案 五、总结 六、具体代码实现 一、分布式锁的定义与核心作用 分布式锁是一种在分布…

案例:使用网络命名空间模拟多主机并通过网桥访问外部网络

案例目标 隔离性&#xff1a;在同一台物理机上创建两个独立的网络命名空间&#xff08;模拟两台主机&#xff09;&#xff0c;确保其网络配置完全隔离。内部通信&#xff1a;允许两个命名空间通过虚拟设备直接通信。外部访问&#xff1a;通过宿主机的网桥和 NAT 规则&#xff…

AF3 Rotation 类解读

Rotation 类(rigid_utils 模块)是 AlphaFold3 中用于 3D旋转 的核心组件,支持两种旋转表示: 1️⃣ 旋转矩阵 (3x3) 2️⃣ 四元数 (quaternion, 4元向量) 👉 设计目标: 允许灵活选择 旋转矩阵 或 四元数 封装了常用的 旋转操作(组合、逆旋转、应用到点上等) 像 torch.…

DeepSeek面试——模型架构和主要创新点

本文将介绍DeepSeek的模型架构多头潜在注意力&#xff08;MLA&#xff09;技术&#xff0c;混合专家&#xff08;MoE&#xff09;架构&#xff0c; 无辅助损失负载均衡技术&#xff0c;多Token 预测&#xff08;MTP&#xff09;策略。 一、模型架构 DeepSeek-R1的基本架构沿用…

【web3】

检测钱包是否安装 方法一 // npm install metamask/detect-provider import detectEthereumProvider from metamask/detect-provider// 检测钱包是否安装 const isProvider await detectEthereumProvider() if(!isProvider) {proxy.$modal.msgError("请安装钱包")…

husky的简介以及如果想要放飞自我的解决方案

husky 是一个 Git Hooks 管理工具&#xff0c;它的主要作用是 在 Git 提交&#xff08;commit&#xff09;、推送&#xff08;push&#xff09;等操作时执行自定义脚本&#xff0c;比如代码检查&#xff08;Lint&#xff09;、单元测试&#xff08;Test&#xff09;、格式化代码…

JVM之类的加载过程

加载 这一阶段是将类的字节码从外部存储&#xff08;如磁盘&#xff09;加载到JVM的内存中。加载时&#xff0c;JVM会根据类的全限定名&#xff08;包括包名和类名&#xff09;查找相应的字节码文件&#xff08;.class文件&#xff09;&#xff0c;并将其读入内存。 链接 链接…

Java Collection API增强功能系列之六 改进的 ConcurrentHashMap:归约、搜索、计数与 Set 视图详解

Java 8 改进的 ConcurrentHashMap&#xff1a;归约、搜索、计数与 Set 视图详解 Java 8 对 ConcurrentHashMap 进行了重大优化&#xff0c;不仅提升了并发性能&#xff0c;还引入了许多函数式编程方法&#xff0c;使其在处理高并发场景时更加高效和灵活。本文将深入解析 Concu…

AI生成移动端贪吃蛇游戏页面,手机浏览器打开即可玩

贪吃蛇游戏可计分&#xff0c;可穿墙&#xff0c;AI生成适配手机浏览器的游戏&#xff0c;代码如下&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <meta name"viewport" …

【动手学深度学习】#4 深度学习计算

主要参考学习资料&#xff1a; 《动手学深度学习》阿斯顿张 等 著 【动手学深度学习 PyTorch版】哔哩哔哩跟李牧学AI 概述 为了实现更复杂的网络&#xff0c;我们需要研究比层更高一级的单元块&#xff0c;在编程中由类表示。通过自定义层和块&#xff0c;我们能更灵活地搭建网…

如何在 Windows 上安装并使用 Postman?

Postman 是一个功能强大的API测试工具&#xff0c;它可以帮助程序员更轻松地测试和调试 API。在本文中&#xff0c;我们将讨论如何在 Windows 上安装和使用 Postman。 Windows 如何安装和使用 Postman 教程&#xff1f;

php写入\查询influxdb数据

namespace app\index\controller;use InfluxDB2\Client; use InfluxDB2\Model\WritePrecision; use InfluxDB2\Point;class Demo {/*** 显示资源列表** return \think\Response*/public function index(){$token 你的TOKEN;$org zzlichi;$bucket initdb;$client new Client…

26考研——图_图的基本概念(6)

408答疑 文章目录 一、图的基本概念图的定义非空性非线性结构 顶点和边的表示顶点边 有向图 & 无向图有向图有向图 G 1 G_1 G1​ 的表示 无向图无向图 G 2 G_2 G2​ 的表示 简单图 & 多重图简单图多重图 顶点的度、入度和出度顶点的度有向图的度 路径、路径长度和回路…

面向对象软件工程实践软件案例

智力运动-数字化思维训练课程介绍 数字化思维训练是科技赋能素质教育创新实践项目&#xff0c;通过数字化信息化手段&#xff0c;深度融合优质原创智力运动教育课程资源&#xff0c;服务幼儿园与小学&#xff0c;提供信息时代校园素质教育教学解决方案。在《面向对象软件工程》…

Linux学习笔记(应用篇一)

基于I.MX6ULL.MINI开发板 标准I/O库链接目录删除文件正则表达式系统标识时间堆内存信号标准信号 进程进程组进程间通信线程互斥锁线程安全 本文章是入门篇的概念&#xff0c;有点零散&#xff0c;后续需要补充复习 **inode&#xff08;索引节点&#xff09;**是 Linux 和 Unix …