demo チュートリアル

このチュートリアルでは、リポジトリのターミナルデモの動かし方を説明します。アニメーションするシーン、露光効果、記録と再生、静止画、動画の書き出しです。必要なのはリポジトリのクローンとネイティブの MoonBit ツールチェーンで、コードは書きません。

クイックスタート

リポジトリのルートで、球のシーンを 48 × 14 のフレームに 1 枚描画します。

COLUMNS=48 LINES=15 moon run src/demo --target native -- --sphere --once

出力(画面をクリアするエスケープシーケンスの後):

................................................
................................................
................................................
................................................
....................*#%%%%@@....................
..................=+**##%%%%@@..................
................. -+**####%%%%#.................
................. :=++**#######.................
..................:-==++******..................
.....................-====+=....................
................................................
................................................
................................................
................................................

球は右上から照らされ、左下の面は光源に背を向けるので最も暗い文字で描かれます。--once を外すとデモは動き続けます。止めるには Ctrl-C を押してください。

よくある作業

アニメーションするシーンを見る

just のレシピはターミナルを測ってそのサイズをデモに渡します。

just cube        # spinning cube (the default scene)
just torus       # spinning torus
just hitchcock   # dolly zoom with a central cube and background shapes
just dolly       # dolly zoom against a wall of discs

just を使わない場合は COLUMNS と LINES を自分で設定します。たとえば COLUMNS=$(tput cols) LINES=$(tput lines) moon run src/demo --target native -- --torus です。

モーションブラーを加える

--long-exposure は直前の動きを 12 回描画したものを各フレームに平均し、--flow-exposure はまずそれらをオプティカルフローで位置合わせするので、輪郭がより鮮明になります。

moon run src/demo --target native -- --hitchcock --long-exposure
moon run src/demo --target native -- --torus --flow-exposure

露光フレームのコストは通常のおよそ 12 倍(フローによる位置合わせではさらにずっと多く)なので、大きなターミナルでは動きが遅くなります。

シーケンスを記録して再生する

mkdir -p target
moon run src/demo --target native -- --torus --record target/torus.tui3d --duration 4 --fps 24
moon run src/demo --target native -- --play target/torus.tui3d

--record はすべてのフレームを先に描画し、最後にファイルを書きます。長い記録では代わりにフレームをストリーミングします。

COLUMNS=240 LINES=91 moon run src/demo --target native -- \
  --dolly --record-stdout --duration 12 --fps 24 > target/dolly.tui3d

静止画を書き出して表示する

moon run src/demo --target native -- --hitchcock --export-image target/hitchcock.tuiimg
moon run src/demo --target native -- --show-image target/hitchcock.tuiimg

just export-image と just show-image は既定のシーンについて同じことをします。

記録を動画にする

python3 tools/tui3d_to_video.py target/dolly.tui3d target/dolly.mp4

変換ツールには Python 3、Pillow、FFmpeg が必要です。tools/README.md を見てください。

さらに進んで

デモはライブラリの上の薄い層です。各フレームは @frontend.build_draw_list に続く @tui.render_frame で、露光モードは @tui.draw_list_to_tui_luma、LumaBuffer::add_weighted_sample、estimate_optical_flow を使います。TUI チュートリアルと並べて src/demo/main.mbt を読めば、自分のプレーヤーを作れます。トーラスとドリーのシーンのブラウザ版は demo_canvas と demo_gsap にあります。

よくある落とし穴

  • ネイティブターゲット。 デモは時計、環境変数、ファイルを読むので、--target native で実行してください。
  • ターミナルのサイズ。 COLUMNS と LINES がないとデモは 80 × 32 を使い、小さなターミナルではスクロールすることがあります。多くのシェルはこれらの変数を子プロセスに渡しませんが、just のレシピは設定します。
  • 整数のオプション。 --duration と --fps は整数を取ります。パーサは数字だけを残すので、0.5 は 5 になります。
  • 未知のオプションは無視される。 つづりを誤ったオプションは、黙って回転する立方体に戻ります。
  • CPU の使用。 ライブループはフレームの間に時計をポーリングし、コアを 1 つ使い続けます。

次のステップ

  • demo API にはすべてのオプションとモードの優先順位が載っています。
  • ドリーズームの導出と露光モードの説明は demo の設計にあります。
  • デモの背後にあるライブラリの呼び出しは TUI チュートリアルで示しています。