manim:用Python创建令人惊叹的数学动画

在数学教育和可视化领域,能够清晰展示数学概念的动态过程是非常有价值的。Grant Sanderson(也就是YouTube频道3Blue1Brown的创建者)开发的manim库,为我们提供了一个强大的工具来创建高质量的数学动画。今天,我将分享三个基本示例,帮助你开始使用这个令人惊叹的库。

安装manim

在开始之前,需要安装manim库。可以使用pip来完成:

bash

Apply to 3d_example.p...

Run

python -m pip install manim

如果想要完整功能,还需要安装以下依赖:

  • LaTeX(用于渲染数学公式)
  • ffmpeg(用于音频和视频处理)

示例一:简单形状变换

第一个示例展示了manim最基础的功能 - 形状变换。我们将一个蓝色正方形变形为红色圆形: 

2d

Apply to 3d_example.p...

from manim import *

class SquareToCircle(Scene):

    def construct(self):

        # 创建一个正方形

        square = Square(color=BLUE, fill_opacity=0.5)

        

        # 创建一个圆形

        circle = Circle(color=RED, fill_opacity=0.5)

        

        # 添加正方形到场景

        self.play(Create(square))

        

        # 将正方形变成圆形

        self.play(Transform(square, circle))

        

        # 等待两秒

        self.wait(2)

这段代码创建了一个简单而优雅的动画:首先显示一个蓝色半透明正方形,然后平滑地将其变形为红色圆形。这种基础变换是许多复杂动画的构建基块。

示例二:正弦波函数可视化

sin1

第二个示例更进一步,展示了如何创建函数图像并添加动态元素:

Apply to 3d_example.p...

import numpy as np

from manim import *

class Sin(Scene):

    def construct(self):

        # 创建坐标轴

        axes = Axes(

            x_range=[-3, 3, 1],

            y_range=[-1.5, 1.5, 0.5],

            axis_config={"color": BLUE},

            x_length=10,

            y_length=6

        )

        

        # 添加标签

        x_label = Text("x").next_to(axes.x_axis, DOWN)

        y_label = Text("sin(x)").next_to(axes.y_axis, LEFT)

        

        # 创建正弦函数图像

        sin_graph = axes.plot(lambda x: np.sin(x), color=RED)

        sin_label = Text("sin(x)").next_to(sin_graph, UP).set_color(RED)

        

        # 逐步展示各个元素

        self.play(Create(axes), Write(x_label), Write(y_label))

        self.wait(1)

        self.play(Create(sin_graph), Write(sin_label))

        self.wait(1)

        

        # 添加跟踪点

        dot = Dot(color=YELLOW)

        dot.move_to(axes.c2p(0, 0))

        self.play(FadeIn(dot))

        

        # 沿着曲线移动点

        self.play(

            MoveAlongPath(dot, sin_graph), 

            run_time=3, 

            rate_func=linear

        )

        self.wait(1)

        

        # 变换为余弦函数

        cos_graph = axes.plot(lambda x: np.cos(x), color=GREEN)

        cos_label = Text("cos(x)").next_to(cos_graph, UP).set_color(GREEN)

        

        self.play(

            Transform(sin_graph, cos_graph),

            Transform(sin_label, cos_label)

        )

        self.wait(2)

这个示例展示了如何:

创建自定义坐标系

绘制函数图像

添加标签

创建一个点沿着曲线运动的动画

将正弦函数变换为余弦函数

这种动画非常适合教学,因为它能帮助学生直观理解函数的形状和行为。

示例三:3D场景探索

manim的强大之处还在于它能创建复杂的3D场景。以下是一个3D示例

3d

Apply to 3d_example.p...

from manim import *

class ThreeDExample(ThreeDScene):

    def construct(self):

        # 配置三维场景

        self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)

        

        # 创建三维坐标轴

        axes = ThreeDAxes()

        axis_labels = axes.get_axis_labels(

            x_label=Text("x"), y_label=Text("y"), z_label=Text("z")

        )

        

        # 添加坐标轴

        self.play(Create(axes), Write(axis_labels))

        self.wait(1)

        

        # 创建一个球体

        sphere = Sphere(radius=1, resolution=(20, 20))

        sphere.set_color(BLUE)

        

        # 创建一个立方体

        cube = Cube(side_length=1.5)

        cube.set_color(RED)

        cube.set_opacity(0.5)

        

        # 添加球体并旋转

        self.play(Create(sphere))

        self.wait(1)

        self.play(Rotate(sphere, angle=2*PI, axis=RIGHT))

        self.wait(1)

        

        # 将球体变换为立方体

        self.play(Transform(sphere, cube))

        self.wait(1)

        

        # 移动相机以展示3D效果

        self.begin_ambient_camera_rotation(rate=0.2)

        self.wait(5)

        self.stop_ambient_camera_rotation()

        

        # 创建一个圆柱体代替复杂曲面

        cylinder = Cylinder(radius=1.5, height=3)

        cylinder.set_color(GREEN)

        cylinder.set_opacity(0.7)

        

        # 将立方体变换为圆柱体

        self.play(Transform(sphere, cylinder))

        self.wait(1)

        

        # 再次旋转相机

        self.move_camera(phi=60 * DEGREES, theta=45 * DEGREES)

        self.wait(2)

这个示例展示了manim的3D功能:

设置3D场景和相机角度

创建3D坐标轴

创建并操作3D对象(球体、立方体、圆柱体)

自动旋转相机以展示3D效果

3D对象之间的变换

这种3D可视化对于理解空间几何概念非常有帮助。

运行manim动画

要运行这些动画,我创建了一个简单的批处理文件(run_manim.bat),使运行过程更加简单:

batch

Apply to 3d_example.p...

@echo off

REM Manim运行脚本

IF "%1"=="" (

    echo 使用方法: run_manim.bat [文件名] [场景名] [选项]

    echo 例如: run_manim.bat sin.py Sin -p -ql

    exit /b

)

set FILE=%1

set SCENE=%2

set OPTIONS=%3 %4 %5 %6 %7 %8 %9

echo 正在运行: %FILE% - %SCENE% %OPTIONS%

python -m manim %FILE% %SCENE% %OPTIONS%

使用方法很简单:

text

Apply to 3d_example.p...

run_manim.bat sin.py Sin -p -ql

常用的选项包括:

  • -p: 渲染完成后自动播放视频
  • -s: 生成图片而非视频(最后一帧)
  • -ql: 低质量(480p, 15fps)- 渲染最快
  • -qm: 中等质量(720p, 30fps)
  • -qh: 高质量(1080p, 60fps)- 默认

总结

manim是一个强大的工具,能够创建专业水准的数学动画。通过这三个示例,我们看到了从简单的2D形状变换到复杂的3D场景,manim都能够轻松实现。这些动画不仅美观,而且对于教学和理解数学概念非常有帮助。

无论你是教师、学生还是数学爱好者,manim都能帮助你以全新的方式展示和理解数学概念。希望这篇文章能激发你使用manim创建自己的数学动画!

如果你想了解更多关于manim的信息,可以访问官方文档或者观看3Blue1Brown的YouTube频道,亲眼见证manim的强大功能。

快来尝试这些示例,开始你的manim之旅吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

碳酸的唐

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值