龙腾九洲 發表於 2025-9-30 12:28:00

Manim实现波浪形文字特效

<p>本文将介绍如何使用<code>Manim</code>实现波浪形文字特效,通过自定义动画类让文字产生波浪般的动态效果。</p>
<h1 id="1-实现原理">1. 实现原理</h1>
<p>波浪形文字特效的核心是通过自定义<code>Animation</code>类,对文本对象中的每个字符应用不同的位置偏移,从而形成波浪效果。</p>
<p>下面我们来分析具体实现:</p>
<h2 id="11-自定义animation类">1.1. 自定义Animation类</h2>
<pre><code class="language-python">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 =
      
      super().__init__(text_mobject, **kwargs)
</code></pre>
<p>在<code>WaveText</code>类的初始化方法中,我们做了以下几件事:</p>
<ul>
<li><strong>保存动画参数</strong>:振幅(<code>amplitude</code>)、频率(<code>frequency</code>)、初始相位(<code>phase</code>)和波动方向(<code>direction</code>)</li>
<li>获取文本对象中的所有子对象(每个字符)</li>
<li>记录每个字符的原始位置,以便后续计算偏移量</li>
<li>调用父类的初始化方法</li>
</ul>
<h2 id="12-实现interpolate_mobject方法">1.2. 实现interpolate_mobject方法</h2>
<pre><code class="language-python">    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
            
            # 计算波浪偏移量
            char_phase = 3 * original_pos
            offset = self.amplitude * np.sin(char_phase + current_phase)
            
            # 计算新位置
            new_pos = original_pos + offset * self.direction
            
            # 更新字符位置
            char.move_to(new_pos)
</code></pre>
<p><code>interpolate_mobject</code>方法是实现动画效果的关键,它在动画的每一帧都会被调用:</p>
<ul>
<li><code>alpha</code>参数表示动画进度,范围从0到1</li>
<li>计算当前时间的相位,结合<code>alpha</code>和<code>frequency</code>参数控制波浪的周期</li>
<li>对每个字符应用不同的位置偏移,偏移量使用正弦函数计算</li>
<li>字符的x坐标用于创建不同的相位,使每个字符有不同的波动</li>
<li>最后,将计算得到的新位置应用到每个字符上</li>
</ul>
<h1 id="2-使用示例">2. 使用示例</h1>
<p>代码中提供了三个不同的场景示例,展示了波浪文字特效的各种用法:</p>
<h2 id="21-完整示例">2.1. 完整示例</h2>
<pre><code class="language-python">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()
</code></pre>
<p>这个示例展示了如何同时<strong>应用不同参数</strong>的波浪效果到多个文本对象上,包括不同的振幅、频率和方向。</p>
<p><img src="https://img2024.cnblogs.com/blog/83005/202509/83005-20250930122702932-1005962332.gif" alt="" loading="lazy"></p>
<h2 id="22-中文文本示例">2.2. 中文文本示例</h2>
<pre><code class="language-python">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()
</code></pre>
<p>这个示例展示了波浪特效在<strong>中文文本</strong>上的应用,先应用垂直方向的波浪,然后应用水平方向的波浪。</p>
<p><img src="https://img2024.cnblogs.com/blog/83005/202509/83005-20250930122703035-334404836.gif" alt="" loading="lazy"></p>
<h2 id="23-数学公式示例">2.3. 数学公式示例</h2>
<pre><code class="language-python">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()
</code></pre>
<p>这个示例展示了波浪特效在<strong>数学公式</strong>(使用<code>MathTex</code>创建)上的应用,同样分别应用了垂直和水平方向的波浪效果。</p>
<p><img src="https://img2024.cnblogs.com/blog/83005/202509/83005-20250930122702869-1430034153.gif" alt="" loading="lazy"></p>
<p><strong>注意</strong>:这里<strong>数学公式</strong>中的每个元素要分开写,也就是:<code>MathTex("E", "=", "m", "c", "^2")</code>。</p>
<p>如果写成一个整体的话(<code>MathTex("E=mc^2")</code>),整个公式会作为一个整体上下或左右摆动,不会有波浪效果。</p>
<h1 id="3-总结">3. 总结</h1>
<h2 id="31-波浪文字特效的特点">3.1. 波浪文字特效的特点</h2>
<ol>
<li><strong>高度可定制</strong>:通过调整振幅、频率、相位和方向等参数,可以创建各种不同风格的波浪效果</li>
<li><strong>适用范围广</strong>:支持普通文本、中文字符和数学公式等多种文本类型</li>
<li><strong>实现简洁</strong>:通过继承<code>Animation</code>类并重写<code>interpolate_mobject</code>方法,实现了核心的波浪效果</li>
<li><strong>易于扩展</strong>:可以结合Manim的其他功能,如颜色变化、缩放等,创建更复杂的动画效果</li>
</ol>
<h2 id="32-使用场景">3.2. 使用场景</h2>
<ol>
<li><strong>视频片头/片尾</strong>:为标题或字幕添加波浪效果,增加视觉吸引力</li>
<li><strong>教学视频</strong>:在讲解波浪、波动方程等概念时,可以用波浪文字特效直观地展示</li>
<li><strong>数据可视化</strong>:为关键数据标签添加动态效果,突出重要信息</li>
<li><strong>创意动画</strong>:结合其他动画效果,创建独特的视觉艺术作品</li>
</ol>
<p>波浪文字特效是<code>Manim</code>中一个简单但非常实用的动画技巧,通过本文的介绍,相信你已经掌握了其实现原理和使用方法。</p>
<p>不妨动手尝试,为你的<code>Manim</code>动画增添更多动感和魅力!</p><br><br>
来源:https://www.cnblogs.com/wang_yb/p/19120754
頁: [1]
查看完整版本: Manim实现波浪形文字特效