为什么不替换TransForm始终如一地工作?

问题描述 投票:0回答:1
i以
Https://docs.manim.community/en/stable/reference/manim.animation.transform.replacementtransform.html

的from thttps://docs.manim.community/enim.community.html取了一个示例。 class ReplacementTransformOrTransform(Scene): def construct(self): # set up the numbers r_transform = VGroup(*[Integer(i) for i in range(1, 5)]) text_1 = Text("ReplacementTransform", color=RED) r_transform.add(text_1) transform = VGroup(*[Integer(i) for i in range(5, 9)]) text_2 = Text("Transform", color=BLUE) transform.add(text_2) ints = VGroup(r_transform, transform) texts = VGroup(text_1, text_2).scale(0.75) r_transform.arrange(direction=UP, buff=1) transform.arrange(direction=UP, buff=1) ints.arrange(buff=2) self.add(ints, texts) # The mobs replace each other and none are left behind self.play(ReplacementTransform(r_transform[0], r_transform[1])) self.play(ReplacementTransform(r_transform[1], r_transform[2])) self.play(ReplacementTransform(r_transform[2], r_transform[3])) # The mobs linger after the Transform() self.play(Transform(transform[0], transform[1])) self.play(Transform(transform[1], transform[2])) self.play(Transform(transform[2], transform[3])) self.wait()

当我运行它时,这会发生:

1次2到2,什么都没有留下。
    2到3,什么都没有留下。
  1. 3到4,
  2. 后面再铺设3个(就像普通的
  3. Transform()
  4. )。 为什么?更重要的是:我如何在不抛弃任何东西的情况下移动3个?
  5. 注:
我有一个python 3.13.1和manim community 0.19.0的重新安装,它们是最新版本。

解释 问题是在 现场已经存在的另一个场景是不行的。 当前实施的方式ReplacementTransform

假定 新的
transform manim
1个回答
0
投票
不在现场。这确实令人惊讶,因为您的代码 基于文档中的唯一示例 对于

取代transform

源代码中有两个位置与此相关的位置:
Mobject
本质上是
ReplacementTransform
随后是
Mobject
, 请参阅transform.py#l214, 使用transform.py#l294

。 实际上,出于所有意图和目的,在原始源代码中,

ReplacementTrasnform(mobject, target_mobject)

可以用
    Transform(mobject, target_mboject)
  1. scene.replace(mobject, target_mobject)
    在这里the
    self.play(ReplacementTransform(r_transform[0], r_transform[1]))
    
    不同但结果是相同的)。
    功能
    self.play(Transform(r_transform[0], r_transform[1])) self.replace(r_transform[0], r_transform[1]) 会看起来 在场景self列表中,当它找到Scene
    时,
    
    replace
    在同一索引,请参见
    Scene.py#l560
    .
    这意味着如果
    Scene#replace(old_object, new_object)
    已经在现场,则 将重复,在
  2. .mobjects
  3. 的位置上添加 保持原始位置。
    表示,在您的场景(
    old_object
    部分)中,您将拥有
    the:
    new_object
    您代码的以下更改仅包含
    new_object部分 并添加一个展示这些and的现场调试文本 Mobject
  4. 在这些步骤中的每个步骤中进行协调:

old_object

这里是静态的最终图像,如果从自下而上和从左到右读取,
解释了为什么我们在每个步骤中看到了什么。

某些

ReplacementTransform
的坐标变化是显而易见的结果 转换本身的:
Integer
在步骤2中从

initially: 1 2 3 4 after step1: 2 2 3 4 after step2: 3 2 3 4 finally: 4 2 3 4
升至
ReplacemtTransform

在步骤3中将

Integer
y
升至
from manim import *

class ReplacementTransformOrTransform(Scene):
    def construct(self):
        # set up the numbers
        r_transform = VGroup(*[Integer(i) for i in range(1, 5)])
        r_transform.arrange(direction=UP, buff=1)

        # step 0
        self.add(r_transform)

        fm = self.mobjects[0] # get_mobject_family_members()
        self.add_integers_debug_text(fm, "step 0: ", 0, -3.5)

        # step 1
        self.play(ReplacementTransform(r_transform[0], r_transform[1]))
        self.add_integers_debug_text(fm, "step 1: ", 0, -3)

        # step 2
        self.play(ReplacementTransform(r_transform[1], r_transform[2]))
        self.add_integers_debug_text(fm, "step 2: ", 0, -2.5)

        # step 3
        self.play(ReplacementTransform(r_transform[2], r_transform[3]))
        self.add_integers_debug_text(fm, "step 3: ", 0, -2)

        self.wait()


    def add_integers_debug_text(self, fm, prefix ="", x = 0, y = 0):
        self.add(Text(prefix +
             " | ".join([str(fmi.number)+'@y='+format(fmi.get_y(), ".2f") for fmi in fm if type(fmi).__name__ == 'Integer']),
                    font_size=22, font='monospace').set_x(x).set_y(y))

重复项不是克隆,而是相同的对象,这些值重复为 重复 很明显,结果是一团糟。

可能的解决方案
a。新现场不在现场

避免现场已经存在新对象的情况:

Mobjectsenter image description here 对于复杂的场景和类型的类型,这可能过多 在这里解决的转换,因为它涉及所有 不受转换影响的

2

对象。在 上面的示例有4 + 3 + 2 + 1 s构造,而不是 原始4.

B。使用场景#remove
每次转换之后,
the(
y = -0.67
y = 0.66
) 步骤完全删除被替换的
3
y = 0.66
注意,在

y = 2

中,是

Mobject

不再是现场,因为它已被它删除

class ReplacementTransformOrTransform(Scene): def construct(self): # set up the numbers r_transforms = [VGroup(*[Integer(i) for i in range(j, 5)]) for j in range(1, 5)] for r_transform in r_transforms: r_transform.arrange(direction=UP, buff=1).to_edge(UP, buff=1.5) # step 0 self.add(r_transforms[0]) # step 1 self.play(ReplacementTransform(r_transforms[0], r_transforms[1])) # step 2 self.play(ReplacementTransform(r_transforms[1], r_transforms[2])) # step 3 self.play(ReplacementTransform(r_transforms[2], r_transforms[3])) self.wait()

如第一部分所示。这是
VGroup
不 抱怨如果找不到对象。

在任何情况下,

Integer

self.remove(mobject)
的呼叫(由

self

)
是多余的,实际上可以获得相同的效果
通过在任何地方使用
Scene
而不是
Mobject

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.