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,txt2)

也应该有效。在这种情况下,由于 Python 中作用域的工作方式,self 中的 Replace 指的是传递给 self 方法的 construct 参数。在前面的示例中,Replace 有自己的 self 参数,self 参数屏蔽了传递给 construct 的参数和 {{1} 中的 self } 指的是 ReplaceReplace。 (默认情况下没有任何值,除非在调用 self 时给出一个值。实际上,当您尝试运行代码时,您可能会遇到以下错误 Replace)

另一种可能性是在 TypeError: Replace() missing 1 required positional argument: 'mObj2' 类内部定义 Replace,但在 q 方法外部:

construct

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

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

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

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

一个更复杂的选择是创建一个使用两个 MObject 实例化的自定义 self.remove(txt1) self.add(txt2) 类,并淡出第一个,同时淡入第二个。

Animation

然后你可以使用

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...