实现自定义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)
关键说明
- 直接修改实例而非重新赋值:原代码中
submobject = starting_submobject.copy().apply_function(...)只是在方法内部创建了新对象,Manim实际跟踪的初始submobject实例没有任何变化,所以看不到动画。 - 重置起始状态:每次插值时调用
submobject.become(starting_submobject),确保submobject先回到动画开始的状态,再应用当前alpha对应的变换。 - 无需返回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
相关产品推荐
相关产品推荐

