发布日期:2025-10-08 04:29 点击次数:124
在视频制作和数据可视化领域,涟漪扩散特效是一种常见且富有视觉吸引力的动画效果。
本文将详细介绍如何使用 Manim 数学动画引擎来实现这一效果,包括其实现原理、使用示例以及应用场景。
1. 实现原理涟漪扩散特效主要通过 RippleEffect 类来实现,该类继承自 Manim 的 Animation 基类。让我们深入了解其核心实现机制:
1.1. 核心设计思路class RippleEffect(Animation):
"""
涟漪扩散特效动画类
实现方法:使用Circle类创建多个同心圆,然后 #技术分享通过发光层实现发光效果,
再利用脉冲效果实现闪烁,从而模拟涟漪的扩散和闪烁。
"""
1.2. 参数设计该类提供了丰富的参数控制,使其具有高度可定制性:
def __init__(
self,
mobject: Mobject,
num_ripples: int = 5,
max_radius: float = 3.0,
min_radius: float = 0.1,
ripple_speed: float = 1.0,
color: ParsableManimColor = BLUE,
fade_out: bool = True,
glow_num: int = 3,
glow_width: float = 5,
pulse_frequency: float = 2.0,
**kwargs
):
self.num_ripples = num_ripples
self.max_radius = max_radius
self.min_radius = min_radius
self.ripple_speed = ripple_speed
self.color = color
self.fade_out = fade_out
self.glow_num = glow_num
self.glow_width = glow_width
self.pulse_frequency = pulse_frequency
1.3. 多颜色支持实现代码巧妙地支持单色和多色两种模式:
if isinstance(color, (list, tuple)):
self.colors = list(color)
self.use_multiple_colors = True
else:
self.colors = [color]
self.use_multiple_colors = False
1.4. 涟漪对象初始化在构造函数中,代码预先创建了所有需要的涟漪圆环和对应的发光层:
self.ripples = []
self.glow_layers = []
for i in range(num_ripples): if self.use_multiple_colors: ripple_color = self.colors[i % len(self.colors)] else: ripple_color = self.colors[0]
circle = Circle( radius=min_radius, stroke_color=ripple_color, stroke_width=2, fill_opacity=0, ).move_to(mobject.get_center)
self.ripples.append(circle)
glow_group = [] for j in range(glow_num): glow = circle.copy glow_group.append(glow) self.glow_layers.append(glow_group)
1.5. 动画插值实现interpolate_mobject 方法是实现动画效果的核心,它在每一帧都会被调用:
def interpolate_mobject(self, alpha: float):
"""
实现动画效果的核心方法
Parameters:
alpha - 是一个介于 0 和 1 之间的参数,表示动画的进度
"""
time_alpha = alpha * self.ripple_speed
for i, (ripple, glow_group) in enumerate(zip(self.ripples, self.glow_layers)): if self.use_multiple_colors: ripple_color = self.colors[i % len(self.colors)] else: ripple_color = self.colors[0]
phase_offset = i / self.num_ripples
ripple_time = (time_alpha + phase_offset) % 1
current_radius = interpolate(self.min_radius, self.max_radius, ripple_time)
if self.fade_out: opacity = np.sin(ripple_time * PI) * 0.8 else: opacity = 0.8
opacity = max(0, opacity)
pulse_effect = np.sin(ripple_time * self.pulse_frequency * 2 * PI) * 0.2 opacity = max(0, opacity + pulse_effect)
new_ripple = Circle( radius=current_radius, stroke_color=ripple_color, stroke_width=2, stroke_opacity=opacity, fill_opacity=0, ).move_to(self.mobject.get_center)
ripple.become(new_ripple)
for j, glow in enumerate(glow_group): phase = j / self.glow_num
glow.become(new_ripple.copy) glow.set_stroke( width=self.glow_width * (1 - phase) + 1, color=ripple_color, opacity=opacity * 0.3 * (1 - phase), )
这个方法实现了几个关键的视觉效果: 涟漪扩散 :通过计算当前半径,使圆环从中心向外扩散涟漪淡出 :使用正弦函数创建自然的淡出效果脉冲效果 :添加额外的正弦波动来模拟涟漪的脉冲闪烁发光效果 :为每个涟漪添加多层发光效果,并使它们的宽度和透明度递减相位偏移 :为不同的涟漪设置不同的相位偏移,创造连续的涟漪效果2. 使用示例代码提供了三种不同的使用示例,展示了涟漪效果的多样化应用:
2.1. 单颜色涟漪效果最简单的应用场景,从一个中心点向外扩散单色涟漪:
class RippleEffectExample(Scene):
"""
涟漪扩散特效示例场景
"""
def construct(self): center_dot = Dot(color=YELLOW) self.add(center_dot)
ripple_effect = RippleEffect( center_dot, num_ripples=8, max_radius=4.0, min_radius=0.1, ripple_speed=1.5, color=BLUE, glow_num=5, glow_width=8, pulse_frequency=3.0, )
for ripple, glow_group in zip(ripple_effect.ripples, ripple_effect.glow_layers): self.add(ripple) for glow in glow_group: self.add(glow)
self.play(ripple_effect, run_time=5) self.wait
2.2. 双涟漪效果展示两个同时扩散的涟漪效果,可以用于表现两个对象之间的交互:
class DualRippleEffectExample(Scene):
"""
双涟漪扩散特效示例场景
展示两个同时扩散的涟漪效果
"""
def construct(self): center_dot1 = Dot(color=YELLOW).shift(LEFT * 2) center_dot2 = Dot(color=RED).shift(RIGHT * 2)
self.add(center_dot1, center_dot2)
ripple_effect1 = RippleEffect( center_dot1, num_ripples=6, max_radius=1.5, min_radius=0.1, ripple_speed=1.2, color=BLUE, glow_num=4, glow_width=6, pulse_frequency=5.5, )
ripple_effect2 = RippleEffect( center_dot2, num_ripples=6, max_radius=1.5, min_radius=0.1, ripple_speed=1.2, color=RED, glow_num=8, glow_width=4, pulse_frequency=2.5, )
for ripple, glow_group in zip( ripple_effect1.ripples, ripple_effect1.glow_layers ): self.add(ripple) for glow in glow_group: self.add(glow)
for ripple, glow_group in zip( ripple_effect2.ripples, ripple_effect2.glow_layers ): self.add(ripple) for glow in glow_group: self.add(glow)
self.play(ripple_effect1, ripple_effect2, run_time=5) self.wait
2.3. 多颜色涟漪效果最具视觉冲击力的效果,从一个中心点向外扩散多种颜色的涟漪:
class MultiColorRippleEffectExample(Scene):
def construct(self):
center_dot = Dot(color=YELLOW)
self.add(center_dot)
ripple_effect = RippleEffect( center_dot, num_ripples=8, max_radius=4.0, min_radius=0.1, ripple_speed=1.5, color=[BLUE, RED, GREEN, YELLOW, ORANGE], glow_num=5, glow_width=8, pulse_frequency=3.0, )
for ripple, glow_group in zip(ripple_effect.ripples, ripple_effect.glow_layers): self.add(ripple) for glow in glow_group: self.add(glow)
self.play(ripple_effect, run_time=5) self.wait
3. 总结3.1. 特效特点高度可定制 :提供了丰富的参数控制,包括涟漪数量、大小、速度、颜色、发光效果等视觉效果优美 :通过多层发光、脉冲效果和相位偏移,创造出逼真而华丽的涟漪效果支持多颜色模式 :可以实现单色涟漪或彩虹般的多色涟漪效果易于扩展 :基于Manim的Animation类,易于与其他动画效果结合3.2. 使用场景涟漪扩散特效在以下场景中特别有用: 数据可视化 :用于突出显示数据点或数据变化科学动画 :模拟水面波纹、声波、电磁波等物理现象教育视频 :在解释概念时吸引观众注意力,提高学习效果产品展示 :为产品演示添加视觉亮点,增强吸引力片头片尾 :作为视频过渡或装饰元素用户界面设计 :在交互式应用中提供视觉反馈通过本文介绍的 RippleEffect 类,你可以轻松在自己的动画项目中实现这一效果,为你的作品增添视觉吸引力。
下一篇:没有了