掌握ChangeSpeed类:让数学动画速度随心而动!
<p>在制作数学动画时,我们常常希望动画的速度能够根据需要进行调整,以更好地展示数学概念的演变过程。</p><p><code>Manim</code>框架中的<code>ChangeSpeed</code>类就是这样一个强大的工具,它能够帮助我们轻松地控制动画的速度变化,让动画更加生动和富有表现力。</p>
<h1 id="1-主要作用">1. 主要作用</h1>
<p><code>ChangeSpeed</code>类的主要作用是<strong>改变</strong>动画的播放<strong>速度</strong>。</p>
<p>在数学动画中,有些部分可能需要快速展示,比如简单的平移或旋转;而有些部分则需要慢速展示,以便观众能够仔细观察其中的细节,比如复杂的函数变换或几何图形的构造。</p>
<p>通过使用<code>ChangeSpeed</code>类,我们可以对动画的速度进行精确的控制,让动画的节奏更加符合我们的需求。</p>
<p>一句话来说:动态控制动画的播放速度,实现加速/减速效果。</p>
<p>想象一辆小车:</p>
<ul>
<li>默认动画 → 小车匀速移动(枯燥😴)</li>
<li>使用<code>ChangeSpeed</code> → 小车起步慢 → 中途加速 → 终点前减速(生动!🎬)</li>
</ul>
<p>它通过修改动画的时间流速实现变速,完美适配移动、旋转、变形等各类动画。</p>
<h1 id="2-参数详解">2. 参数详解</h1>
<p><code>ChangeSpeed</code>类的使用需要我们了解它的各个参数,其中最重要的参数就是<code>speedinfo</code>。</p>
<p>这个参数是<code>ChangeSpeed</code>的灵魂!它是一个字典,定义不同时间点的速度倍率:</p>
<ul>
<li><strong>键</strong> (<code>Key</code>):动画进度比例(0=开始,1=结束)</li>
<li><strong>值</strong> (<code>Value</code>):该时刻的速度倍数(1=原速,2=2倍速,0.5=半速)</li>
</ul>
<p>设置<code>speedinfo</code>参数的示例如下:</p>
<pre><code class="language-python"># 先加速后减速(小车启动停止效果)
speedinfo = {
0: 0.3, # 开始时0.3倍慢速
0.7: 1.8,# 70%进度时1.8倍快速
1: 0.2 # 结束时0.2倍慢速
}
# 匀速突然变慢(强调终点)
speedinfo = {
0: 1.0,
0.8: 1.0,# 前80%保持原速
1: 0.1 # 最后20%大幅减速
}
</code></pre>
<p>当然,除了<code>speedinfo</code>参数,<code>ChangeSpeed</code>类还有一些其他参数,比如动画的持续时间(<code>duration</code>)和动画的起始时间(<code>start_time</code>)。</p>
<p>这些参数比较简单,一看就明白它的含义。</p>
<h1 id="3-使用示例">3. 使用示例</h1>
<p>下面通过两个示例来演示<code>ChangeSpeed</code>类的使用。</p>
<h2 id="31-模拟自由落体运动">3.1. 模拟自由落体运动</h2>
<p>小球下落逐渐加速,模拟重力加速。</p>
<pre><code class="language-python">class Example(Scene):
def construct(self):
ball = Circle(
radius=0.2,
color=RED,
fill_color=YELLOW,
fill_opacity=0.8,
)
path = Line(UP * 3, DOWN * 3)# 垂直路径
# 重力加速度效果:下落越来越快
speedinfo = {0: 0.1, 0.3: 0.5, 1: 2.0}
self.play(
ChangeSpeed(MoveAlongPath(ball, path), speedinfo=speedinfo),
run_time=3,
)
self.wait()
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/83005/202506/83005-20250615165914278-133630823.gif" alt="" loading="lazy"></p>
<h2 id="32-重点展示轨迹关键点">3.2. 重点展示轨迹关键点</h2>
<p>这个示例展示一个沿着抛物线运动的点,在几个关键位置放慢速度,引起注意。</p>
<pre><code class="language-python">class Example(Scene):
# 求函数图像与坐标轴交点
def construct(self):
axes = Axes()
graph = axes.plot(lambda x: x**2)
dot = Dot(color=YELLOW)
# 交点处减速强调
speedinfo = {
0: 1.2,
0.4: 1.2,# 快速移动到第一个交点
0.45: 0.1,# 在(0,0)减速
0.55: 1.0,
0.9: 1.0,# 快速移动到第二个交点
0.95: 0.1,# 在(1,1)减速
}
self.play(
ChangeSpeed(MoveAlongPath(dot, graph), speedinfo=speedinfo),
run_time=5,
)
self.wait()
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/83005/202506/83005-20250615165914270-1551453256.gif" alt="" loading="lazy"></p>
<h1 id="4-总结">4. 总结</h1>
<p><code>ChangeSpeed</code>类是<code>Manim</code>框架中一个非常有用的工具,它为我们提供了对动画速度的灵活控制。</p>
<p>结合<code>ChangeSpeed</code>类来完成我们的动画,可以:</p>
<ol>
<li><strong>打破单调性</strong> → 匀速动画易让观众走神,变速创造视觉节奏</li>
<li><strong>符合现实规律</strong> → 真实物理世界极少匀速运动(抛物线、摩擦力等)</li>
<li><strong>突出关键信息</strong> → 像电影慢镜头一样强调重点区域</li>
<li><strong>提升专业感</strong> → 细微的速度变化让动画媲美科教纪录片</li>
</ol><br><br>
来源:https://www.cnblogs.com/wang_yb/p/18929737
頁:
[1]