Manim实现目标的移动和出现速度控制

一,介绍

缓动函数 自定义参数随时间变化的速率。 现实生活中,物体并不是突然启动或者停止, 当然也不可能一直保持匀速移动。就像我们 打开抽屉的过程那样,刚开始拉的那一下动作很快, 但是当抽屉被拉出来之后我们会不自觉的放慢动作。 或是掉落在地板上的物体,一开始下降的速度很快, 接着就会在地板上来回反弹直到停止。 这个页面将帮助你选择正确

 速率函数的选择,即动画的速度曲线

接下啦看看非标准的速率函数有那些:

示例代码:

缓动函数(Easing Functions)是用于控制动画过程中对象变化速度的重要工具。它们决定了动画的速率变化,通常以曲线的形式表示。这些函数可以帮助创建更自然和流畅的动画效果。

二,标准缓动函数

线性(Linear):动画的变化速度保持不变,适用于简单的动画。

示例代码:
python">from manim import *class RateFunctions1Example10(Scene):def construct(self):line1 = Line(3*LEFT, 3*RIGHT).shift(UP).set_color(RED)line2 = Line(3*LEFT, 3*RIGHT).set_color(GREEN)line3 = Line(3*LEFT, 3*RIGHT).shift(DOWN).set_color(BLUE)dot1 = Dot().move_to(line1.get_left())dot2 = Dot().move_to(line2.get_left())dot3 = Dot().move_to(line3.get_left())label1 = Tex("Linear").next_to(line1, RIGHT)label2 = Tex("Sigmoid").next_to(line2, RIGHT)label3 = Tex("Smooth").next_to(line3, RIGHT)self.play(FadeIn(VGroup(line1, line2, line3)),FadeIn(VGroup(dot1, dot2, dot3)),Write(VGroup(label1, label2, label3)),)self.play(MoveAlongPath(dot1, line1, rate_func=rate_functions.linear),MoveAlongPath(dot2, line2, rate_func=rate_functions.sigmoid),MoveAlongPath(dot3, line3, rate_func=rate_functions.smooth),run_time=10)self.wait()

二次方缓动(Quad)

  • Ease In:开始慢,之后加速。
  • Ease Out:开始快,随后减速。
  • Ease In Out:开始和结束时慢,中间加速。

标准函数不会导出,因此要使用它们,您可以执行以下操作:

python">rate_func=rate_functions.ease_in_sine

另一方面,比较常用的非标准函数被导出,可以直接使用。

标准速率函数的示例代码:
python">from manim import *class RateFunctions1Example(Scene):def construct(self):self.camera.background_color =WHITEline1 = Line(3*LEFT, 3*RIGHT).shift(UP).set_color(RED)line2 = Line(3*LEFT, 3*RIGHT).set_color(GREEN)line3 = Line(3*LEFT, 3*RIGHT).shift(DOWN).set_color(BLUE)dot1 = Dot(color=BLACK,radius=0.12).move_to(line1.get_left())dot2 = Dot(color=BLACK,radius=0.12).move_to(line2.get_left())dot3 = Dot(color=BLACK,radius=0.12).move_to(line3.get_left())label1 = Tex("Ease In",color=BLACK).next_to(line1, RIGHT)label2 = Tex("Ease out",color=BLACK).next_to(line2, RIGHT)label3 = Tex("Ease In Out",color=BLACK).next_to(line3, RIGHT)self.play(FadeIn(VGroup(line1, line2, line3)),FadeIn(VGroup(dot1, dot2, dot3)),Write(VGroup(label1, label2, label3)),)self.play(MoveAlongPath(dot1, line1, rate_func=rate_functions.ease_in_sine),MoveAlongPath(dot2, line2, rate_func=rate_functions.ease_out_sine),MoveAlongPath(dot3, line3, rate_func=rate_functions.ease_in_out_sine),run_time=7)self.wait()

三次方缓动(Cubic)

  • 动画变化较二次方函数更为明显,同样分为Ease In、Ease Out和Ease In Out。
  • 示例代码
  • python">from manim import *class RateFunctionsCubic(Scene):def construct(self):line1 = Line(3*LEFT, 3*RIGHT).shift(UP).set_color(RED)line2 = Line(3*LEFT, 3*RIGHT).set_color(GREEN)line3 = Line(3*LEFT, 3*RIGHT).shift(DOWN).set_color(BLUE)dot1 = Dot().move_to(line1.get_left())dot2 = Dot().move_to(line2.get_left())dot3 = Dot().move_to(line3.get_left())label1 = Tex("Ease In Cubic").next_to(line1, RIGHT)label2 = Tex("Ease out Cubic").next_to(line2, RIGHT)label3 = Tex("Ease In Out Cubic").next_to(line3, RIGHT,buff=0).scale(0.8)self.play(FadeIn(VGroup(line1, line2, line3)),FadeIn(VGroup(dot1, dot2, dot3)),Write(VGroup(label1, label2, label3)),)self.play(MoveAlongPath(dot1, line1, rate_func=rate_functions.ease_in_cubic),MoveAlongPath(dot2, line2, rate_func=rate_functions.ease_out_cubic),MoveAlongPath(dot3, line3, rate_func=rate_functions.ease_in_out_cubic),run_time=7)self.wait()

指数缓动(Exponential):在动画的初始和结束阶段变化平滑,适合需要快速响应和缓冲的效果。

圆形缓动(Circular):通过圆形路径来实现加速和减速,表现得更为柔和自然。

三,非标准缓动函数

非标准缓动函数通常是开发者自定义的,或是基于标准函数修改而来。它们能够更好地满足特定动画的需求,例如:

  1. 弹性缓动(Elastic):动画像弹簧一样反复震荡,给人一种回弹的感觉。

  2. 回弹缓动(Back):在结束前稍微向外突出一下,再回到目标位置,给人一种“回退”的感觉。

  3. 摩擦缓动(Bounce):模拟弹跳效果,动画到达终点时会有多次回弹的动作。

示例代码:
python">from manim import *class RateFunctionsNOTlinear(Scene):def construct(self):line1 = Line(3*LEFT, 3*RIGHT).shift(UP).set_color(RED)line2 = Line(3*LEFT, 3*RIGHT).set_color(GREEN)line3 = Line(3*LEFT, 3*RIGHT).shift(DOWN).set_color(BLUE)dot1 = Dot().move_to(line1.get_left())dot2 = Dot().move_to(line2.get_left())dot3 = Dot().move_to(line3.get_left())label1 = Tex("Ease In Bounce").next_to(line1, RIGHT)label2 = Tex("Ease out Bounce").next_to(line2, RIGHT)label3 = Tex("Ease In Out Bounce").next_to(line3, RIGHT,buff=0).scale(0.8)self.play(FadeIn(VGroup(line1, line2, line3)),FadeIn(VGroup(dot1, dot2, dot3)),Write(VGroup(label1, label2, label3)),)self.play(MoveAlongPath(dot1, line1, rate_func=rate_functions.ease_in_bounce),MoveAlongPath(dot2, line2, rate_func=rate_functions.ease_out_bounce),MoveAlongPath(dot3, line3, rate_func=rate_functions.ease_in_out_bounce),run_time=7)self.wait()

缓动函数是为了让动画更加生动、真实,适当选择和应用这些函数能够提高用户体验。


http://www.ppmy.cn/news/1516404.html

相关文章

【操作系统】实验:进程死锁

目录 一、实验目的 二、实验要求 三、实验步骤 四、核心代码 五、记录与处理 六、思考 七、完整报告和成果文件提取链接 一、实验目的 1掌握死锁的基本概念; 2理解死锁的必要条件; 3理解避免死锁的方法、安全状态等重要概念; 4了解银…

Windows环境如何安装maven并配置IDEA

运行Springboot项目时,出现了依赖错误,最后排查可能是maven安装出错了。 MAVEN版本要和IDEA版本对应,maven发行版本不能比idea版本高,可以在idea查看内置的maven版本。 点击 File–>Settings,在设置页面搜索maven,如…

2024牛客暑期多校训练营7 D.Interval Selection(异或哈希+双指针)

原题链接:D.Interval Selection 题目大意: 给你一个长度为 n n n 的数组 a a a,定义一个区间 [ l , r ] [l,r] [l,r] 内的连续子数组为好的,当且仅当这个子数组内的所有元素 a l , a l 1 , . . . , a r a_{l},a_{l1},...,a_{…

虚幻5|暴击攻击和释放技能,造成伤害

玩家数据的Actor组件制作:虚幻5|制作玩家血量,体力-CSDN博客 造成伤害时,显示暴击及暴击字体颜色和未暴击的字体颜色,还有释放技能连击 一.编辑暴击数据 1.打开之前创建的玩家数据Actor组件 创建一个浮点变量,命名…

Python实现贪心算法

目录 贪心算法简介贪心算法的基本思想贪心算法的应用场景活动选择问题 Python实现活动选择问题代码解释活动选择问题的解贪心算法的正确性分析贪心算法的其他应用贪心算法的局限性贪心算法的优化与变种总结 贪心算法简介 贪心算法(Greedy Algorithm)是一…

10天速通Tkinter库——Day7:主菜单及图鉴

本篇博客我将介绍Tkinter实践项目《植物杂交实验室》中的杂交实验室主菜单、基础植物图鉴、杂交植物图鉴、杂交植物更多信息四个页面的制作。 它们作为主窗口的子页面实例,除了继承主窗口的基础设置(如图标、标题、尺寸等等)、还可以使用主窗…

使用C++开发黑神话悟空类似3A如何避免内存泄漏

智能指针:使用C11或更高版本中的智能指针(如std::unique_ptr、std::shared_ptr和std::weak_ptr)来自动管理内存。这些智能指针在超出作用域时会自动释放它们所管理的内存。 RAII(Resource Acquisition Is Initialization&#xf…

Java开发程序员职业发展路径

入行阶段:后端 3年 目标 在这一阶段,你将专注于后端开发,特别是Java编程语言及其相关技术栈。 主要任务和技能 掌握Java基础: 理解Java语言的核心概念,如OOP(面向对象编程)、数据结构、算法等。学习后端…

【Rust练习】10.元组

练习题来自:https://practice-zh.course.rs/compound-types/tuple.html 1 元组中的元素可以是不同的类型。元组的类型签名是 (T1, T2, …), 这里 T1, T2 是相对应的元组成员的类型. fn main() {let _t0: (u8,i16) (0, -1);// 元组的成员还可以是一个元组let _t1:…

相关性分析

斯皮尔曼、皮尔逊、肯德尔、点双列相关分析、偏相关分析、距离相关分析、双变量回归分析和互信息。 特性斯皮尔曼相关分析(Spearman Correlation)皮尔逊相关分析(Pearson Correlation)肯德尔相关分析(Kendall’s Tau&…

华为OD题目 csv格式的数据 字符串 用C没写出来

这题对于嵌入式mcu的人来说,太难为了。不想解了,烂摆。有心情再说把。 将一个csv格式的数据文件中包含有单元格引用的内容替换为对应单元格内容的实际值。 Comma seprated values(CSV)逗号分隔值,csv格式的数据文件使用…

nodemon学习(一)简介、安装、配置、使用

nodemon用来监视node.js应用程序中的任何更改并自动重启服务,非常适合用在开发环境中。以前,我们开发一个node后端服务时,每次更改文件,均需重启一下,服务才能生效。这使我们的开发效率降低了很多。nodemon的出现,可以…

Catf1ag CTF Crypto(六)

前言 Catf1agCTF 是一个面向所有CTF(Capture The Flag)爱好者的综合训练平台,尤其适合新手学习和提升技能 。该平台由catf1ag团队打造,拥有超过200个原创题目,题目设计注重知识点的掌握,旨在帮助新手掌握C…

ffmpeg.exe命令行常见应用

基本转换: ffmpeg -i input.mp4 output.avi将input.mp4文件转换为output.avi文件。 提取音频: ffmpeg -i input.mp4 -vn output.mp3从input.mp4文件中提取音频并保存为output.mp3文件。 视频剪辑: ffmpeg -i input.mp4 -ss 00:00:30 -t 00:…

深入探讨Java多线程

我的主页:2的n次方_ 1. 多线程的概念 多线程是指在同一个程序中同时执行多个线程的技术。线程是操作系统能够独立调度和执行的最小单位。在Java中,线程由Thread类来表示,所有的线程都是通过这个类或其子类来创建和控制的。通过合理的多线…

codetop标签动态规划大全C++讲解(上)!!动态规划刷穿地心!!学吐了家人们o(╥﹏╥)o

主要供自己回顾学习,会持续更新,题源codetop动态规划近半年 1.零钱兑换2.零钱兑换II3.面试题08.11.硬币4.单词拆分5.最长递增子序列6.最长递增子序列的个数7.得到山形数组的最少删除次数8.最长公共子序列9.最长重复子数组10.最长等差数列11.最大子数组和…

Docker数据卷使用手册

目录 目标 前言 概念 官方文档 匿名卷(Anonymous Volumes) 简介 案例 命名卷(Named Volumes) 简介 案例 目标 掌握Volume命令通过演示案例,理解数据卷种类与各自的用途。 前言 我们在很多网上教程上可以看到…

前端宝典十:webpack性能优化最佳实践

Webpack 内置了很多功能。 通常你可用如下经验去判断如何配置 Webpack: 想让源文件加入到构建流程中去被 Webpack 控制,配置 entry;想自定义输出文件的位置和名称,配置 output;想自定义寻找依赖模块时的策略&#xff…

云计算day31

⼀、Docker 1、Docker介绍.pdf 1、Docker 是什么? Docker 是⼀个开源的应⽤容器引擎,可以实现虚拟化,完全采⽤“沙 盒”机制,容器之间不会存在任何接⼝。 Docker 通过 Linux Container(容器)技术将任意…

如何在Docker中部署Eureka Server:容器化微服务注册中心

在现代微服务架构中,服务注册和发现是至关重要的。Eureka Server 是一个由 Netflix 开发的开源服务注册和发现工具,它允许微服务实例在运行时动态地注册和查询其他服务。将 Eureka Server 部署在 Docker 中可以提高其可移植性和可维护性,同时…