Manim,不带变换的替换变换

Manim, ReplacementTransform without Transform

我是 manim 的新手。

与以下示例一样,

class scene_example(Scene):
    def construct(self):
        txt1 = Text("Text1")
        txt2 = Text("Change to this text without animation")

        self.play(FadeIn(txt1))
        self.play(ReplacementTransform(txt1, txt2))

有没有方便的功能把txt1“替换”成txt2? (即没有“变形”动画?)

class scene_example(Scene):
    def construct(self):
        txt1 = Text("Text1")
        txt2 = Text("Change to this text without animation")
        
        self.play(FadeIn(txt1))
        self.play(FadeOut(txt1), FadeIn(txt2) )

这段代码会做我想做的,但我觉得可能会有类似 ReplacemnetTransform 的功能来实现简单的“替换”动画。我尝试为 FadeIn 和 FadeOut 创建一个函数,但是那不起作用。

class q(Scene):
    def construct(self):
        def Replace(self, mObj1, mObj2):
            self.play(FadeIn(mObj1),FadeOut(mObj2))

        txt1 = "HI"
        txt2 = "HI2"

        self.play(FadeIn(txt1))
        Replace(txt1, txt2)

在您尝试编写的代码中:

class q(Scene):
    def construct(self):
        def Replace(self, mObj1, mObj2):
            self.play(FadeIn(mObj1),FadeOut(mObj2))

        txt1 = Text("HI")
        txt2 = Text("HI2")

        self.play(FadeIn(txt1))
        Replace(txt1, txt2)

参数 self 不会自动传递给 Replace 函数。一种解决方案是更换 Replace(txt1, txt2)Replace(self, txt1, txt2).

另一种选择是根本不让 Replace 使用 self 参数。代码

class q(Scene):
    def construct(self):
        def Replace(mObj1, mObj2):
            self.play(FadeIn(mObj1),FadeOut(mObj2))

        txt1 = Text("HI")
        txt2 = Text("HI2")

        self.play(FadeIn(txt1))
        Replace(txt1, txt2)

应该也可以。在这种情况下,由于 python 中作用域的工作方式,Replace 中的 self 指的是传递给 construct 方法的 self 参数。在前面的示例中,Replace 有自己的 self 参数,self 参数屏蔽了传递给 construct 的参数,self 在 [=17= 中]指的是Replaceself。 (默认情况下没有任何值,除非在调用 Replace 时给出一个值。事实上,当您尝试 运行 您的代码时,您可能会遇到如下错误 TypeError: Replace() missing 1 required positional argument: 'mObj2')

另一种可能性是在 q class 内部定义 Replace,但在 construct 方法之外:

class q(Scene):
    def Replace(self, mObj1, mObj2):
        self.play(FadeIn(mObj1),FadeOut(mObj2))

    def construct(self):
        txt1 = Text("HI")
        txt2 = Text("HI2")

        self.play(FadeIn(txt1))
        self.Replace(txt1, txt2)

此外,如果您只想用一些完全没有动画(甚至没有淡入和淡出)的新文本替换初始文本,那么您可以使用

self.remove(txt1)
self.add(txt2)

一个更复杂的选项是创建一个自定义 Animation class,它用两个 MObject 实例化,并在淡入第二个的同时淡出第一个。

class FadingReplace(Animation):
  def __init__(self, obj1, obj2, ...):
    pass
#implementation left as an exercise for the reader

那么你可以使用

self.play(FadingReplace(txt1, txt2))