Unity Animation -- 改进动画效果

使用曲线(Curves)改善动画 

      在上一篇笔记中(Unity Animation -- Overview_亦枫Leonlew的博客-CSDN博客),我们制作了简单的小球弹跳的动画,但这个动画看起来很不自然,小球的弹跳看起来就像是不受重力影响的物体,没有加速度的影响。要让小球的弹跳动画看起来更自然(不使用物理引擎,只使用动画),我们需要对中间帧进行调整,在Unity中,这是通过曲线编辑器(Curve Editor)来实现的。前面笔记中所用使用的Animation编辑器的一个部分叫做Dopesheet,它主要是关键帧被设置的地方。

        下面我们来看看Curve编辑器的使用:

        1. 在场景中选择小球对应的游戏物体,在Animation Editor中选择Ball_Bounce动画。然后在Animation编辑器的下方,点击Curves打开曲线编辑器。

         2. 使用鼠标滚轮或按F键进行缩小,直到我们看到了所有三个关键帧以及连接关键帧的曲线

        在编辑器中显示的曲线是关键帧之间的中间帧的可视化地表现,特别是它们的变化速度非常直观。如果此时预览动画,我们可以在过程中看到这个关系。在动画开始的前几帧,小球缓慢地降低,在中间加速掉落,然后在最后落地的时候变慢了一点。这种类型的变换被称为easing。我们下面来看看不使用easing时是什么情况。

        3. 右键点击第一个关键帧,然后在列表中选择Right Tangent -> Linear;

            右键点击中间的关键帧,然后在列表中选择Left Tangent -> Linear

            这样选择后,第一个关键帧和中间的关键帧之间的曲线会变成一条直线

         我们此时再点击Play按钮预览一下动画,注意观察一下和easing方式的区别(下落过程和弹回过程)

调整小球的easing

        1. 右键点击第一个关键帧,选择Camped Auto重置tangent到原始状态

        2. 右键点击中间的关键帧,选择Right Tangent -> Linear

        3. 在Animation编辑器中点击Play(三角)按钮预览一下

            现在这个动画看起来似乎更真实一点了

        4. 选择最后一个关键帧,我们可以看到有一个灰色的小的圆柄(handle),这个叫做切线handle(tangent handle)。

         5. 拖动这个handle,调整曲线让曲线的顶端更加圆滑一点。

        6. 预览并不断调整tangent handle,让小球的弹跳看起来更加真实,弹回来的时候,让动画看起来好像小球在空中停住了一会儿。

        7.右键点击中间的关键帧,选择Both Tangents -> Free,这样我们可以对这一帧的左右两侧的切线都进行自由地控制,我们将整体曲线调整成类似V字形的样子

创建挤压动画关键帧

        当物体以足够大的力碰到某个表面时,物体或者这个表面会发生形变。当撞击的能量被释放后,变形的物体会恢复到原来的形状(尽可能地接近原始形状)。在动画中,这个过程被封装成了称为squash(挤压)和stretch(拉伸)的技术中。

        先来创建挤压:

        1. 在Animation编辑器中,将Playehead放到第一个关键帧位置(0:00),打开关键帧记录功能(record按钮按下)

         2. 将Playhead移动到第二个关键帧,这个帧是小球触碰地面的帧。调整小球的Scale属性(按R键或者调整Inspector里的Scale属性,或者直接在动画编辑器中编辑这个关键帧的Scale属性),将Scale的Y调整为0.8

         3. 移动小球,让小球看起来和地面刚刚接触

                如果此时我们通过拖动Playhead,则我们可以手动地预览动画。这个过程称为scrubbing。我们从头拖到尾,可以发现小球现在是有挤压效果,但从动画一开始小球就在慢慢地被挤压(小球还未接触到地面之前也在变扁)。这不是我们想要得到的效果。

        4. 将Playehead移动到第一个关键帧(0:00处),选择Scale属性对应的菱形点,然后通过Ctrl+C(MAC系统上Command+C)复制一下这个关键帧。

        5. 将Playhead移动到小球刚刚接触地面之前的前一帧,然后Ctrl+V(MAC系统上Command+V)粘贴这个关键帧。

创建拉伸动画关键帧

        完成了挤压动画关键帧之后,接下来我们实现拉伸的关键帧。对于一个橡胶小球来说,当小球回弹时,会出现被拉伸的形状。

        1. 将Playhead移动到小球接触地面后的紧接着的下一帧位置,将Scale的Y调整到1.2

        2. 预览并跳帧调整一下挤压和拉伸的关键帧,达到满意效果后关闭Recording功能

让动画在场景中任意位置都能正常播放

        现在我们完成了小球弹跳的动画,但如果我们将小球初始位置移动到场景中的另一个位置时,会发生什么事情呢?我们想要达到的效果是小球的起始位置在新的地方,然后正常掉落并播放弹跳动画。但实际上并非如此。

        我们将小球移动到另一个位置,然后点击Animaiton编辑器的预览按钮(三角形)

        可以看到,动画播放时,小球立刻就回到了最初动画被创建时小球的原始位置上。这是因为关键帧里记录的信息是原始的信息。我们在Inspector中看到的Transfor Position的设置,是和3D空间里被选择物体的位置相关的(世界坐标)。这就麻烦了,我们好不容易制作了一个动画,但是这个动画只能在特定位置才能播放,这样很不灵活。幸运的是,有一种很简单的方法来解决这个问题。

        1. 我们撤销一下小球位置的改动,让小球回到原始位置,按Ctrl(Command) + Z

        2.  在Hierarchy窗口中,右键创建一个空游戏物体(Create Empty),重命名为BallParent

        3. 选择BallParent,在其Inspector属性中,Transform部分选择Reset,将其位置重置为(0,0,0)

         4. 将Ball拖动到BallParent游戏物体下方,让它成为BallParent的子物体

         5. 移动BallParent到场景中的另一个位置,然后在Animation编辑器中预览一下动画,现在小球可以在任意位置上进行弹跳动画播放了。

        我们选择Ball游戏物体,在Inspector中可以看到,小球的位置其实没有发生任何变化。但在Unity中,如果一个物体变成了另一个物体的子物体,它的transform值从世界空间变化为了局部空间(from global to local)。也就是说Ball现在transform里的位置信息,是相对于BallParent位置而言的。我们移动了BallParent游戏物体,并不会影响Ball本身动画里关键帧里的位置。

挑战:小球弹跳动画完善

        现实生活中,小球弹跳的样子是,第一次落地,回弹的距离最大,但也不会回到初始位置。随后的多次弹跳中,每一次回弹的距离会逐渐变小。接下来请自行实现一下这个效果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3信息提示(Modal)

Vue2信息提示(Modal) 可自定义设置以下属性: 标题描述(title),类型:string,默认 Title 内容描述(content),类型:string,…

盲盒经济下与社交电商结合,打造电商卖货新模式

如今,盲盒经济正在从线下延伸到线上,从潮流玩具扩展到美妆、食品、服装、数码等领域,形成了一种新的电商生态。 什么是盲盒电商? 盲盒电商是一种电商行业的营销模式,通过发起盲盒活动或拆盲盒,让参与者不…

MongoDB 查询文档(3)

我们之前讲解过,查询文档的语法: db.collection.find(query, projection, options) 其中 query 代表的是查询过滤器,projection 代表的是文档返回的字段,options 代表的是用于查询的其他选项; 我们已经对query进行了…

Ubuntu16.04虚拟机下安装Qt5.10.0

首先安装虚拟机Vmware,具体参见: Win10安装Vmware+Ubuntu16.04_芯片-嵌入式的博客-CSDN博客 安装完成后,下载qt-opensource-linux-x64-5.10.0.run,使用U盘来实现win10和ubuntu虚拟机之间的文件传输,cp到一个目录后,sudo ./qt-opensource-linux-x64-5.10.0.run进行运行,…

I/O多路转接之select

初识select 系统提供select函数来实现多路复用输入/输出模型.* select系统调用是用来让我们的程序监视多个文件描述符的状态变化的; * 程序会停在select这里等待,直到被监视的文件描述符有一个或多个发生了状态改变;select函数原型 select的函数原型如下: #include …

SpringCloud 使用sentinel

一、添加依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> 二、配置文件配置地址 spring:cloud:sentinel:transport:dashboard: localhost:8080三…

【CSS】课程网站 网格商品展示 模块制作 ① ( 网格商品展示模块盒子模型测量及样式 | 顶部文本标题盒子测量及样式 | 代码示例 )

文章目录一、网格商品展示模块盒子模型测量及样式1、盒子尺寸测量2、标题盒子尺寸测量和样式3、左侧文本盒子尺寸测量和样式4、右侧文本盒子尺寸测量和样式二、顶部文本标题盒子代码示例1、HTML 标签结构2、CSS 样式3、展示效果绘制矩形框中的部分 : 一、网格商品展示模块盒子…

【服务器数据恢复】NTFS分区被格式化如何恢复数据?

服务器数据恢复环境&故障&#xff1a; 误操作格式化服务器RAID5磁盘阵列下的分区&#xff08;NTFS文件系统&#xff09;。 服务器数据恢复过程&#xff1a; 1、将故障服务器连接到北亚企安备份服务器上&#xff0c;将故障服务器的所有硬盘设置为脱机状态&#xff0c;然后以…

什么是中间件?

一、什么是中间件&#xff1f; 1、百度百科 中间件是介于应用系统和系统软件之间的一类软件&#xff0c;它使用系统软件所提供的基础服务&#xff08;功能&#xff09;&#xff0c;衔接网络上应用系统的各个部分或不同的应用&#xff0c;能够达到资源共享、功能共享的目的。目…

手写简易 Spring(二)

文章目录手写简易 Spring&#xff08;二&#xff09;1. 扩展 BeanFactory 接口2. 实现资源加载器&#xff0c;从 Spring.xml 解析和注册 Bean 对象1. 核心实现类 XmlBeanDefinitionReader3. 实现应用上下文&#xff0c;自动识别、资源加载、扩展机制1. 应用上下文2. 核心实现类…

java基础之抽象类与接口

文章目录1.抽象方法和抽象类2.抽象类的作用3.接口4.接口和抽象类的异同5.面向接口编程1.抽象方法和抽象类 抽象方法和抽象类必须使用abstract修饰符来定义&#xff0c;有抽象方法的类只能被定义成抽象类&#xff0c;抽象类里可以没有抽象方法。 抽象类必须使用abstract修饰符来…

【Redis学习】Redis入门概述

Redis是什么 Redis:REmote Dictionary Server(远程字典服务器) 官网介绍&#xff1a;The open source, in-memory data store used by millions of developers as a database, cache, streaming engine, and message broker.&#xff08;被数百万开发人员用作数据库、缓存、流…

在云服务部署前后端以及上传数据库

1.上传数据库(sql文件) 首先建立一个目录&#xff0c;用于存放要部署的sql文件&#xff0c;然后在此目录中进入mysql 进入后建立一个数据库&#xff0c;create database 数据库名 完成后&#xff0c;通过select * from 表名可以查到数据说明导入成功。 2.部署Maven后端 将Ma…

【预处理和程序环境】

预处理和程序环境一、程序的翻译环境和执行环境二、详解编译链接三、#define1. #define定义标识符2. #define定义宏3. #define的替换规则4. #和##4.1 #的使用4.2 ##的使用四、宏和函数对比五、条件编译一、程序的翻译环境和执行环境 我们的代码写完后称为源代码&#xff0c;源…

如何正确配置美国网络服务器?

在使用美国网络服务器时&#xff0c;充分注意其配置对于确保服务器和网络的性能、稳定性和安全性至关重要。网络服务器配置是指设置和配置网络服务器的硬件和软件以使其启动和运行的过程。它涉及多个步骤&#xff0c;包括配置操作系统、网络协议、安全设置、用户访问、共享资源…

linux驱动开发 - 01_字符设备驱动开发

文章目录字符设备驱动开发1. 字符设备驱动简介2 字符设备驱动开发步骤2.1 驱动模块的加载和卸载2.2 字符设备注册与注销2.3 实现设备的具体操作函数2.4 添加 LICENSE 和作者信息3 Linux 设备号3.1 设备号的组成3.2 设备号的分配4 chrdevbase 字符设备驱动开发实验4.1 实验程序编…

QT 之基础(一) 详解UI文件设计与运行机制

一、项目文件组成 1.1 创建一个项目文件 建立好项目如下 &#xff08;1&#xff09;项目组织文件【untitled.pro】 存储项目设置文件 QT core gui //表示项目中添加core gui模块 greaterThan(QT_MAJOR_VERSION, 4): QT widgets //条件执行语句&#xf…

【消息队列】聊一下如何避免消息的重复消费

什么是重复消费 一条消息在传输过程中&#xff0c;为了保证消息的不丢失&#xff0c;可能会多少量的消息进行重试&#xff0c;这样就可能导致Broker接受到的消息出现重复&#xff0c;如果说下游系统没有针对业务上的处理&#xff0c;那么可能导致同一笔借款或者支付订单出现重…

【Java多线程基础】Java线程的状态及主要转换方法

借鉴文献&#xff1a; 深入浅出Java多线程 注&#xff1a;《深入浅出Java多线程》是一本书&#xff0c;小编看的是它的 pdf&#xff0c;上面那个网页和书中内容是一致的。小编在起初学习多线程的时候是通过看视频的形式&#xff0c;学的模模糊糊的&#xff0c;这本书感觉很适合…

商务车改装后,有哪些情况会导致异响?

一、开车时出现了异响&#xff0c;主要由这些情况导致。&#xff08;1&#xff09;像商务车&#xff0c;二排基本都升级成了航空座椅&#xff0c;可能是出厂就有问题&#xff0c;拼接处没做好&#xff0c;导致座椅来回磨蹭。另外固定航空座椅螺丝没拧好&#xff0c;车子开动后会…