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

2024-08-26 23:28

本文主要是介绍Manim实现目标的移动和出现速度控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一,介绍

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

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

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

示例代码:

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

二,标准缓动函数

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

示例代码:
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:开始和结束时慢,中间加速。

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

rate_func=rate_functions.ease_in_sine

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

标准速率函数的示例代码:
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。
  • 示例代码
  • 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):模拟弹跳效果,动画到达终点时会有多次回弹的动作。

示例代码:
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()

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

这篇关于Manim实现目标的移动和出现速度控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109985

相关文章

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(

Spring Security注解方式权限控制过程

《SpringSecurity注解方式权限控制过程》:本文主要介绍SpringSecurity注解方式权限控制过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、摘要二、实现步骤2.1 在配置类中添加权限注解的支持2.2 创建Controller类2.3 Us

Python中如何控制小数点精度与对齐方式

《Python中如何控制小数点精度与对齐方式》在Python编程中,数据输出格式化是一个常见的需求,尤其是在涉及到小数点精度和对齐方式时,下面小编就来为大家介绍一下如何在Python中实现这些功能吧... 目录一、控制小数点精度1. 使用 round() 函数2. 使用字符串格式化二、控制对齐方式1. 使用

Springboot控制反转与Bean对象的方法

《Springboot控制反转与Bean对象的方法》文章介绍了SpringBoot中的控制反转(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依赖关系,它详细讲解了Bean的注册过程,包括... 目录1 控制反转1.1 什么是控制反转1.2 SpringBoot中的控制反转2 Ioc容器对Bea

Python重命名文件并移动到对应文件夹

《Python重命名文件并移动到对应文件夹》在日常的文件管理和处理过程中,我们可能会遇到需要将文件整理到不同文件夹中的需求,下面我们就来看看如何使用Python实现重命名文件并移动到对应文件夹吧... 目录检查并删除空文件夹1. 基本需求2. 实现代码解析3. 代码解释4. 代码执行结果5. 总结方法补充在