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

相关文章

Python远程控制MySQL的完整指南

《Python远程控制MySQL的完整指南》MySQL是最流行的关系型数据库之一,Python通过多种方式可以与MySQL进行交互,下面小编就为大家详细介绍一下Python操作MySQL的常用方法和最... 目录1. 准备工作2. 连接mysql数据库使用mysql-connector使用PyMySQL3.

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

MySQL精准控制Binlog日志数量的三种方案

《MySQL精准控制Binlog日志数量的三种方案》作为数据库管理员,你是否经常为服务器磁盘爆满而抓狂?Binlog就像数据库的“黑匣子”,默默记录着每一次数据变动,但若放任不管,几天内这些日志文件就... 目录 一招修改配置文件:永久生效的控制术1.定位my.cnf文件2.添加核心参数不重启热更新:高手应

双系统电脑中把Ubuntu装进外接移动固态硬盘的全过程

《双系统电脑中把Ubuntu装进外接移动固态硬盘的全过程》:本文主要介绍如何在Windows11系统中使用VMware17创建虚拟机,并在虚拟机中安装Ubuntu22.04桌面版或Ubunt... 目录一、首先win11中安装vmware17二、磁盘分区三、保存四、使用虚拟机进行系统安装五、遇见的错误和解决

使用FileChannel实现文件的复制和移动方式

《使用FileChannel实现文件的复制和移动方式》:本文主要介绍使用FileChannel实现文件的复制和移动方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录使用 FileChannel 实现文件复制代码解释使用 FileChannel 实现文件移动代码解释

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

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

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

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

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