的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,什么都没有留下。
Transform()
解释
问题是在
现场已经存在的另一个场景是不行的。
当前实施的方式ReplacementTransform
源代码中有两个位置与此相关的位置:
Mobject
本质上是
ReplacementTransform
随后是Mobject
,
请参阅transform.py#l214,
使用transform.py#l294。
实际上,出于所有意图和目的,在原始源代码中,
ReplacementTrasnform(mobject, target_mobject)
Transform(mobject, target_mboject)
scene.replace(mobject, target_mobject)
在这里theself.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)
已经在现场,则
将重复,在.mobjects
表示,在您的场景(
old_object
部分)中,您将拥有 the:
new_object
您代码的以下更改仅包含
new_object
部分
并添加一个展示这些and的现场调试文本
Mobject
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。新现场不在现场避免现场已经存在新对象的情况:
Mobjects
对于复杂的场景和类型的类型,这可能过多
在这里解决的转换,因为它涉及所有
不受转换影响的
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
。