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
相关产品推荐
相关产品推荐

