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

Manim中Transform触发广播错误的原因及解决方法

Manim中Transform操作触发广播错误的解决方法

问题

在Manim中对带有更新器的MathTex对象执行Transform或ReplacementTransform转换操作时,会触发ValueError: operands could not be broadcast together with shapes广播错误。注释掉该对象的add_updater代码后程序可正常运行,但无法实现数值动态更新功能。

原代码示例

class Test(Scene):
    def construct(self):
        tracker = ValueTracker(0)
        p_q_value = MathTex(
            r"0", r"\;=\;", r"{0", r"\over", r"1}").move_to(ORIGIN)
        self.play(Write(p_q_value))

        p_q_value.add_updater(lambda mobj: mobj.become(MathTex(
            f"{tracker.get_value():.0f}", r"\;=\;", fr"{{{tracker.get_value():.0f}\over", r"1}").move_to(ORIGIN)))
        self.play(tracker.animate.set_value(10), run_time=5)

        sqr_rt = MathTex(r"\sqrt{16}")

        self.play(ReplacementTransform(p_q_value, sqr_rt))
        self.wait(4)

错误信息

│    47 │   │   sqr_rt = MathTex(r"\sqrt{16}")
│    48 │   │
│ ❱  49 │   │   self.play(ReplacementTransform(p_q_value, sqr_rt))
│    50 │   │   self.wait(4)
│    51 │   │
│    52 │   │
##############################################################

ValueError: operands could not be broadcast together with shapes
(48,3) (76,3)  [35895] Execution returned code=1 in 1.405 seconds
returned signal null

解决方案

在执行转换操作前,调用clear_updaters()关闭原MathTex对象的更新器即可解决问题。修改后的关键代码如下:

sqr_rt = MathTex(r"\sqrt{16}")
p_q_value.clear_updaters()  # 转换前关闭更新器
self.play(Transform(p_q_value, sqr_rt))
self.wait(4) 

原因说明

更新器会在动画执行过程中持续修改原MathTex对象的内部结构(比如字符数量、顶点形状),导致Transform动画无法在两个结构不一致的对象之间进行插值计算。关闭更新器后,原对象的结构固定,就能正常完成转换动画。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 21:30:53