You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Manim中实现随参数a变化的FunctionGraph动画?

在Manim中实现随参数平滑变化的FunctionGraph动画(类似Desmos滑块效果)

问题描述

需要实现随参数a变化的函数图像动画,目标函数为:

y = x ** 2 / 3 + np.sqrt(3.3 - x ** 2) * np.sin(a * np.pi * x)

原方案使用for循环遍历参数值并逐帧添加/移除图像,插值效果差,希望找到更优的内置实现方式。

解决方案

Manim提供了ValueTracker配合AlwaysRedraw的组合,可以完美实现类似Desmos的参数平滑变化效果,无需手动处理帧更新。

核心思路

  1. ValueTracker:用于跟踪参数a的数值,支持平滑的数值插值动画。
  2. AlwaysRedraw:包裹FunctionGraph,确保每一帧都会根据当前a的数值重新计算并绘制函数图像,实现实时更新。

完整代码示例

from manim import *
import numpy as np

class ParametricFunctionAnimation(Scene):
    def construct(self):
        # 初始化参数a的跟踪器,初始值设为7
        a_tracker = ValueTracker(7)
        
        # 用AlwaysRedraw定义动态更新的函数图像
        heart = AlwaysRedraw(lambda: FunctionGraph(
            lambda x: x**2/3 + np.sqrt(3.3 - x**2) * np.sin(a_tracker.get_value() * np.pi * x),
            x_range=[-1.8, 1.8],
            color=RED
        ))
        
        # 添加图像到场景
        self.add(heart)
        
        # 可选:添加实时显示参数a的文本
        a_label = Text("a = ", font_size=24).to_corner(UR)
        a_value = DecimalNumber(a_tracker.get_value(), num_decimal_places=1, font_size=24)
        a_value.next_to(a_label, RIGHT)
        
        # 让文本随参数a更新
        a_value.add_updater(lambda m: m.set_value(a_tracker.get_value()))
        self.add(a_label, a_value)
        
        # 播放参数a从7平滑过渡到15的动画,时长10秒
        self.play(a_tracker.animate.set_value(15), run_time=10)
        self.wait()

方案优势

  • 平滑插值:ValueTracker会自动处理参数a的中间插值,避免原方案中跳变的卡顿感。
  • 高效更新:AlwaysRedraw仅在必要时重绘图像,性能优于手动逐帧添加/移除。
  • 扩展性强:可以轻松添加参数显示、滑块控件(Manim Community版本支持)等额外元素,更贴近Desmos的交互体验。

额外优化:使用Slider组件(Manim Community)

如果使用Manim Community版本,可以直接用Slider组件实现类似Desmos的滑块交互:

from manim import *
import numpy as np

class SliderControlledFunction(Scene):
    def construct(self):
        # 创建滑块,范围7到15,初始值7
        slider = Slider(
            minimum_value=7,
            maximum_value=15,
            value=7,
            length=6,
            color=BLUE,
            track_color=GREY,
            thumb_color=WHITE
        )
        slider.to_edge(DOWN)
        
        # 动态函数图像
        heart = AlwaysRedraw(lambda: FunctionGraph(
            lambda x: x**2/3 + np.sqrt(3.3 - x**2) * np.sin(slider.get_value() * np.pi * x),
            x_range=[-1.8, 1.8],
            color=RED
        ))
        
        # 参数显示文本
        a_label = Text("a = ", font_size=24).to_corner(UR)
        a_value = DecimalNumber(slider.get_value(), num_decimal_places=1, font_size=24)
        a_value.next_to(a_label, RIGHT)
        a_value.add_updater(lambda m: m.set_value(slider.get_value()))
        
        self.add(slider, heart, a_label, a_value)
        self.wait()

运行后拖动滑块即可实时调整参数a,实现完全交互式的效果。

内容的提问来源于stack exchange,提问作者Shirsak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 04:22:36