如何在Manim中创建Mobject副本?保留变换前原三角形
在Manim中保留Mobject原始副本的方法
要保留tr_1的原始状态不受矩阵变换影响,直接用Manim内置的copy()方法即可——所有Mobject对象都自带这个方法,会创建一个独立的、与原对象属性完全一致的副本,后续对原对象的变换不会影响副本。
修改后的代码示例
from manim import * class CreateExample(Scene): def construct(self): tr_1 = Polygon([-3, -2, 0], [-3, 3, 0], [2, -2, 0]) # 立即创建tr_1的原始副本 tr_1_original = tr_1.copy() # 将副本添加到场景,保持原始状态显示 self.add(tr_1_original) cc_1 = Circle().shift(2.5*LEFT+1.75*UP).scale(0.4) cc_2 = Circle().shift(2.5*LEFT+0.65*UP).scale(0.4) cc_3 = Circle().shift(1.5*LEFT+0.65*UP).scale(0.4) cc_4 = Circle().shift(2.5*LEFT+0.6*DOWN).scale(0.4) cc_5 = Circle().shift(1.5*LEFT+0.6*DOWN).scale(0.4) cc_6 = Circle().shift(0.2*LEFT+0.6*DOWN).scale(0.4) cc_7 = Circle().shift(2.5*LEFT+1.6*DOWN).scale(0.4) cc_8 = Circle().shift(1.5*LEFT+1.6*DOWN).scale(0.4) cc_9 = Circle().shift(0.2*LEFT+1.6*DOWN).scale(0.4) cc_10= Circle().shift(0.8*RIGHT+1.6*DOWN).scale(0.4) mt_1 = [[0, -1], [-1, 0]] gr_1 = VGroup(tr_1,cc_1,cc_2,cc_3,cc_4,cc_5,cc_6,cc_7,cc_8,cc_9,cc_10) self.play(Create(tr_1)) self.play(Create(cc_1),Create(cc_2),Create(cc_3),Create(cc_4),Create(cc_5),Create(cc_6),Create(cc_7),Create(cc_8),Create(cc_9),Create(cc_10)) # 变换的是gr_1中的tr_1,原始副本tr_1_original不受影响 self.play(gr_1.animate.apply_matrix(mt_1), run_time=2)
关键说明
copy()方法会深拷贝Mobject的所有属性(包括顶点坐标、样式、位置等),副本和原对象完全独立,后续操作互不干扰。- 如果不需要一开始就显示原始副本,可以先不调用
self.add(tr_1_original),等到需要展示时再添加(比如变换完成后用self.play(FadeIn(tr_1_original)))。 - 不要直接赋值(比如
tr_1_original = tr_1),这只是引用同一个对象,变换时会一起改变。
内容的提问来源于stack exchange,提问作者11pro12
相关产品推荐
相关产品推荐

