過去記事の ikuzak.hateblo.jp についての補足っぽい感じ。
Manimを色々といじったり、ManimCEのReference読んだりしてる内に分かったことをば。
addメソッド
まぁメソッド名からして単に追加をする操作なのだけど。
その対象と挙動について、理解の解像度が上がったので備忘録。
Scene.add
まぁ、ほぼself.add
と書くのだが。
言わずもがな、該当のclassに追加される。
ただ、追加したすべてのMobjectはそれが追加された順番で背景から前景に描画される。
イメージとしては、ペンキの上塗りって感じかな?
で、色々試してみた感じ、この仕様はThreeDScene
クラスを使った場合も有効みたいでさ。
3Dとして、「奥行きが表現したい」のに、最後にaddしたMobjectが全面に出てしまう、という現象に遭遇。
本来、その視点からだと手前のMobjectで隠れてくれてないといけないのに、最後にaddしたがために、そういうことになってしまう。。。
Mobject.add
既存のMobjectに追加するメソッド。(例えば、上述の過去記事ではgrid
というMobjectにadd
してました。)
このMobjectに対するメソッドは、その該当Mobjectのsubmobject
に追加するらしい。
どうやら、submobject
のリストを保持しているらしく、その末尾に追加するようだ。
そのMobjectを構成するパーツみたいな感じに捉えておけばよいのかな?
描画順序の話
んで、ここで重要になってくるのが、Scene.add
とMobject.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
によって、circle1のsubmobject
として追加している。
これによってcircle1
の一部と解釈されて、self.add
した順にしたがって、circle2よりも後ろ側(それ以前に追加した判定)になってしまうみたいだ。