使用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