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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 09:10:06