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

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

我在移动打工的日志

客户:给我搞一下录音 我:不会。不在服务范围。 客户:是不想吧 我:笑嘻嘻(气笑) 客户:小姑娘明明会,却欺负老人 我:笑嘻嘻 客户:那我交话费 我:手机号 客户:给我搞录音 我:不会。不懂。没搞过。 客户:那我交话费 我:手机号。这是电信的啊!!我这是中国移动!! 客户:我不管,我要充话费,充话费是你们的 我:可是这是移动!!中国移动!! 客户:我这是手机号 我:那又如何,这是移动!你是电信!!

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class Move : MonoBehaviour // 定义一个名为Move的类,继承自MonoBehaviour{private Rigidbo

控制反转 的种类

之前对控制反转的定义和解释都不是很清晰。最近翻书发现在《Pro Spring 5》(免费电子版在文章最后)有一段非常不错的解释。记录一下,有道翻译贴出来方便查看。如有请直接跳过中文,看后面的原文。 控制反转的类型 控制反转的类型您可能想知道为什么有两种类型的IoC,以及为什么这些类型被进一步划分为不同的实现。这个问题似乎没有明确的答案;当然,不同的类型提供了一定程度的灵活性,但

简单的角色响应鼠标而移动

actor类 //处理移动距离,核心是找到角色坐标在世界坐标的向量的投影(x,y,z),然后在世界坐标中合成,此CC是在地面行走,所以Y轴投影始终置为0; using UnityEngine; using System.Collections; public class actor : MonoBehaviour { public float speed=0.1f; CharacterCo

深入解析秒杀业务中的核心问题 —— 从并发控制到事务管理

深入解析秒杀业务中的核心问题 —— 从并发控制到事务管理 秒杀系统是应对高并发、高压力下的典型业务场景,涉及到并发控制、库存管理、事务管理等多个关键技术点。本文将深入剖析秒杀商品业务中常见的几个核心问题,包括 AOP 事务管理、同步锁机制、乐观锁、CAS 操作,以及用户限购策略。通过这些技术的结合,确保秒杀系统在高并发场景下的稳定性和一致性。 1. AOP 代理对象与事务管理 在秒杀商品

PostgreSQL中的多版本并发控制(MVCC)深入解析

引言 PostgreSQL作为一款强大的开源关系数据库管理系统,以其高性能、高可靠性和丰富的功能特性而广受欢迎。在并发控制方面,PostgreSQL采用了多版本并发控制(MVCC)机制,该机制为数据库提供了高效的数据访问和更新能力,同时保证了数据的一致性和隔离性。本文将深入解析PostgreSQL中的MVCC功能,探讨其工作原理、使用场景,并通过具体SQL示例来展示其在实际应用中的表现。 一、

vue2实践:el-table实现由用户自己控制行数的动态表格

需求 项目中需要提供一个动态表单,如图: 当我点击添加时,便添加一行;点击右边的删除时,便删除这一行。 至少要有一行数据,但是没有上限。 思路 这种每一行的数据固定,但是不定行数的,很容易想到使用el-table来实现,它可以循环读取:data所绑定的数组,来生成行数据,不同的是: 1、table里面的每一个cell,需要放置一个input来支持用户编辑。 2、最后一列放置两个b

【电机控制】数字滤波算法(持续更新)

文章目录 前言1. 数字低通滤波 前言 各种数字滤波原理,离散化公式及代码。 1. 数字低通滤波 滤波器公式 一阶低通滤波器的输出 y [ n ] y[n] y[n] 可以通过以下公式计算得到: y [ n ] = α x [ n ] + ( 1 − α ) y [ n − 1 ] y[n] = \alpha x[n] + (1 - \alpha) y[n-1]

物联网之流水LED灯、正常流水灯、反复流水灯、移动流水灯

MENU 硬件电路设计软件程序设计正常流水LED灯反复流水LED灯移动流水LED灯 硬件电路设计 材料名称数量直插式LED1kΩ电阻杜邦线(跳线)若干面包板1 每一个LED的正极与开发板一个GPIO引脚相连,并串联一个电阻,负极接GND。 当然也可以选择只使用一个电阻。 软件程序设计 正常流水LED灯 因为要用到多个GPIO引脚,所以最好把所有的GPI