ikuzakの備忘録

数学関連のツールTeX,Tikz,Manim,Geogebraなどの備忘録です。

【Manim】addメソッドについて。

過去記事の ikuzak.hateblo.jp についての補足っぽい感じ。

Manimを色々といじったり、ManimCEのReference読んだりしてる内に分かったことをば。

addメソッド

まぁメソッド名からして単に追加をする操作なのだけど。
その対象と挙動について、理解の解像度が上がったので備忘録。

Scene.add

まぁ、ほぼself.addと書くのだが。
言わずもがな、該当のclassに追加される。
ただ、追加したすべてのMobjectはそれが追加された順番で背景から前景に描画される。
イメージとしては、ペンキの上塗りって感じかな?

で、色々試してみた感じ、この仕様はThreeDSceneクラスを使った場合も有効みたいでさ。
3Dとして、「奥行きが表現したい」のに、最後にaddしたMobjectが全面に出てしまう、という現象に遭遇。
本来、その視点からだと手前のMobjectで隠れてくれてないといけないのに、最後にaddしたがために、そういうことになってしまう。。。

うーん、このThreeDSceneでのこの仕様は多分どうしようもない感じかなぁ。 教えて詳しい人…。

Mobject.add

既存のMobjectに追加するメソッド。(例えば、上述の過去記事ではgridというMobjectにaddしてました。)
このMobjectに対するメソッドは、その該当Mobjectのsubmobjectに追加するらしい。
どうやら、submobjectのリストを保持しているらしく、その末尾に追加するようだ。
そのMobjectを構成するパーツみたいな感じに捉えておけばよいのかな?

描画順序の話

んで、ここで重要になってくるのが、Scene.addMobject.addの描画順序である。

以下の2つの例を作ってみた。

例 その1

class AddTest1(Scene):
    def construct(self):
        circle1 = Circle(2,RED,fill_opacity=1).shift(LEFT)
        circle2 = Circle(2,BLUE,fill_opacity=1).shift(RIGHT)
        circle3 = Circle(2,GREEN,fill_opacity=1).shift(DOWN)
        self.add(circle1,circle2,circle3)

例 その2

class AddTest2(Scene):
    def construct(self):
        circle1 = Circle(2,RED,fill_opacity=1).shift(LEFT)
        circle2 = Circle(2,BLUE,fill_opacity=1).shift(RIGHT)
        circle3 = Circle(2,GREEN,fill_opacity=1).shift(DOWN)
        self.add(circle1,circle2)
        circle1.add(circle3)

なかなか、面白い結果になった。
AddTest1の方は「まぁ、そうなるわな」なんだけど、 AddTest2の方はちょっと意外。
circle3は最後に追加しているにも関わらず、circle1.addによって、circle1submobjectとして追加している。
これによってcircle1の一部と解釈されて、self.addした順にしたがって、circle2よりも後ろ側(それ以前に追加した判定)になってしまうみたいだ。

/* -----codeの行番号----- */