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

news2024/11/16 13:41:04

一,介绍

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

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

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

示例代码:

缓动函数(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 =WHITE
        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(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()

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TCP协议中断开连接机制

目录 客户端与服务端四次挥手 关于TIME_WAIT状态 为什么TIME_WAIT状态等待的时间是2MSL? 客户端与服务端四次挥手 基于TCP协议通信的客户端与服务端断开连接就要进行四次挥手,如下图: 四次挥手过程中客户端与服务端状态转化: …

Rocm-Programming with HIP 内存分配

1. 主机内存(Host Memory) hipHostMalloc 是 HIP API 中的一个函数,它用于在主机上分配特殊的内存,这种内存被称为 "pinned" 或 "page-locked" 内存。这种内存有以下特点和用途: GPU 地址空间映射…

SD6201 同步增压DC/DC调节器芯片IC

一般描述 SD6201是高效率同步、PWM升压型DC/DC转换器,专为中型功率系统提供高效率解决方案而优化。该器件在0.9 V至4.4V的输入电压下工作,开关频率为1.4 MHz。这些功能允许使用微小、低剖面的电感和陶瓷电容器,从而最大限度地减少了整…

LivePortrait模型构建指南

一、介绍 快手可灵大模型团队开源了名为 LivePortrait 的可控人像视频生成框架,能够准确、实时地将驱动视频的表情、姿态迁移到静态或动态人像视频上,生成极具表现力的视频结果。该项目的模型产生了定性肖像动画,只要输入一张静态的肖像图像…

多线程面试常问

一、创建线程的几种方式 1、继承Thread类并重写run()方法。 public class MyThread extends Thread {Overridepublic void run() {System.out.println("通过集成 Thread 类实现线程"); } } // 如何使用 new MyThread().start() 2、实现Runnable接口并重写run()方法…

deepin(深度)社区亮相2024 RISC-V中国峰会,全力推动RISC-V生态发展

8月21日—23日,全球三大RISC-V专业展会之一、国内最大的RISC-V年度盛会——2024 RISC-V中国峰会于浙江杭州盛大召开!deepin(深度)社区携手合作伙伴出席峰会,与国内外业界专家、企业代表、研究机构及社区伙伴&#xff0…

python如何通过Json路径返回Json响应对应的值例子解析

在Python中,处理JSON数据通常使用标准库中的json模块来解析和操作JSON格式的数据。如果你想要通过JSON路径来获取JSON响应中的值,你可以使用第三方库,如jsonpath-ng,它允许你使用类似XPath的语法来查询JSON对象。 首先&#xff0…

mysql读写分离(mysql路由)

mysql路由 1. server4路由主机操作 rpm -ivh mysql-router-community-8.0.21-1.el7.x86_64.rpm # 安装路由工具 cd /etc/mysqlrouter/ vim mysqlrouter.conf # 配置文件# 均摊 [routing:ro] bind_address 0.0.0.0 bind_port 7001 destinations 192.168.228.11:3306,192.168…

LLM自对齐技术最新研究分享(一):对齐 Pipeline 数据合成(上)

欢迎关注 OpenMMLab 公众号获取一手技术干货 当我们向 ChatGPT 提问时,我们希望他能准确地回答我们的问题。当我们向他提出不合理的要求,比如询问如何制作炸弹或者如何考试作弊,我们希望他能拒绝回答并及时纠正我们的错误。AI 对齐&#xff0…

GAMES104:09高级动画技术:动画树、IK和表情动画-学习笔记

文章目录 一,动画混合1.1 数学混合:线性插值1.2 混合空间Blend Space1.2.1 1D Blend Space1.2.2 2D Blend Space1.2.3 Skeleton Masked Blending骨骼遮罩混合1.2.4 Addictive Blending 二,动画状态机Animation State Machine(ASM&…

JMeter之插件jp@gc - Stepping Thread Group

文章目录 业务场景核心功能安装教程常规使用 业务场景 在性能测试中,希望jemter能动态设置线程数,并且线程数量能从低到高依次压测接口,比如线程数量从10增加到50,通过设定一定的并发线程数,给定加压规则,遵…

并发服务器

服务器,后台服务软件,后端开发,为软件客户端提供支持,数据支持,存储支持,数据中转 高并发要求,随着用户数量的增长,服务器的设计结构扩展,为更多用户提供服务器。 Web服…

深入了解:浅拷贝深拷贝

浅拷贝和深拷贝 在java中 理解深拷贝和浅拷贝的概念对于处理对象复制时 保持数据的一致性和独立性至关重要 这两种拷贝方式主要区别在于它们如何处理对象内部的引用类型成员变量 在学习浅拷贝和深拷贝前 我们要区分 对象引用 和 对象本身的区别 对象引用:在Java中…

线上考试系统---虚拟化技术部署

部署前端服务器 1.将资源上传到服务器 scp -r dist/ root192.168.1.50:~2.在服务器上创建基础容器 [rootdocker0 ~]# docker run -it --name c0 centos:latest /bin/bash [rootc1092b8c9ce5 /]# [rootdocker0 ~]# [rootdocker0 ~]# docker attach c0 3.在容器中修改yum源 …

Using Managed Identity to Access Azure OpenAI Service

题意:使用托管身份访问 Azure OpenAI 服务 问题背景: Im working with Azure OpenAI service, and want to test its Managed Identity support. According to the docs it supports Managed Identity authentication, for example - using a VM. 我正…

鸿蒙界面开发(四):支付宝首页开发实战

利用了层叠布局和一个scroll滚动组件。 包括底部导航、顶部导航、主体的滚动窗口。 主体的滚动窗口又包括一个快捷导航栏和一个导航窗口、以及主体部分 import text from ohos.graphics.text;Entry Component struct Index {State message: string Hello World;//支付宝首页b…

全网最最最详细的企业级WEB应用服务器TOMCAT

目录 一:tomcat的介绍 Tomcat请求过程 实验部分: 1:安装 Tomcat 1.1:安装java环境 1.2:安装并启动tomcat 1.3: 查看端口 1.4:浏览器访问以下试试 2:tomcat的文件结构和组成 3&…

高性能web服务器4——Nginx反向代理A

Nginx 反向代理 Nginx 的反向代理功能是其最强大的特性之一,它允许 Nginx 作为中间层来接收客户端的请求,并将这些请求转发到后端服务器。这种架构不仅可以提高安全性,还可以实现负载均衡、缓存和内容过滤等功能。本文将详细介绍 Nginx 反向…

【neo4j】neo4j-Desktop安装

Neo4j是一个高性能的图数据库,它使用图形结构来存储和处理数据。它是一个开源的、完全事务的数据库,专门设计用于大规模的图形数据。Neo4j使用一种名为Cypher的查询语言来处理图形数据,使用户能够方便地进行复杂的图形查询和分析。 Neo4j的主…

AIGC 大模型:实践与未来

一、AIGC 大模型的概念与发展 (一)AIGC 大模型的定义与特点 AIGC(AI Generated Content)大模型是一种基于大规模数据训练的人工智能模型,具备强大的内容生成能力和多模态交互能力。它能够理解和处理多种类型的信息&a…