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

实现自定义Manim Animation无效果,疑未正确理解接口约定

问题分析与解决

你的ScaleAction动画无效果的核心原因是:在interpolate_submobject方法中,你重新给局部变量submobject赋值了新创建的对象,但Manim需要你直接修改传入的submobject实例本身,局部变量的赋值不会影响外部Manim跟踪的原对象,因此动画没有生效。

修正后的代码

class ScaleAction(Animation):
    def __init__(self, mobject: Mobject, **kwargs):
        super().__init__(mobject, **kwargs)
        
    def interpolate_submobject(
        self,
        submobject: Mobject,
        starting_submobject: Mobject,
        alpha: float,
    ):
        # 先将submobject重置为动画起始状态
        submobject.become(starting_submobject)
        # 计算缩放因子:随alpha从1线性过渡到2
        scale_factor = 1 + alpha * 1
        # 直接对传入的submobject应用缩放变换
        submobject.scale(scale_factor)

关键说明

  1. 直接修改实例而非重新赋值:原代码中submobject = starting_submobject.copy().apply_function(...)只是在方法内部创建了新对象,Manim实际跟踪的初始submobject实例没有任何变化,所以看不到动画。
  2. 重置起始状态:每次插值时调用submobject.become(starting_submobject),确保submobject先回到动画开始的状态,再应用当前alpha对应的变换。
  3. 无需返回self:Manim的动画系统不依赖interpolate_submobject的返回值,去掉多余的返回语句即可。

如果你更倾向于用apply_function实现,也可以这样写:

def interpolate_submobject(
    self,
    submobject: Mobject,
    starting_submobject: Mobject,
    alpha: float,
):
    scale_factor = 1*(1-alpha) + 2*alpha
    submobject.become(starting_submobject)
    submobject.apply_function(lambda array: array * scale_factor)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:31:17