生长与淡入淡出¶
两组最直观的进场/离场动画:Grow 家族让物体从某个基准点"生长"出来,Fade 家族让物体淡入淡出并可附带平移/缩放。两组都支持 point_color 之类的起点着色参数,Grow 系默认 introducer=True,FadeOut 是 remover=True。
GrowFromPoint¶
GrowFromPoint(mobject, point, point_color=None, **kwargs) 官方文档 ↗
GrowFromPoint(mobject, point, point_color=None) 从任意 point 出发把物体放大到完整尺寸,point_color 可指定生长起点的颜色(默认跟随物体自身颜色)。
GrowFromCenter¶
GrowFromCenter(mobject, point_color=None, **kwargs) 官方文档 ↗
GrowFromCenter(mobject, point_color=None) 从物体中心生长——GrowFromPoint 以质心为 point 的便捷版。
GrowFromEdge¶
GrowFromEdge(mobject, edge, point_color=None, **kwargs) 官方文档 ↗
GrowFromEdge(mobject, edge, point_color=None) 从指定边缘方向(如 LEFT、UP)生长,适合做"从屏幕边缘长出"的效果。
类 |
生长基准 |
适合 |
|---|---|---|
|
任意点(必填) |
从某个参照物/位置冒出 |
|
物体中心 |
通用进场 |
|
指定方向的边缘 |
从边缘展开 |
|
箭头起点 |
箭头类专用 |
|
中心 + 旋转 |
带点动感的进场 |
GrowArrow¶
GrowArrow(arrow, point_color=None, **kwargs) 官方文档 ↗
GrowArrow(arrow, point_color=None) 从箭尾向箭头生长出完整箭头。它内部会调用 arrow.scale(0, scale_tips=True, about_point=arrow.get_start()) 生成初始状态。
常见错误
GrowArrow 只适合真正的 Arrow(其 scale 支持 scale_tips 参数)。对 CurvedArrow 使用会抛 TypeError: VMobject.scale() got an unexpected keyword argument 'scale_tips'(本机 v0.21.0 实测)——因为 CurvedArrow 继承自 ArcBetweenPoints 而非 Arrow。曲线箭头请改用 Create 或 FadeIn。
SpinInFromNothing¶
SpinInFromNothing(mobject, angle=1.5707963267948966, point_color=None, **kwargs) 官方文档 ↗
SpinInFromNothing(mobject, angle=PI/2, point_color=None) 从中心一边旋转一边放大出现,默认转 90°,比纯生长多一分动感。
五个物体依次演示:GrowFromPoint(自定义点)、GrowFromCenter、GrowFromEdge、GrowArrow 与 SpinInFromNothing。
查看源码 grow_variants.py
"""GrowVariants: GrowFromPoint / GrowFromCenter / GrowFromEdge / GrowArrow / SpinInFromNothing."""
from manim import *
class GrowVariants(Scene):
def construct(self):
p1 = Square(0.7).set_fill(RED, opacity=0.5).shift(LEFT * 3.5 + UP * 1.5)
p2 = Circle(0.4).set_fill(GREEN, opacity=0.5).shift(LEFT * 1.2 + UP * 1.5)
p3 = Triangle().set_fill(BLUE, opacity=0.5).shift(RIGHT * 1.2 + UP * 1.5).scale(0.6)
arrow = Arrow(ORIGIN, RIGHT * 1.5).shift(LEFT * 0.7 + DOWN * 1.2)
star = Star().set_fill(YELLOW, opacity=0.6).shift(RIGHT * 2.8 + UP * 1.5).scale(0.7)
self.play(GrowFromPoint(p1, point=LEFT * 5 + UP * 2.5), run_time=0.8)
self.play(GrowFromCenter(p2), run_time=0.8)
self.play(GrowFromEdge(p3, edge=RIGHT), run_time=0.8)
self.play(GrowArrow(arrow), run_time=0.8)
self.play(SpinInFromNothing(star), run_time=0.8)
self.wait(0.5)
FadeIn¶
FadeIn(*mobjects, **kwargs) 官方文档 ↗
FadeIn(*mobjects, shift=None, target_position=None, scale=1) 让物体逐渐变不透明。可同时传入多个物体(内部包成 Group)。三个可选修饰参数来自其基类实现:
name |
type |
default |
desc |
|---|---|---|---|
|
np.ndarray | None |
None |
淡入的同时从"当前位置 + shift"平移过来 |
|
np.ndarray | Mobject | None |
None |
淡入起点对齐到某点/某物体中心(与 |
|
float |
1 |
淡入起点的缩放倍数(如 |
FadeOut¶
FadeOut(*mobjects, **kwargs) 官方文档 ↗
FadeOut(*mobjects, shift=None) 渐隐出场,remover=True 播完移除物体。也支持 shift(整体向某方向滑走)与 target_position。注意 FadeOut 只接受 shift/target_position,没有 scale 参数。
普通淡入、带 shift 的滑入、从指定 target_position 飞入、从小放大(scale=0.2);最后四个物体整体 FadeOut 并向右滑走。
查看源码 fade_variants.py
"""FadeVariants: FadeIn shift / target_position / scale, and FadeOut."""
from manim import *
class FadeVariants(Scene):
def construct(self):
anchor = Dot(LEFT * 4 + UP * 2, color=GREY_B)
self.add(anchor)
a = Square(0.7).set_fill(RED, opacity=0.6).shift(LEFT * 2 + UP)
b = Circle(0.4).set_fill(GREEN, opacity=0.6)
c = Triangle().set_fill(BLUE, opacity=0.6).scale(0.6).shift(RIGHT * 2 + UP)
# 普通淡入
self.play(FadeIn(a), run_time=0.8)
# 淡入的同时从指定方向滑入
self.play(FadeIn(b, shift=UP * 1.5), run_time=0.8)
# 从某个点(或物体中心)飞入
self.play(FadeIn(c, target_position=anchor), run_time=0.8)
# 淡入的同时从小放大
d = Star().set_fill(YELLOW, opacity=0.6).scale(0.6).shift(DOWN * 1.5)
self.play(FadeIn(d, scale=0.2), run_time=0.8)
# 淡出时可以整体向某个方向滑走
group = VGroup(a, b, c, d)
self.play(FadeOut(group, shift=RIGHT * 2), run_time=0.9)
self.wait(0.3)
提示
FadeIn/FadeOut 位于 manim.animation.fading 模块,而名字相近的 FadeTransform/FadeToColor 却在 manim.animation.transform 模块——检索源码时注意区分。
自测¶
✏️ 练习
CurvedArrow(ORIGIN, RIGHT*2) 想用生长效果进场,GrowArrow 可以吗?不行的话给出替代方案。
✅ 参考答案
不行。CurvedArrow 不是 Arrow 子类,其 scale() 没有 scale_tips 参数,GrowArrow 初始化起始状态时会抛 TypeError(v0.21.0 实测)。改用 Create(沿弧线画出)或 FadeIn 即可。
✏️ 练习
想让一个圆从屏幕左上角飞入并落在中央、同时从小变大,FadeIn 一行怎么写?
✅ 参考答案
self.play(FadeIn(c, target_position=LEFT * 5 + UP * 3, scale=0.2)):target_position 指定淡入起点(也可用另一个 Mobject,取其中心),scale=0.2 让它从 1/5 尺寸放大到位。
下一步¶
进场和离场都齐了,最重磅的一节来了:Transform 家族——如何让一个物体变成另一个物体。