Mecanim Animation System

news2024/9/17 7:17:46
动画系统简介

Unity 有一个非常丰富而又复杂的动画系统,官方称其为Mecanim。该系统具有以下功能:

  • 支持从外部导入动画剪辑,如:fbx、mb | ma(Autodesk maya 原件)、.max(3ds Max原件)、.blend(Blender 原件

  • 从Unity编辑器创建简单的动画剪辑

  • 提供动画剪辑关键帧到脚本的交互

  • 人形动画重定向,将动画通过Avatar系统从一个模型转移到另一个模型上

  • 预览(编辑器|运行时)动画剪辑以及他们之间的过度与交互

  • 提供可视化工具来管理动画之间的复杂交互

  • 分层管理与遮罩

3ds Max原件在导入时会被转换为FBX格式

需要安装Blender软件才能正常导入.blend

动画系统的工作流程
  1. 由艺术工作者提供剪辑资源

  2. 通过Animator Controller(动画状态机)协调动画之间的衔接、过度、混合

  3. 制作人形角色的Avatar模具或遮罩,包含骨骼映射、肌肉设定

  4. 将Animator和Avatar赋予给不同的模型以实现动画共享

        不建议将这个动画系统应用于图形用户界面,应为它比简单的Tween动画要至少高出30%的开销。

        通常场景中简单游戏对象的动画只需要用到1或2两个环节

        是否需要用到Avatar系统,取决于你的人形动画的通用程度,例如某个BOSS的动画集的通用动画占比不足10%,那么放弃Avatar系统可以帮助你提升30%~50%的CPU计算性能。

Mecanim 动画系统的工作流程
Avatar基础用户手册
简介

        在Unity中Avatar是用来描述骨骼及肌肉组织的接口,它以附加资产的形式寄存在模型或动画资源上。

创建或引用Avatar
从模型创建Avatar功能入口

        你可以在模型导入时,通过Avatar Definition=Create From This Model来为当前的模型新建一个Avatar实例,也可以从其他模型中引用已经创建完毕的Avatar实例。

注意:引用其他模型的Avatar实例,需要保证当前模型的骨骼结构(包括骨骼命名)与被引用的模型一致。

为Avatar资产配置骨骼映射
配置Avatar功能入口
配置Avatar编辑器入口
骨骼映射编辑界面

默认情况下,Unity会自动映射。

自动映射功能入口

在骨骼意外丢失的情况下,可以通过Mapping>Auto map进行自动映射。

当然你可以可以通过Save功能导出一个骨骼模板,提供给其他模型使用。

同时你可以可以通过Load功能载入一个骨骼模板,应用到当前Avatar资产中。

重置模型到T-Pose

 如果资产的骨骼没有进入到T-Pose状态,可能会导致表现上的错误。

你可以通过Enforce T-Pose使它强制进入到T-Pose姿态。

为Avatar配置肌肉参数
肌肉配置面板
浏览调整的姿态

         浏览姿态面板可以让你更好的了解,当前肌肉参数配置下网格最基本的形变是否会发生严重扭曲、挤压、破皮等现象。

模型穿透的例子
调整参数修复穿模

        在这里我将原有的值从40调整到27,修复了模型穿透的现象。

        总之它可以帮助我们约束骨骼的活动姿态,从而使表现达到最佳的效果。

        正常情况下这个姿态产生的问题需不需要修复,取决于你的动画剪辑中是否涉及到该姿态的表现,如果没有,你完全可以忽略它。

模型Avatar与动画剪辑Avatar的关系

        在使用Avatar进行动画共享的正常情况下,动画剪辑可能会来自不同的模型,这意味动画剪辑的Avatar配置不一定能完全适用当前的模型形变。在这种情况下,就需要两个Avatar,动画剪辑Avatar提供标准的姿态配置,而模型的Avatar提供一个不破坏网格形变的姿态配置。

        假设你的动画剪辑Avatar完全可以适应模型的形变,那么他们完全可以使用一个Avatar实例。

        在有两个Avatar工作过程中,模型的Avatar会接收动画剪辑Avatar吐出的姿态数据,并根据自身的肌肉设定再次对姿态进行调整,最终应用到网格形变上。

Animator基础用户手册

        Animator Controller是Mecanim Animation System的核心功能,它涉及到非常多的内容,在这篇文章我只做了最基础的介绍。

简介

        Animator Controller又叫做动画状态机,它的工作原理与状态机类似,它利用Animation Clip(动画剪辑)作为单位节点。在Animator中每个节点都属于一个单独的状态,它允许你根据条件设置动画如何从状态A过度到状态B,以表示角色的形态。

        与普通状态机不同的是,它支持动画状态的混合和叠加。

        混合更像是程序世界的Switch Ease语句,它可以根据某个属性在一组动画中随意过度。

        而叠加是通过权重去控制不同分层的动画状态,最终作用于同一模型上的结果。

创建Animator Controller
创建Animator Controller功能入口
Animator Controller 编辑窗口 
Animator Controller 窗口布局
 工作流程
  1. 在状态面板中编辑动画状态之间的转换
  2. 在参数面板编辑适用于跳转的参数变量
  3. 将参数变量应用到跳转上
  4. 编辑动画跳转过程中的过度方式
  5. 通过脚本控制Animator Controller实例暴露的参数,以达到改变动画行为的目的
新增一个动画状态到编辑区

最简单的办法是拖拽一个Animation Clip资产,到编辑区域视口

当然你也可以效仿下面方式,通过菜单创建状态节点

创建一个空的动画状态
为新节点设置动画剪辑

  1. 选中剪辑
  2. 打开Motion属性的选择器
  3. 选择一个合适的剪辑
创建一个Transition
步骤1和2
  1. 在原节点上右键打开菜单,并选择Make Transition
  2. 拖拽引线到目标节点
使用变量控制Transition 
添加变量
  1. 在参数面板,打开变量菜单
  2. 选择变量类型
  3. 为变量命名
为变换应用参数

  1. 添加控制条件
  2. 选择控制变量
  3. 选择比较值

        到这里为止,一个简单的循环就完成了。

        当然在实际应用过程中还会涉及到状态属性、跳转属性、BlendTree、叠加层、子状态机、覆盖控制器等很多的编辑知识,单独写一个文章介绍。 

为游戏对象配置相关资产
为GameObject配置相关资产
  1. 要挂载 Animator 组件
  2. 配置 Animator Controller(动画控制器)
  3. 配置模型的 Avatar实例
扩展
动画剪辑的参数设置
Animator是如何适配模型的骨骼结构的?

        当Animator开始工作的时候,它会从跟节点开始遍历寻找与骨骼匹配的跟节点,在确定骨骼根节点之后,它会将网格模型的骨骼结构和骨骼节点名称和Avatar配置的骨架做对比,直到找到一个完全一样的骨架。

        当子节点下有两个相同结构的骨骼模型时,Unity总是会选择排序最靠前的模型作为骨骼动画的输出目标。

        这意味着你在子节点上挂载两个模型都适用与该Avatar的时候,即使排序靠前的模型是隐藏的,那么Unity依然会选择它作为输出目标,另外一个即便是显示的也不会动哟。


Unity 骨骼树形结构

Root (根节点)
|-- Hips (髋部)
    |-- LeftUpLeg (左大腿)
        |-- LeftLeg (左小腿)
            |-- LeftFoot (左脚)
                |-- LeftToes (左脚趾)
    |-- RightUpLeg (右大腿)
        |-- RightLeg (右小腿)
            |-- RightFoot (右脚)
                |-- RightToes (右脚趾)
|-- Spine (脊柱)
    |-- Spine1 (脊柱1)
    |-- Spine2 (脊柱2)
|-- Chest (胸部)
|-- Neck (颈部)
|-- Head (头部)
    |-- HeadTop (头顶)
|-- LeftShoulder (左肩)
    |-- LeftArm (左臂)
        |-- LeftForearm (左前臂)
            |-- LeftHand (左手)
                |-- LeftHandThumb (左手拇指)
                    |-- LeftHandThumb1 (左手拇指1)
                    |-- LeftHandThumb2 (左手拇指2)
                |-- LeftHandIndex (左手食指)
                    |-- LeftHandIndex1 (左手食指1)
                    |-- LeftHandIndex2 (左手食指2)
                |-- LeftHandMiddle (左手中指)
                    |-- LeftHandMiddle1 (左手中指1)
                    |-- LeftHandMiddle2 (左手中指2)
                |-- LeftHandRing (左手无名指)
                    |-- LeftHandRing1 (左手无名指1)
                    |-- LeftHandRing2 (左手无名指2)
                |-- LeftHandPinky (左手小指)
                    |-- LeftHandPinky1 (左手小指1)
                    |-- LeftHandPinky2 (左手小指2)
|-- RightShoulder (右肩)
    |-- RightArm (右臂)
        |-- RightForearm (右前臂)
            |-- RightHand (右手)
                |-- RightHandThumb (右手拇指)
                    |-- RightHandThumb1 (右手拇指1)
                    |-- RightHandThumb2 (右手拇指2)
                |-- RightHandIndex (右手食指)
                    |-- RightHandIndex1 (右手食指1)
                    |-- RightHandIndex2 (右手食指2)
                |-- RightHandMiddle (右手中指)
                    |-- RightHandMiddle1 (右手中指1)
                    |-- RightHandMiddle2 (右手中指2)
                |-- RightHandRing (右手无名指)
                    |-- RightHandRing1 (右手无名指1)
                    |-- RightHandRing2 (右手无名指2)
                |-- RightHandPinky (右手小指)
                    |-- RightHandPinky1 (右手小指1)
                    |-- RightHandPinky2 (右手小指2)

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

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

相关文章

5.仓颉编程_数组使用与异常捕捉

5.仓颉编程_数组使用与异常捕捉 数字数组与字符串数组 import std.console.*main() {var qty 10var zero2 0var array [1,2,3] //数组var str_arr:Array<String> [aa,bb]try {//qty qty / zero2//println(qty)println(str_arr[0])println(array[0])// println(arr…

rhce THE homework of first

ssh远程免密登录成功 下载httpd和nginx 关闭防火墙 查看selinux的状态 为服务器配置ip 填充网站的内容 添加服务器配置 将文本写入网站

2024电赛H题参考方案(+视频演示)——自动行使小车

目录 一、题目要求 二、参考资源获取 三、参考方案 1、环境搭建及工程移植 2、移植MPU6050模块 3、移植TB6612电机驱动模块 4、整体控制方案视频演示 总结 一、题目要求 小编自认为&#xff1a;此次H题属于控制类题目&#xff0c;相较于往年较为简单&#xff0c;功能也算单一&a…

深入解析 GZIP 压缩传输:优化网络性能的利器

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

MATLAB中“varargin”的作用

varargin是什么&#xff1f; 在MATLAB中&#xff0c;varargin是一个特殊的变量&#xff0c;用于接收函数输入参数中的可变数量的参数。它允许用户在调用函数时传递不确定数量的参数。 varargin的本质是一个包含了所有可变参数的cell数组。在函数内部&#xff0c;可以使用cell…

dpdk 响应icmp请求(Echo or Echo Reply Message)

注&#xff1a;对于"Echo or Echo Reply Message"类型的icmp报文&#xff0c;响应报文的Identiy和Sequence Number的值与请求报文的这两个字段的值要相同。 Identifier&#xff08;标识符&#xff09;字段通常由发送方设置&#xff0c;并被用于将ICMP请求与相应的回复…

Lombok注解之@SneakyThrows作用

Lombok注解之SneakyThrows作用 读法 [ˈsniːki] [θroʊz] 悄悄的 抛出顾名思义&#xff0c;它能够自动偷摸的为咱们的代码生成一个try…catch块&#xff0c;并把异常向上抛出来。 使用 SneakyThrows的使用范围&#xff1a; 只能作用在方法和构造函数之上。从源码就可以…

【C++】选择结构-多条件if语句

多条件if语句格式为 if(第一个条件) else if(若第一个条件未满足&#xff0c;执行此条件) {第二个条件满足执行此操作} else if(若第二个条件未满足&#xff0c;执行此条件) {第三个条件满足执行此操作} ...... else{若所有条件都不满足执行此操作} 下面是一个实例 #inc…

app逆向实战:某咨询6.0.4.4版本signature等参数抓包与破解

本篇博客旨在记录学习过程&#xff0c;不可用于商用等其它途径 入口 密码登录接口 抓包 根据抓包结果得知动态参数是client_timestamp&#xff0c;keyword&#xff0c;client_session&#xff0c;sig&#xff0c;sigTime&#xff0c;cursor 初步观察得出以下结论&#xff…

负债了,打死也别干的六件事!逾期了,六句谎言千万别信!

负债这事儿&#xff0c;真是一言难尽&#xff0c;稍不留神&#xff0c;就可能让情况雪上加霜。今儿咱们聊聊&#xff0c;负债后那几件打死也别干的几件事&#xff0c;尤其是针对还没有逾期的朋友们&#xff0c;免得后悔莫及。 首先&#xff0c;千万别动歪脑筋&#xff0c;拿公款…

深入剖析:GaussDB与MySQL在COUNT查询中的并行化技术

引言 数据库查询性能优化是数据库管理和开发中的一个重要议题。在处理大数据量的COUNT查询时&#xff0c;传统的单线程处理方式可能无法满足现代应用的性能需求。GaussDB(for MySQL)和MySQL作为流行的数据库系统&#xff0c;它们在并行查询优化方面有着各自的策略和技术。本文…

【C++】C++的类型的转换

目录 C语言中的类型转换 C中的类型转换 C强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast C语言中的类型转换 C语言中又两种类型转换&#xff1a;&#xff08;强制&#xff09;显示类型转换和隐式类型转换。 &#xff08;强制&#xff09;显示类型…

多线程与并发思想

问题分析 设计并发程序的目的就是为了使程序运行得更快&#xff08;时间就是金钱、生命&#xff09;&#xff0c;提高软件的性能。并发程序之所以能快&#xff0c;就在于这个“并”字&#xff0c;因为程序能并发(单核)或并行(多核、多CPU)执行&#xff0c;当然能快。这就好比工…

修改linux服务器上的mariadb/mysql数据库的密码

文章目录 一、查看数据库的状态二、修改密码 可能我们在最初安装数据库时没有设置密码或者已经设置了但是又想修改另一个密码&#xff0c;可以这样操作来修改我们的密码。 以数据库 mariadb 为例。 一、查看数据库的状态 使用命令 systemctl is-active mariadb 查看当前数据库…

链表篇-02.从尾到头打印链表(反转链表)

解题思路&#xff1a; 链表从尾到头打印链表, 我的思路是 用三个指针,第一个指针(pre)指向指向头节点的前一个位置&#xff0c;第二个指针(cur)指向头节点&#xff0c; 然后依次往后执行&#xff0c;第三个指针用于临时记录第二个指针的下一个位置。 代码详情: import java.…

Linux云计算 |【第二阶段】AUTOMATION-DAY5

主要内容&#xff1a; YAML语法格式&#xff0c;层级关系、Ansible Playbook文件及语法格式、Ansible变量&#xff08;定义变量方法、优先级顺序、setup和debug查看变量&#xff09; 补充&#xff1a;Ansible ad-hoc 可以通过命令行形式远程管理其他主机&#xff0c;适合执行一…

python学习笔记——字符串

一、创建字符串 1.我们可以使用引号( 或 " )来创建字符串。创建字符串很简单&#xff0c;只要为变量分配一个值即可。 var1 Hello World! var2 "Runoob" 二、访问字符串中的值 1.Python 访问子字符串&#xff0c;可以使用方括号 [] 来截取字符串。…

RocketMQ的Admin Tool工具

文档&#xff1a;https://github.com/apache/rocketmq/blob/develop/docs/cn/operation.md写的很全面&#xff0c;我写了一半就偷懒了&#xff0c;地址放这里。 命令大全&#xff1a;https://github.com/apache/rocketmq/blob/develop/docs/cn/operation.md 1. 删除讨厌的告警…

VUE3——003、VUE 项目中的文件结构(index.html、main.ts、App.vue)

虽然是号称是小白初学&#xff0c;但本文只是对 VUE 小白&#xff0c;其它的基功还是有一丢丢的&#xff0c;不太懂的同学去看看一下详解&#xff0c;我这里记述的是自己的理解和观点。见谅&#xff01; index.html&#xff1a;入口文件&#xff08;以创建 vue3 项目的默认文件…

springboot+vue+mybatis线上选课系统+PPT+论文+讲解+售后

在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对学生选课信息管理的提升&#xff0c;也…