首页 > 其他分享 >Manim基础

Manim基础

时间:2024-09-07 23:50:14浏览次数:10  
标签:动画 play square 0.5 self 基础 circle Manim

在这里插入图片描述

使用winget安装manim环境

winget install python
winget install ffmpeg
python -m pip install manim

如果还需要利用 Manim 的 LaTeX 接口来渲染方程,还必须安装 LaTeX。

快速开始

先创建一个项目目录,将文件夹命名为project:

该文件夹是项目的根文件夹。它包含 Manim 运行所需的所有文件,以及项目产生的输出。

-project/

在project文件夹下新建python文件scene.py

# 导入Manim库中的所有内容
from manim import *

# 定义一个名为CreateCircle的场景类,继承自Scene
class CreateCircle(Scene):
    # construct方法是Scene类中的核心方法,用于定义场景中的内容和动画
    def construct(self):
        # 创建一个圆形对象
        circle = Circle()
        # 设置圆形的填充颜色为粉色(PINK),透明度为0.5
        circle.set_fill(PINK, opacity=0.5)
        # 播放创建圆形的动画
        self.play(Create(circle))

使用命令行将路径切换到project文件夹下,使用命令:

manim -pql scene.py CreateCircle

Manim将输出渲染信息,然后创建MP4文件。默认输出 MP4 文件,并显示输出视频。

在这里插入图片描述

方形转换为圆形

# 定义一个名为SquareToCircle的场景类,继承自Scene
class SquareToCircle(Scene):
    # 构造方法,定义场景中要展示的内容
    def construct(self):
        # 创建一个圆形对象
        circle = Circle()
        # 设置圆形的填充颜色为粉色,透明度为0.5
        circle.set_fill(PINK, opacity=0.5)

        # 创建一个正方形对象
        square = Square()
        # 将正方形旋转π/4弧度(即45度)
        square.rotate(PI / 4)

        # 播放创建正方形的动画
        self.play(Create(square))
        # 播放将正方形变形为圆形的动画
        self.play(Transform(square, circle))
        # 播放正方形(现在形状为圆)淡出的动画
        self.play(FadeOut(square))

打开sence.py 文件将SquareToCircle类添加到文件中,然后执行:

manim -pql scene.py SquareToCircle

会看到一个方形旋转后转换为一个圆形

定位

打开scene.py添加SquareAndCircle类:

# 定义一个名为 SquareAndCircle 的场景类,继承自 Manim 的 Scene 类
class SquareAndCircle(Scene):
    # construct 方法是场景的主要方法,Manim 会自动调用它来构建和展示动画
    def construct(self):
        # 创建一个圆形对象
        circle = Circle()
        # 设置圆的填充颜色为粉色(PINK),透明度为 0.5(半透明)
        circle.set_fill(PINK, opacity=0.5)

        # 创建一个正方形对象
        square = Square()
        # 设置正方形的填充颜色为蓝色(BLUE),透明度为 0.5(半透明)
        square.set_fill(BLUE, opacity=0.5)

        # 将正方形放置在圆的右侧,中间留有 0.5 单位的间隔
        # RIGHT 表示放在右边,buff=0.5 设置间隔为 0.5 个单位
        square.next_to(circle, RIGHT, buff=0.5)

        # 使用 play 方法同时创建(显示)圆和正方形
        # Create 是一个动画效果,会让对象逐渐出现在屏幕上
        self.play(Create(circle), Create(square))

运行 manim -pql scene.py SquareAndCircle得到:

使用.animate语法为方法制作动画

同样的在scene.py中添加以下代码:

# 定义一个名为 AnimatedSquareToCircle 的场景类,继承自 Manim 的 Scene 类
class AnimatedSquareToCircle(Scene):
    # construct 方法是场景的主要方法,Manim 会自动调用它来构建和展示动画
    def construct(self):
        # 创建一个圆形对象
        circle = Circle()
        # 创建一个正方形对象
        square = Square()

        # 使用 play 方法显示正方形
        # Create 是一个动画效果,会让正方形逐渐出现在屏幕上
        self.play(Create(square))

        # 旋转正方形
        # square.animate 用于创建动画
        # rotate(PI / 4) 表示旋转 45 度(π/4 弧度)
        self.play(square.animate.rotate(PI / 4))

        # 将正方形变形为圆形
        # Transform 是一个变形动画,会将 square 平滑地变形为 circle 的形状
        self.play(Transform(square, circle))

        # 为变形后的图形(现在是圆形)设置颜色和透明度
        # set_fill(PINK, opacity=0.5) 设置填充颜色为粉色,透明度为 0.5
        self.play(
            square.animate.set_fill(PINK, opacity=0.5)
        )

执行 manim -pql scene.py AnimatedSquareToCircle

你还可以发挥自己的想象,创建出你自己的动画:

class AnimateExample(Scene):
    def construct(self):
        # 创建一个正方形
        square = Square(color=BLUE)
        self.add(square)
        
        # 使用 .animate 移动正方形
        self.play(square.animate.shift(RIGHT * 2))
        
        # 使用 .animate 改变颜色和大小
        self.play(square.animate.set_color(RED).scale(2))
        
        # 链式调用多个动画
        self.play(
            square.animate
                .rotate(PI/2)
                .set_color(GREEN)
                .scale(0.5)
                .move_to(LEFT * 2)
        )

        # 创建一个圆
        circle = Circle()
        self.add(circle)
        
        # 使用 .animate 改变颜色
        self.play(circle.animate.set_color(YELLOW))
        
        # 再次使用 .animate 改变颜色
        self.play(circle.animate.set_color(BLUE))

执行 manim -pql scene.py AnimateExample

输出设置

每次生成动画时都要在manim后面跟一个-pql参数,那么这些参数是什么意思呢?

-ql(low quality)代表低画质,如果想要生成高画质视频可是使用-qh(high quality)
-p代表渲染完后立即播放,去掉该参数后,视频渲染完后不会自动播放
-f 如果将-p换为-f ,渲染完成后会自动打开输出视频的目录
默认情况下,manim输出的是mp4文件,如果希望输出.gif文件可以使用 –format gif

例如使用高画质渲染的gif图片,在渲染完不自动播放但打开输出文件夹的命令为:
manim -fqh scene.py CreateCircle --format gif
在这里插入图片描述

使用不同的输出参数,视频的输出路径也会响应的改变

project/
├─scene.py
└─media
  ├─videos
  | └─scene
  |   ├─480p15
  |   | └─QuadraticFunctionAndDerivative
  |   └─1080p60
  |     └─QuadraticFunctionAndDerivative
  ├─text
  └─Tex

可以使用下面的代码对比不同画质的区别


```python
class QuadraticFunctionAndDerivative(Scene):
    def construct(self):
        # 创建坐标系
        axes = Axes(
            x_range=[-4, 4, 1],
            y_range=[-2, 8, 1],
            axis_config={"color": BLUE},
            x_axis_config={"numbers_to_include": range(-3, 4)},
            y_axis_config={"numbers_to_include": range(-1, 8)}
        )
        axes_labels = axes.get_axis_labels(x_label="x", y_label="y")

        # 创建二次函数 f(x) = x^2
        def func(x):
            return x**2

        graph = axes.plot(func, color=YELLOW)
        func_label = MathTex("f(x) = x^2").next_to(graph, UR).set_color(YELLOW)

        # 创建导数函数 f'(x) = 2x
        def deriv(x):
            return 2*x

        deriv_graph = axes.plot(deriv, color=GREEN)
        deriv_label = MathTex("f'(x) = 2x").next_to(deriv_graph, UR).set_color(GREEN)

        # 创建动点和切线
        dot = Dot(color=RED)
        dot.move_to(axes.c2p(0, 0))
        line = always_redraw(lambda: axes.get_secant_slope_group(
            x=dot.get_center()[0], graph=graph, dx=0.01, secant_line_color=RED, secant_line_length=3
        ))

        # 动画序列
        self.play(Create(axes), Create(axes_labels))
        self.play(Create(graph), Write(func_label))
        self.wait()

        self.play(Create(dot))
        self.play(Create(line))
        self.wait()

        self.play(dot.animate.move_to(axes.c2p(3, 9)), run_time=3)
        self.wait()

        self.play(Create(deriv_graph), Write(deriv_label))
        self.wait()

        # 创建面积
        area = axes.get_area(graph, [0, 2], bounded_graph=deriv_graph, color=BLUE, opacity=0.3)
      
        area_text = MathTex(r"\int_0^2 f'(x) dx").next_to(area, UP)

        self.play(Create(area), Write(area_text))
        self.wait()

        # 最后的动画:显示积分结果
        result_text = MathTex("= f(2) - f(0) = 4").next_to(area_text, RIGHT)
        self.play(Write(result_text))
        self.wait(2)

分别执行
manim -qh scene.py QuadraticFunctionAndDerivative

manim -ql scene.py QuadraticFunctionAndDerivative
可以在输出文件夹下找到两种不同画质的视频

在这里插入图片描述

章节

next_section()方法的作用是将动画序列分割成不同的部分或章节。这对于创建复杂的、有结构的动画非常有用,特别是想要将动画分成逻辑上独立的片段时。

def construct(self):
    # 第一部分的动画
    self.next_section()
    # 第二部分的动画
    # next_section()方法可以接受一个可选的字符串参数,用作该部分的名称:
    self.next_section("几何变换")
    # 也可以添加参数,使得跳过渲染某章节下所有的动画
    self.next_section(skip_animations=True)
from manim import *

class SectionExample(Scene):
    def construct(self):
        # 自动创建的第一部分
        circle = Circle()
        self.play(Create(circle))
        
        self.next_section("方块变换")
        square = Square()
        self.play(Transform(circle, square))
        
        self.next_section("颜色变化")
        self.play(square.animate.set_color(RED))
        
        self.next_section("这部分将被移除")
        # 没有动画,这部分会被自动移除
        
        self.next_section("缩放效果")
        self.play(square.animate.scale(0.5))

每个部分至少需要一个动画。如果某一章节没有动画,则该章节不会被渲染到输出的视频中。

标签:动画,play,square,0.5,self,基础,circle,Manim
From: https://blog.csdn.net/niubikls/article/details/142006126

相关文章

  • 零基础学习地平线 征程6 QAT 量化感知训练
    1.背景首先感谢地平线工具链用户手册和官方提供的示例,给了我很大的帮助,特别是代码注释写了很多的知识点,超赞!要是注释能再详细点,就是超超赞了!下面开始正文。最近想着学QAT(量化感知训练)玩玩,大体看了一下地平线的用户手册,不说精度调优之类比较复杂的,光一个QAT上手,就感觉对我......
  • 20240911_170441 公共基础 线性表
    什么是线性表线性表的基本特征线性表的示例graphLR3-->1-->2-->4......
  • 多媒体应用设计师备考考点讲解(一):多媒体技术基础
    多媒体应用设计师备考考点讲解(一):多媒体技术基础在准备多媒体应用设计师的软考时,理解多媒体技术基础是非常关键的。这篇文章将详细讲解多媒体技术的基本概念和原理,包括多媒体的定义、常见的多媒体元素、数据表示方式、压缩技术以及应用场景。文章还将结合实际的代码示例,帮助读者理解......
  • 20240907_221939 公共基础 列表
    20240826_222457公共基础算法的概念_13127233的技术博客_51CTO博客https://blog.51cto.com/u_13137233/1184633920240826_222637公共基础算法的特征_13127233的技术博客_51CTO博客https://blog.51cto.com/u_13137233/1184637520240826_222817公共基础算法设计基本方法_13......
  • Docker基础与基本概念
    docker与传统虚拟机的架构对比传统的虚拟机在宿主OS上运行Hypervisor,在Hypervisor上运行虚拟操作系统如RHEL,CentOS等。应用App是运行在虚拟操作系统上的。容器在宿主OS上运行DockerEngine,而应用App是直接运行在DockerEngine上的。容器上运行的App与宿主OS共享硬件资源,如......
  • Mininet MAC地址学习:通过Mininet模拟二层交换机和两个主机,通过两个主机通信来了解交换
    一.MAC地址学习1.登录我们创建mininet的虚拟机,创建一个线型拓扑,控制器设置为无。2.查看全部节点,查看链路信息,然后查看节点信息3.再打开一个终端(Terminal窗口2),然后打开交换机s1和交换机s2的二层(因为交换机s1和交换机s2是两个SDN交换机,在启动Mininet时没有指定任何控制器,交......
  • Zabbix01 Zabbix安装和基础功能
    商业监控方案#从各个地区来监测网络情况http://ping.chinaz.com/站长之家免费https://www.jiankongbao.com/监控宝...#云服务自带云监控系统 Zabbix架构#zabbixweb为php程序如果公司规模小,zabbixserver,db和zabbixweb装在一台机器上如果公司规模......
  • 【赛后反思】洛谷基础赛 #15 &「LAOI」Round 6 考后总结(待补完)
    LGR-198-Div.3考后总结又要掉分了:展开目录目录LGR-198-Div.3考后总结A[太阳]]请使用最新版手机QQ体验新功能-100ptsBRadiation-100ptsC区间测速-50ptsDYetAnotherGraphColorationProblem-5ptsA[太阳]]请使用最新版手机QQ体验新功能-100pts因为实际上要截......
  • Uniapp核心基础(一)
    特点uni-app是一个使用Vue.js开发所有前端应用的框架,它允许开发者编写一套代码,然后发布到iOS、Android、Web(响应式)、以及各种小程序(如微信、支付宝、百度、头条等)等多个平台。以下是对uni-app核心基础的详细解析:一、核心特性跨平台开发:uni-app的最大特点是跨平台,一套代码可发布到iO......
  • 零基础上手WebGIS+智慧校园实例(长期更新#2)【html by js】
    请点个赞+收藏+关注支持一下博主喵!!!等下再更新一下1.WebGIS矢量图形的绘制(超级详细!!),2.WebGIS计算距离,以及智慧校园实例with3个例子!!!!,尽情期待!!!之后代码+资料全部发到github里,希望大家能关注一下咱的Github进行WebGIS开发时,引入API是一个关键步骤,它允许开发者将地图服务和功......