manim-3b1b数学ビデオアニメーションエンジンで

MIT磨く前Gilbert Strangの父代数オープンクラスの直線を、私は非常に高速なハードウェアを感じ、そして見えたが、あなたがたはを理解する前に考えていなかった線形代数、自然、ピンクのアニメーション円内に直接再びペイント、とすることを決めました。その後、私がいることを発見し、このオープンソースのビデオ・フレームワーク、そして学ぶことにしました。3Blue1Brown3B1B

ポータル:GitHubの- 3b1b / manim

イントロダクション&インストール

ビデオフレームがPython、これは単に福音コード犬ですハッハッハ、使用する開発者のためのインタフェース、ラテックスで書かれた数式の使用を提供します。

私はトップダウンモデルは、数学的なデモのために非常に適しており、このフレームワークの小さな発見のAPIの設計は非常に簡単です学びました。

インストールについては、このリンクを詳細にインストールプロセス複数のプラットフォームを示していますが、いないWindowsのために、それのWindowsのREADME公式リポジトリを参照してください。

クイックスタート

高速動作manimエンジンのモードを理解するために、最も簡単な例から始めるでは、アニメーションオブジェクトを理解します

ファイルを作成します。exm1.py

from manimlib.imports import *

class WriteText(Scene):
    def construct(self):
        text = TextMobject("This is a regular text")
        self.play(Write(text))
        self.wait(3)

上記のコードは、高速起動の例であり、我々は効果を見て、コードを再訪しました

manim exm1.py WriteText -pl

そして、それはビデオ、ビデオ、の行ポップアップ表示されます、待ってThis is a regular text、画面の中央から外に書かれて少しずつ。

from manimlib.imports import *

説明するためにこの必要性は、案内パッケージ

class WriteText(Scene):

継承したクラスmanimフレームワーク、アニメーションをされてScene、このクラスのクラス名は、アニメーションの名前です。

def construct(self):

アニメーションmanimの各フレームがあるconstruct方法は、あなたがここにアニメーションロジックを記述する必要があります

text = TextMobject("This is a regular text")
self.play(Write(text))
self.wait(3)

最初の行は、テキストオブジェクトを作成し、あなたの文章を書き、その後、動画を再生するplayメソッドを呼び出しますが、光がTextMobject十分ではありません、再生する必要がアニメーションである、それはWriteテキストアニメーションオブジェクトを受け入れることで、手書きのテキストオブジェクトを出力します。

三行目、待機待ち3秒、したがって、すべての論理的な仕上げ、映画が終了します。

トラックWriteソース方法、分析

# 是一个类,继承自DrawBorderThenFill
# 可以推断出父类也是个动画,代表先绘制出轮廓然后填充的效果
class Write(DrawBorderThenFill):

    # 一些动画配置,这里只定义了数据结构,并没有对值初始化
    CONFIG = {
        "run_time": None,
        "lag_ratio": None,
        "rate_func": linear,
    }

    # __init__,Python中当对象初始化被调用的魔法方法,可以看作构造方法但还是有点区别
    def __init__(self, mobject, **kwargs):
        # 从名字推测是从创建对象时传递的参数中取出配置信息并且设置的,所以我们应该可以在构造该动画时传递参数
        # 并且从方法名中的digest可以推测,传入的参数会和`CONFIG`里的默认参数融合,也就是用户传入了就用用户的,否则用默认的
        # 而CONFIG就相当于给开发者一个该动画有什么属性的提示
        # 后来我跟踪了这个方法的代码,确实是我们推测的情况
        digest_config(self, kwargs)
        # 看起来是根据传入的对象长度来设置默认配置,看看这个方法里写啥了
        self.set_default_config_from_length(mobject)
        super().__init__(mobject, **kwargs)

    # 这就是上面那个默认配置的方法,就是如果用户没设置参数,参数还是初始值的话就根据传入对象的某个方法返回的长度设置
    def set_default_config_from_length(self, mobject):
        length = len(mobject.family_members_with_points())
        if self.run_time is None:
            if length < 15:
                self.run_time = 1
            else:
                self.run_time = 2
        if self.lag_ratio is None:
            self.lag_ratio = min(4.0 / length, 0.2)

上記でWrite私たちが知っていることができ、そこからアニメーションのすべてのソースコード、manimアニメーションは、いくつかの構成を有するクラスであり、直接構成する各オプションの構成は、アニメーションソースにアニメーション化することが可能で通過することができるCONFIGビューのプロパティ、我々設定Writeパラメータ

self.play(Write(text,run_time=10))

アニメーション突然、長い手書きと遅いの多くは、このパラメータはアニメーションの再生時間を制御することがあるので。

またWrite、アニメーションの多くは、選択することができますがあり、manimソース
アニメーションパッケージには、既製のアニメーションの数を定義します。

いくつかは、一般的に使用される導入:

  • フェードインフェード
  • フェードアウトフェード
  • 手書きのテキストを書きます
  • ポップの途中からGrowFromCenter

ここでは、コマンドラインについて話をします

manim exm1.py WriteText -pl

このコマンドを実行すると、manimコンパイル現在のアニメーションとポップアッププレビューは、exm1.pyスクリプトの名前であり、WriteTextファイルが複数のアニメーションを含めることができますので、あなたは、再生したいアニメーションは-pプレビューであり、-l低品質、ならびに対応します-m画質とで--high_quality高精細(以降-h、それが占有助けたので、何の略語はありません)

Mobjectから言えば

Mobjectは、あなたがオブジェクトとして見ることができ、manimが定義されているオブジェクトを、共通Mobjectそこ形状、テキストや数式など

シェイプ

形状は、形状をMobjectサブクラス表現されます

  • スクエアスクエア
  • サークルラウンド
  • 長方形長方形
  • ラインライン
  • 円環
  • ドットポイント

等... mobject / geometry.py複数の図形を見ることができます

from manimlib.imports import *

class Shapes(Scene):
    def construct(self):
        # 创建一个圆形 没有传参 使用的都是默认参数
        circle = Circle(color=YELLOW)
        # 添加到屏幕中
        self.add(circle)
        self.wait(2)

ファイル名を指定して実行発見は黄色の円が画面の中央に配置され、我々は円の定義を見に行きました

# 父类是Arc(弧形)
class Circle(Arc):
    CONFIG = {
        "color": RED,
        "close_new_points": True,
        "anchors_span_full_range": False
    }

    def __init__(self, **kwargs):
        # 调用了弧形的构造器,传入了0和TAU
        # 如果你看Arc类的__init__可以知道传入的0被设置给起始角度,TAU被设置给结束角度,
        # 圆形的结束角度平直觉应该是360,而在manim的contacts.py中也确实是这样定义的
        Arc.__init__(self, 0, TAU, **kwargs)

    # ... some method

え?我々は、それが画面の中央に配置することをカザフスタンの場所、あなたがたについては、この内部情報は表示されませんでしたか?コードを追跡することによって、このプロパティはクラスの一番下に置かれるべきであることを一瞬考えて、私たちはMobjectクラスに対応するコードを見つけます

def reset_points(self):
    self.points = np.zeros((0, self.dim))

初期化時にMobjectは、このメソッドを呼び出している間、我々は情報を知ることができますので、あなたは、その画面の中央で、それが起源の空間に身を置いていることがわかります、すべてのオブジェクトがMobjectから継承されmainm mainm使用する座標系を、後述します

私たちは、形状を示すために、上記の例アニメーション限り迅速に開始することができます

from manimlib.imports import *

class Shapes(Scene):
    def construct(self):
        circle = Circle(color=YELLOW)
        square = Square(color=DARK_BLUE)
        # surround方法让当前图形包裹另一个形状
        square.surround(circle)
        self.add(circle)
        self.play(FadeIn(square))
        self.wait(2)

テキスト

速い、我々はすべて見てき始め、それが良い導入を欠いて、我々のような公式の例を掲載しました

from manimlib.imports import *

class makeText(Scene):
    def construct(self):
        #######Code#######
        #Making text
        first_line = TextMobject("Manim is fun")
        second_line = TextMobject("and useful")
        final_line = TextMobject("Hope you like it too!", color=BLUE)
        color_final_line = TextMobject("Hope you like it too!")

        #Coloring
        color_final_line.set_color_by_gradient(BLUE,PURPLE)

        #Position text
        second_line.next_to(first_line, DOWN)

        #Showing text
        self.wait(1)
        self.play(Write(first_line), Write(second_line))
        self.wait(1)
        self.play(FadeOut(second_line), ReplacementTransform(first_line, final_line))
        self.wait(1)
        self.play(Transform(final_line, color_final_line))
        self.wait(2)

数学の方程式

from manimlib.imports import *

class MathEq(Scene):
    def construct(self):
        eq = TextMobject(r'$$\begin{bmatrix}1&2&3\\4&5&6\end{bmatrix}$$')
        self.add(eq)
        self.wait(3)

これは、実際に使用数式でTextMobjectTextMobjectラテックス言語をサポートする、または単にでエスケープする必要があると言うことです、r'xxx'ネイティブの文字列。

継続するには...

おすすめ

転載: www.cnblogs.com/lilpig/p/12559945.html