边学边做Manim中的动画知识点

Manim的动画效果虽然炫酷,但是也有一定的难度,对于新手来说,最好的方法就是多总结,今天给大家汇总一些动画常用的知识点,我自己也不是很懂就是简单的整理,留作日后思考查阅。

1.路径与轨迹

1.1沿任意路径运动使用

1
MoveAlongPath(mobject, path, suspend_mobject_updating=False)

让对象沿任意VMobject路径运动,配合rate_func=linear可实现匀速。

要点:路径可以是直线、圆弧、贝塞尔曲线或由函数定义的参数曲线,如 ParametricFunction

1.2保留运动轨迹使用

1
TracedPath(mobject.get_center, stroke_width=2, color=YELLOW)

自动绘制对象中心轨迹,便于观察运动规律。

路径采样与抖动优化:对复杂路径或高曲率区域,适当提高采样点可缓解“抖动”,如

1
Circle().get_points_defining_boundary(n_samples=100)

1.3物理与向量场驱动使用

1
PhaseFlow(deriv_func, mobject, virtual_time, rate_func=linear)

根据微分方程在相空间生成轨迹,适合模拟 谐振子、摆动、相位流 等连续演化过程。

2.动画组合与时序控制

2.1同时播放

1
AnimationGroup(\*anims, lag_ratio=0.0, run_time=None)

并行执行多个动画;通过lag_ratio控制子动画间的相对延迟,如lag_ratio=0.5表示后一个在前一个进行到 50% 时启动。

2.2依次启动带延迟

1
LaggedStart(\*anims, lag_ratio=0.3, run_time=None)

按添加顺序启动,动画间有固定延迟,适合依次出现/移动的对象序列。

2.3批量延迟

1
LaggedStartMap(AnimationClass, mobjects, arg_creator, lag_ratio=0.2, run_time=None)

对一组对象应用同一动画并依次延迟启动,代码更简洁。

2.4严格顺序

1
Succession(\*anims, lag_ratio=0.0, run_time=None)

前一个动画完成后才启动下一个,适合流程化演示。

3.联动与参数驱动

3.1数值驱动:

1
ValueTracker(value=0, kwargs)

记录屏幕外的数值,常与 updater 联动更新图形属性例如角度、长度、数值显示等。

3.2添加与移除更新器使用

1
add_updater(func)
1
remove_updater(func)
1
clear_updaters()

管理随帧更新的行为,注意匿名函数难以精确移除,必要时用具名函数或 clear_updaters()

3.3典型联动范式

1
ValueTracker

驱动角度/参数,多个对象,如 Angle、Tex、Mobject,各自添加 updater,在

1
play(tracker.animate.set_value(...))

时自动同步变化。

3.4状态快照

1
save_state() / restore()

在某一帧保存对象状态,在 updater 中先恢复再叠加新变换,便于实现“回弹/往返”等效果。

4.变形与替换

4.1弧线式变形

1
Transform(mob1, mob2, path_arc=90\*DEG)

在形状/位置变换时沿弧线过渡,视觉更自然;可与颜色/位移动画并行。

4.2整体替换

ReplacementTransform(mob1, mob2)

将源对象在场景中直接替换为目标对象,常用于坐标系与函数曲线的同步切换。

参数连续更新

1
UpdateFromAlphaFunc(mob, update_func, rate_func=linear, run_time=3)

依据动画进度 alpha∈[0,1] 连续更新对象,如更新函数曲线与参数数值显示,适合展示参数连续变化过程。

5.实用技巧与常见问题

5.1旋转与朝向:

对象沿路径运动时可用 path_arc 控制整体转向;若需自身旋转,可叠加 rotate 或使用 Rotating(逐帧生成目标,视觉更“顺滑”)。

5.2虚线与样式:

1
DashedVMobject(circle, dash_length=0.1, dashed_ratio=0.8)

快速生成虚线轮廓;配合 FadeToColor 做颜色过渡。

5.3组合与分组:

Group(*mobs) 将多个对象打包,便于整体 scale/shift/align;对组内对象统一动画时更高效。

5.4边界与对齐:

1
get_boundary_point(DOWN)
1
get_boundary_point(UP)
1
get_boundary_point(LEFT)
1
get_boundary_point(RIGHT)

获取对象在某方向的边界点,辅助精确对齐与标注。

5.5抖动与性能:

路径抖动常由采样不足引起,提升采样点(如 n_samples)或简化路径可改善;复杂场景建议分组播放并控制 run_timelag_ratio

1
Circle().get_points_defining_boundary(n_samples=100)