Manim实现图像变形特效

在数学教学和科普领域,变形效果往往能起到事半功倍的作用,让抽象的数学概念变得生动形象。

这篇文章将通过三个典型场景,来看看如何超越默认效果的限制,制作出更专业的变形动画。

1. 几何体的形态跃迁

传统形状变化往往生硬,而通过组合Transform与样式动画,我们可以创造更丰富的视觉效果:

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()

代码中,我们使用path_arc参数让变形路径呈现优美的弧线运动;

并且颜色与位置变化与形态变形同步进行;

一个图形(圆形)同时转换成两个图形(一个圆形,一个正方形)。

2. 坐标系的魔法转换

数学场景转换需要兼顾坐标系和图形,ReplacementTransform可以完美处理这种复合变换。

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()

代码中核心功能在于:

  • 同时替换坐标系和函数曲线保持场景一致性
  • 使用scale调整坐标系比例确保平滑过渡
  • 后期添加颜色动画强化视觉效果

3. 参数驱动的动态变化

下面通过UpdateFromAlphaFunc实现参数连续变化效果,函数图像变化的过程中同步更新参数值显示。

并且在函数图像变化的过程中,通过颜色插值interpolate_color函数,使得颜色随参数变化渐变(从绿色变成黄色)。

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()

显示效果如下:

4. 总结

使用Manim的Transform和ReplacementTransform实现数学图形动态变形。

比如,圆变方、正弦函数振幅连续变化等等,结合颜色插值与参数数值同步更新,直观演示参数对图形的影响。

相关推荐
wang_yb16 分钟前
让 LLM 输出不再失控:用 Pydantic 校验大模型输出
ai·databook
wang_yb3 天前
使用命令行做描述性统计的技巧
数据分析·databook
zwd20053 天前
Manim 竖屏 1080×1920 配置详解:pixel_width、frame_width 怎么写(0.21.0 / 0.22.0 实测)
python·manim·数学动画·短视频制作·manim教程·竖屏视频
zwd20056 天前
Manim 画布尺寸与像素换算详解:frame_width、frame_height、pixel_width 和画质参数(0.21.0 实测)
python·分辨率·manim·数学动画·frame_width·manim教程
wang_yb6 天前
MinMax vs Standard vs Robust:三种特征缩放怎么选
ai·数据分析·databook
wang_yb8 天前
用 Pydantic AI 从零搭建一个能干活的 AI Agent
ai·databook
wang_yb10 天前
从循环到向量化:NumPy提速的7个关键思维
数据分析·databook
wang_yb12 天前
ManimCE v0.22.0 发布:输出配置大一统与渲染流程重构
databook·manim
wang_yb13 天前
Scikit-Learn实战:5步搞定PCA降维
ai·databook
zwd200514 天前
Manim add_sound 用法详解:time_offset、gain、多条音频与旁白对齐(2026 最新教程,0.21.0)
python·音频·动画·manim·数学动画·add_sound