为Manim视频对象添加闪光效果

今天我们来介绍一下如何在 Manim 中用于实现从指定点向四周发射闪烁线条的动画,这种动画效果主要是继承自 AnimationGroup ,常用于突出画面中的关键对象或位置,以下是分模块的详细解析:

一、类的核心定位与基础属性

  1. 功能:从指定中心点向所有方向发射线条,形成闪烁 / 闪光的视觉效果,用于吸引观众注意力到目标位置 / 对象。
  2. 继承关系:基于AnimationGroup实现,支持动画组的相关特性。
  3. 默认属性:初始化时自带默认参数,如默认黄色(#FFFF00)、12 条闪烁线条、线条长度 0.2、动画时长 1 秒等,可直接调用无需手动配置。

二、完整参数说明(含类型、作用、默认值)

Flash 的所有参数均可自定义,分为核心视觉参数和动画时长参数,部分关键参数补充实用说明,参数及默认值如下:

参数名 类型 作用 默认值
point Mobject 闪烁线条的中心点;传入对象(Mobject)时自动取对象中心 无(必传)
line_length float 单条闪烁线条的长度 0.2
num_lines int 向四周发射的线条总数,数量越多闪光效果越密集 12
flash_radius float 线条起始点与中心点的距离(半径),控制闪光的 “起始范围” 0.1
line_stroke_width int 线条的笔触宽度,数值越大线条越粗 3
color str/ManimColor 线条颜色,支持十六进制、Manim 内置颜色(如 RED/YELLOW) #FFFF00(黄色)
time_width float 线条的时间宽度,控制闪光的 “持续细腻度”(参考 ShowPassingFlash) 1
run_time float 整个 Flash 动画的运行时长(秒) 1.0
kwargs - 传递给 Succession 构造器的额外参数,支持扩展动画特性 -

三、实用代码示例(2 个核心场景)

先来看下面简单的示例,覆盖基础使用高级自定义场景,适配不同需求:

基础场景:

对单个对象添加闪光

1
2
3
4
5
6
7
8
from manim import *

class UsingFlash(Scene):
def construct(self):
dot = Dot(color=PURE_YELLOW).shift(DOWN)
self.add(Tex("Flash the dot below:"), dot)
self.play(Flash(dot))
self.wait()

对黄色圆点添加默认 Flash 效果,仅需传入目标对象,无需自定义参数,代码简洁,适合快速强调单个对象。我们来看显示的实例效果

高级场景:

对圆形自定义闪光,为半径 2 的圆形配置红色、30 条线条的闪光,关键自定义点:

  • 结合SMALL_BUFF(Manim 内置常量,值为 0.1)设置flash_radius,让闪光从圆形外侧开始发射;
  • 配置rate_func = rush_from(动画速率函数,效果为先快后慢),让闪光更贴合视觉习惯;
  • 调整time_width=0.3run_time=2,控制闪光的细腻度和总时长。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from manim import *

class FlashOnCircle(Scene):
def construct(self):
radius = 2
circle = Circle(radius)
self.add(circle)
self.play(Flash(
circle, line_length=1,
num_lines=30, color=RED,
flash_radius=radius+SMALL_BUFF,
time_width=0.3, run_time=2,
rate_func = rush_from
))

实际效果如下:

四、进阶用法:

如果你需要更个性化的闪光效果(如更多线条、更长时长、自定义半径等),可通过参数自定义,以下是覆盖核心参数的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from manim import *

class FlashAdvancedExample(Scene):
def construct(self):
# 创建一个正方形作为目标对象
square = Square(side_length=1.5, color=GREEN, fill_opacity=0.3)
square.move_to(ORIGIN) # 移到屏幕中心
self.add(square)

# 自定义Flash动画参数
self.play(
Flash(
square, # 目标对象
line_length=0.5, # 单条线条长度(默认0.2)
num_lines=30, # 线条数量(默认12,越多越密集)
flash_radius=0.3, # 线条起始半径(默认0.1)
line_stroke_width=5, # 线条宽度(默认3)
color=PURPLE, # 线条颜色
time_width=0.5, # 时间宽度(默认1)
run_time=2, # 动画总时长(默认1秒)
rate_func=rush_from # 动画速率函数(先快后慢)
)
)

self.wait(2)

实际演示效果

好了,今天就分享到这里,感谢来到老刘博客。