taichiのトリセツ① ~mp4とgifで出力~


経緯

taichiに昨日からハマっているので、色々使ってみつつ、適宜情報を共有していこうと思います。今回は、作成したグラフィックをmp4またはgifとして出力するやり方を紹介します。詳しくは公式のドキュメントをご覧ください。taichiについての初めての記事はこちらです。

ffmpegのインストール

動画を出力する際にtaichiはffmpegを使用するので、インストールしていない場合はインストールしてください。

$ sudo apt update
$ sudo apt -y upgrade
$ sudo apt install ffmpeg

スクリプト

今回は試しにリポジトリのexamplesの中にあるfractal.pyの実行結果を、動画として出力してみます。コメントアウトの追加の下のブロックを、デフォルトのコードに追加しています。

fractal.py
import taichi as ti

ti.init(arch=ti.gpu)

n = 320
pixels = ti.field(dtype=float, shape=(n * 2, n))


@ti.func
def complex_sqr(z):
    return ti.Vector([z[0]**2 - z[1]**2, z[1] * z[0] * 2])


@ti.kernel
def paint(t: float):
    for i, j in pixels:  # Parallized over all pixels
        c = ti.Vector([-0.8, ti.cos(t) * 0.2])
        z = ti.Vector([i / n - 1, j / n - 0.5]) * 2
        iterations = 0
        while z.norm() < 20 and iterations < 50:
            z = complex_sqr(z) + c
            iterations += 1
        pixels[i, j] = 1 - iterations * 0.02


gui = ti.GUI("Julia Set", res=(n * 2, n))
# 追加↓
result_dir = "./results"
video_manager = ti.VideoManager(output_dir=result_dir, framerate=24, automatic_build=False)

for i in range(100):
    paint(i * 0.03)
    # gui.set_image(pixels)
    # gui.show()
    # 追加↓
    pixels_img = pixels.to_numpy()
    video_manager.write_frame(pixels_img)
    print(f'\rFrame {i+1}/100 is recorded', end='')

# 追加↓
video_manager.make_video(gif=True, mp4=True)
print(f'MP4 video is saved to {video_manager.get_output_filename(".mp4")}')
print(f'GIF video is saved to {video_manager.get_output_filename(".gif")}')

デフォルトではgui表示されますが、今回はfor文の中のgui表示処理の代わりに、VideoManagerを使ってframeを動画にしていきます。上のプログラムを実行するとresultsフォルダの下にmp4とgifファイルが作成されます。gifはこんな感じになります。

まとめ

taichiは何に使えるか全くわかりませんが、面白いので色々探検してみようと思います(笑)。

間違いや質問、ご意見等ありましたらお気軽にコメントください。頑張って答えますので(笑)。