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 チュートリアルで示しています。