在数学教育和可视化领域,能够清晰展示数学概念的动态过程是非常有价值的。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之旅吧!