Manim实现图像变形特效
<p>在数学教学和科普领域,<strong>变形效果</strong>往往能起到事半功倍的作用,让抽象的数学概念变得生动形象。</p><p>这篇文章将通过三个典型场景,来看看如何超越默认效果的限制,制作出更专业的变形动画。</p>
<h1 id="1-几何体的形态跃迁">1. 几何体的形态跃迁</h1>
<p>传统形状变化往往生硬,而通过组合<code>Transform</code>与<strong>样式动画</strong>,我们可以创造更丰富的视觉效果:</p>
<pre><code class="language-python">class ShapeTransformation(Scene):
def construct(self):
# 创建带描边的起始图形
circle = Circle(radius=1, color=BLUE, stroke_width=8)
circle.set_fill(BLUE_E, opacity=0.5)
circle.shift(LEFT * 2)
# 准备目标图形并设置不同位置
square = Square(side_length=2, color=RED)
square.shift(RIGHT * 2 + UP)
# 同步执行形态变换和颜色渐变
self.play(
Transform(circle.copy(), square, path_arc=90 * DEGREES),
circle.animate.set_color(YELLOW).shift(RIGHT * 4 + DOWN),
run_time=3,
)
self.wait()
</code></pre>
<p>代码中,我们使用<code>path_arc</code>参数让变形路径呈现优美的弧线运动;</p>
<p>并且颜色与位置变化与形态变形同步进行;</p>
<p>一个图形(圆形)同时转换成两个图形(一个圆形,一个正方形)。</p>
<p><img src="https://img2024.cnblogs.com/blog/83005/202505/83005-20250529090232452-42864449.gif" alt="" loading="lazy"></p>
<h1 id="2-坐标系的魔法转换">2. 坐标系的魔法转换</h1>
<p>数学场景转换需要兼顾坐标系和图形,<code>ReplacementTransform</code>可以完美处理这种复合变换。</p>
<pre><code class="language-python">class CoordinateTransform(Scene):
def construct(self):
# 创建笛卡尔坐标系
cartesian = Axes(x_range=[-3,3], y_range=[-2,2])
graph1 = cartesian.plot(lambda x: np.sin(x), color=GREEN)
# 准备极坐标系
polar = PolarPlane(radius_max=2).scale(0.8)
graph2 = polar.plot(lambda t: 1+np.cos(3*t), color=YELLOW)
# 组合变换:坐标系与函数曲线同时替换
self.play(
ReplacementTransform(cartesian, polar),
ReplacementTransform(graph1, graph2),
run_time=2
)
# 增强效果:坐标轴颜色渐变
self.play(polar.animate.set_color(BLUE_C), run_time=1.5)
self.wait()
</code></pre>
<p>代码中核心功能在于:</p>
<ul>
<li>同时替换坐标系和函数曲线保持场景一致性</li>
<li>使用scale调整坐标系比例确保平滑过渡</li>
<li>后期添加颜色动画强化视觉效果</li>
</ul>
<p><img src="https://img2024.cnblogs.com/blog/83005/202505/83005-20250529090232317-355040088.gif" alt="" loading="lazy"></p>
<h1 id="3-参数驱动的动态变化">3. 参数驱动的动态变化</h1>
<p>下面通过<code>UpdateFromAlphaFunc</code>实现参数连续变化效果,函数图像变化的过程中同步更新参数值显示。</p>
<p>并且在函数图像变化的过程中,通过颜色插值<code>interpolate_color</code>函数,使得颜色随参数变化渐变(从绿色变成黄色)。</p>
<pre><code class="language-python">class ParameterTransformation(Scene):
def construct(self):
axes = Axes(
x_range=[-3 * PI, 3 * PI, PI],
y_range=[-3, 3, 1],
axis_config={"color": WHITE},
)
# 参数连续变化(动态展示a从1到2)
param_label = MathTex(r"y = a\sin(x)").to_edge(UP).shift(LEFT)
self.add(param_label, axes)
a_label = MathTex("a=")
a_value = DecimalNumber(1, num_decimal_places=1).next_to(a_label, RIGHT)
vg = VGroup(a_label, a_value).next_to(param_label, DOWN)
self.add(param_label, axes, vg)
# 创建可变的函数曲线
def update_func(mob, alpha):
a = interpolate(1, 2, alpha)
new_func = axes.plot(
lambda x: a * np.sin(x), color=interpolate_color(GREEN, YELLOW, alpha)
)
mob.become(new_func)
a_value.set_value(a)
dynamic_func = axes.plot(lambda x: 1 * np.sin(x), color=GREEN)
self.add(dynamic_func, a_value)
self.play(
UpdateFromAlphaFunc(dynamic_func, update_func, rate_func=linear, run_time=3)
)
self.wait()
</code></pre>
<p>显示效果如下:</p>
<p><img src="https://img2024.cnblogs.com/blog/83005/202505/83005-20250529090232589-1944628559.gif" alt="" loading="lazy"></p>
<h1 id="4-总结">4. 总结</h1>
<p>使用<code>Manim</code>的<code>Transform</code>和<code>ReplacementTransform</code>实现数学图形动态变形。</p>
<p>比如,圆变方、正弦函数振幅连续变化等等,结合颜色插值与参数数值同步更新,直观演示参数对图形的影响。</p><br><br>
来源:https://www.cnblogs.com/wang_yb/p/18901822
頁:
[1]