(一)manim的介绍
manim是博主3b1b开源了一款可以制作数学动画了库,他制作了数学动画风格十分高级
官网代码
form manim import *
class ContinuousMotion(Scene):
def construct(self):
func = lambda pos: np.sin(pos[0] / 2) * UR + np.cos(pos[1] / 2) * LEFT
stream_lines = StreamLines(func, stroke_width=2, max_anchors_per_line=30)
self.add(stream_lines)
stream_lines.start_animation(warm_up=False, flow_speed=1.5)
self.wait(stream_lines.virtual_time / stream_lines.flow_speed)</pre>
官网展示效果
(二)自我学习探索
manim也是支持中文编写了,其中只需要在Text
方法中font
这个参数导入合适的字体文件路径就可以,但是作者参试直接把本地文件字体直接复制过来发现,manim不能直接识别到对应的文件,而作者使用的方法是直接写入Windows的自带字体。
作者方法
font="STKaiti"
(三)完整代码,以及详细分析
from manim import *
class TextToHeartTransform(Scene):
def construct(self):
# 创建汉字文本
text = Text("我是刘健了爸爸,爸爸永远爱你", font="STKaiti", color=RED_D).scale(1)
# 创建爱心图像(使用参数方程绘制爱心)
heart_curve = ParametricFunction(
lambda t: np.array([
16 * np.sin(t) ** 3,
13 * np.cos(t) - 5 * np.cos(2 * t) - 2 * np.cos(3 * t) - np.cos(4 * t),
0
]),
t_range=np.array([0, TAU]),
color=RED
).scale(0.15).move_to(ORIGIN) # 缩放使得爱心大小适合转化
# 先展示汉字文本
self.play(Write(text))
self.wait(1)
# 将汉字转换为爱心图像
self.play(Transform(text, heart_curve))
self.wait(2)</pre>
1. Text()
text = Text("我是刘健了爸爸,爸爸永远爱你", font="STKaiti", color=RED_D).scale(1)
- 功能:创建一个文本对象。
- 参数:
font="STKaiti"
:指定使用的字体。color=RED_D
:指定文本的颜色。.scale(1)
:缩放文本的大小。
2. ParametricFunction()
heart_curve = ParametricFunction(
lambda t: np.array([
16 * np.sin(t) ** 3,
13 * np.cos(t) - 5 * np.cos(2 * t) - 2 * np.cos(3 * t) - np.cos(4 * t),0
]),
t_range=np.array([0, TAU]),
color=RED
).scale(0.15).move_to(ORIGIN)</pre>
- 功能:创建一个参数方程曲线对象,用于绘制爱心形状。
- 参数:
lambda t: np.array([...])
:定义曲线的参数方程。t_range=np.array([0, TAU])
:设置参数t
的范围,从 (0) 到 (2\pi)。color=RED
:设置曲线颜色为红色。.scale(0.15)
:缩放爱心形状的大小。.move_to(ORIGIN)
:将爱心图像移动到屏幕中心(原点位置)。
3. self.play()
- 功能:用于播放动画。
- 用法示例:
self.play(Write(text))
:将文本对象逐字写出,展示在屏幕上。self.play(Transform(text, heart_curve))
:将文本平滑地转换为爱心图像。
4. Write()
self.play(Write(text))
- 功能:创建一种逐字展示文本的动画效果,将文本从无到有逐步显示出来。
- 参数:
text
是要展示的文本对象。
5. 最重要的方法Transform()
self.play(Transform(text, heart_curve))
- 功能:将一个对象转换为另一个对象,创建平滑过渡的动画效果。
- 参数:
Transform(text, heart_curve)
将text
对象转换为heart_curve
对象,实现从文本到爱心的渐变动画。
6. self.wait()
self.wait(1)
self.wait(2)
- 功能:在动画播放过程中插入暂停,延迟一定时间,以便观众有时间观看当前画面。
- 参数:
1
表示暂停 1 秒,2
表示暂停 2 秒。
代码总结
这段代码的核心流程是:
- 使用
Text()
创建并展示文本。 - 使用
ParametricFunction()
创建爱心图像。 - 使用
Write()
播放逐字显示文本的动画。 - 使用
Transform()
将文本平滑转换为爱心图像。 - 使用
wait()
暂停,以便观众有足够的时间观看每个动画效果。
主要使用的 Manim 方法:
- 创建文本和图像:
Text()
和ParametricFunction()
- 动画播放:
self.play()
- 具体动画效果:
Write()
和Transform()
- 暂停:
self.wait()