本文将介绍如何使用Manim实现波浪形文字特效,通过自定义动画类让文字产生波浪般的动态效果。
波浪形文字特效的核心是通过自定义Animation类,对文本对象中的每个字符应用不同的位置偏移,从而形成波浪效果。
下面我们来分析具体实现:
class WaveText(Animation):
"""波浪形文字特效动画类"""
def __init__(
self, text_mobject, amplitude=0.2, frequency=2, phase=0, direction=UP, **kwargs
):
# 保存参数
self.amplitude = amplitude
self.frequency = frequency
self.phase = phase
self.direction = direction
# 获取文本对象中的所有子对象(每个字符)
self.chars = text_mobject.submobjects
# 记录每个字符的原始位置
self.original_positions = [char.get_center() for char in self.chars]
super().__init__(text_mobject, **kwargs)
在WaveText类的初始化方法中,我们做了以下几件事:
amplitude)、频率(frequency)、初始相位(phase)和波动方向(direction) def interpolate_mobject(self, alpha):
"""在动画过程中更新文本对象"""
# 计算当前时间相位
current_phase = self.phase + alpha * TAU * self.frequency
# 更新每个字符的位置
for i, char in enumerate(self.chars):
# 获取字符原始位置
original_pos = self.original_positions[i]
# 计算波浪偏移量
char_phase = 3 * original_pos[0]
offset = self.amplitude * np.sin(char_phase + current_phase)
# 计算新位置
new_pos = original_pos + offset * self.direction
# 更新字符位置
char.move_to(new_pos)
interpolate_mobject方法是实现动画效果的关键,它在动画的每一帧都会被调用:
alpha参数表示动画进度,范围从0到1alpha和frequency参数控制波浪的周期代码中提供了三个不同的场景示例,展示了波浪文字特效的各种用法:
class Example01(Scene):
"""波浪文字特效完整示例场景"""
def construct(self):
# 创建多个文本对象,展示不同参数的效果
text1 = Text("Hello Manim!", font_size=40).shift(UP * 2)
text2 = Text("Large Amplitude", font_size=40).shift(UP * 0.5)
text3 = Text("High Frequency", font_size=40).shift(DOWN * 0.5)
text4 = Text("Horizontal Wave", font_size=40).shift(DOWN * 2)
# 为每个文本创建不同参数的波浪动画
wave_anim1 = WaveText(
text1, amplitude=0.3, frequency=2, run_time=3, rate_func=linear
)
wave_anim2 = WaveText(
text2, amplitude=0.5, frequency=1, run_time=3, rate_func=linear
)
wave_anim3 = WaveText(
text3, amplitude=0.1, frequency=5, run_time=3, rate_func=linear
)
wave_anim4 = WaveText(
text4, amplitude=0.3, frequency=3, direction=RIGHT, run_time=3, rate_func=linear
)
# 显示所有文本并同时播放动画
self.play(FadeIn(text1), FadeIn(text2), FadeIn(text3), FadeIn(text4))
self.play(wave_anim1, wave_anim2, wave_anim3, wave_anim4)
self.wait()
这个示例展示了如何同时应用不同参数的波浪效果到多个文本对象上,包括不同的振幅、频率和方向。

class Example02(Scene):
"""中文波浪文字特效简单示例场景"""
def construct(self):
# 创建中文文本
text = Text("数学动画框架", font_size=60)
# 显示文本并应用波浪动画
self.play(Write(text))
self.wait()
# 应用垂直波浪效果
wave_animation = WaveText(
text, amplitude=0.2, frequency=2, run_time=2, rate_func=linear
)
self.play(wave_animation)
self.wait()
# 应用水平波浪效果
wave_animation2 = WaveText(
text, amplitude=0.4, frequency=1, direction=RIGHT, run_time=2, rate_func=linear
)
self.play(wave_animation2)
self.wait()
这个示例展示了波浪特效在中文文本上的应用,先应用垂直方向的波浪,然后应用水平方向的波浪。

class Example03(Scene):
"""数学公式文字特效简单示例场景"""
def construct(self):
# 创建数学公式文本
text = MathTex("E", "=", "m", "c", "^2", font_size=60)
# 显示公式并应用波浪动画
self.play(Write(text))
self.wait()
# 应用垂直波浪效果
wave_animation = WaveText(
text, amplitude=0.2, frequency=2, run_time=2, rate_func=linear
)
self.play(wave_animation)
self.wait()
# 应用水平波浪效果
wave_animation2 = WaveText(
text, amplitude=0.4, frequency=1, direction=RIGHT, run_time=2, rate_func=linear
)
self.play(wave_animation2)
self.wait()
这个示例展示了波浪特效在数学公式(使用MathTex创建)上的应用,同样分别应用了垂直和水平方向的波浪效果。

注意:这里数学公式中的每个元素要分开写,也就是:MathTex("E", "=", "m", "c", "^2")。
如果写成一个整体的话(MathTex("E=mc^2")),整个公式会作为一个整体上下或左右摆动,不会有波浪效果。
Animation类并重写interpolate_mobject方法,实现了核心的波浪效果波浪文字特效是Manim中一个简单但非常实用的动画技巧,通过本文的介绍,相信你已经掌握了其实现原理和使用方法。
不妨动手尝试,为你的Manim动画增添更多动感和魅力!
登录查看全部
参与评论
手机查看
返回顶部