フル解像度のレンダーを待ってからショットを確認するのは、制作全体の進行を遅らせます。アーティストは待ち時間に時間を取られ、スーパーバイザーもフィードバックを受け取るのが遅れてしまいます。反復ループの効率が悪いのです。
そこで、Blender上で低解像度のアニメーションプレビューを直接作成し、アニメーションパイプラインの一部としてPythonでKitsuへ自動アップロードしましょう。これらのプレビューはレンダーが速く、レビューしやすく、承認のためにKitsuで素早く利用できます。
これは大きな効果があります。フル解像度のレンダーは数時間かかることがあり、何千ものショットを扱うとクラウドストレージやネットワーク帯域のコストも決して軽くありません。1080pから480pにするだけで、サイズを最大5倍まで(=最大5分の1)にできます!
本チュートリアルでは、次の内容を扱います:
- 低解像度プレビュー用にBlenderのレンダー設定を調整する
- Pythonでレンダープロセスを自動化する
ffmpegを使って動画に透かしとタイムスタンプを追加し、素早く状況を把握できるようにする- 動画を出力し、Kitsuへアップロードする
最後には、レビューにかかる時間を短縮しつつ、フィードバックの質を犠牲にしないスクリプトが手に入ります。
このガイドで紹介している例の統合(インテグレーション)の完全なソースコードは、私たちのGitHubで確認できます:
🔗 https://github.com/cgwire/blender-kitsu-low-res-preview
1. シンプルなBlenderシーンのセットアップ
アニメーション付きプレビューを作る前に、シーン内に開始用のオブジェクトが必要です。このチュートリアルでは、Blenderのデフォルトのキューブを使います。
まず、シーンとキューブの参照を作成します:
import bpy
cube = bpy.data.objects"Cube" scene = bpy.context.scene

2. アニメーション用のキーフレームを追加する
次のステップはキューブをアニメーション化することです。モデリングのプレビューを素早く行うには、短いシーケンスが理想です。ここでは360°回転を48フレーム(24 FPSで2秒)で作成します:
for frame, angle in (1, 0), (12, 1.57), (24, 3.14), (36, 4.71), (48, 6.28):
scene.frame_set(frame)
cube.rotation_euler2 = angle
cube.keyframe_insert(data_path="rotation_euler", index=2)このループは一定間隔でキーフレームを設定し、Z軸の周りにpi/2ずつ滑らかに回転させます。フレーム数を少なくすることでレンダーが速くなり、プレビュー用途に最適になります。
この時点で、Blender上でタイムラインをスクラブして、キューブが期待どおりに回転するか確認できます。
3. 低解像度レンダリング
アニメーションが用意できたら、Blenderで高速で低解像度のプレビューをレンダーするように設定します。目的は品質よりもスピードです。レビューに十分に見やすく、かつ作成が素早いものを目指します。
ここでは、 スピードのためのEeveeレンダリングエンジンを使い、不要なレンダリングのオーバーヘッドを減らします。Eeveeは単純なラスターライズ(画像の格子化)エンジンなので、Cyclesよりはるかに高速です。90%のケースでは、超リアルな出力は必要ありません。
scene.render.engine = "BLENDER_EEVEE"scene.render.resolution_x = 1920 scene.render.resolution_y = 1080 scene.render.resolution_percentage = 50
scene.render.fps = 24 scene.frame_start = 1 scene.frame_end = 48 # アニメーションの長さに合わせてください
scene.render.image_settings.file_format = "FFMPEG" scene.render.ffmpeg.format = "MPEG4" scene.render.ffmpeg.codec = "H264"
scene.render.filepath = "//preview.mp4"
古典的な横長の解像度を使いつつも、resolution_percentageを下げたり、Eeveeで高品質サンプリングをオフにしたりすると、プレビューのレンダー時間を大幅に減らせます。
残りの設定はかなり標準的です。24 FPSで合計48フレーム、出力はH264エンコードのmp4動画(圧縮を速くするため)で、スクリプトの現在のフォルダに書き込まれます。
用途に応じて、解像度、フレームレート、ビットレートを下げれば、プレビューのサイズも小さくできます。ただし、レビュー工程に必要なだけの品質は確保する必要があるので、パフォーマンスとの最適なバランスになるよう設定を調整してください。
最後に、レンダーを1行でトリガーできます:
bpy.ops.render.render(animation=True)
このプレビュービデオは、すぐにレビューに使うことができるほか、Kitsuへアップロードする前にFFmpegのようなツールでタイムスタンプや透かし、または独自の命名規則を追加するなど、追加処理も可能です。
4. FFmpeg処理:タイムスタンプ、命名、透かし
Blenderがアニメーションを動画ファイルにレンダーしたら、次はFFmpegでさらに処理できます。これは 制作パイプラインでよくある手順で、タイムスタンプ、透かし、またはカスタムの命名などを追加して、レビューに使える状態に整えます。
プレビューをレンダーした後、ターミナルで次のコマンドを実行します:
ffmpeg -framerate 24 \\
-i preview.mp4 \\
-i watermark.png \\
-filter_complex "\\
0:vdrawtext=text='%{pts\\:hms}':x=10:y=10:fontsize=24:fontcolor=white:bordercolor=black:borderw=2v1; \\
[v1]1:voverlay=W-w-20:H-h-20" \\
-c:v libx264 -crf 22 -pix_fmt yuv420p \\
preview_with_stamp.mp4drawtextは左上に現在進行中のタイムスタンプを重ねて表示します。overlayは右下に透かし画像(watermark.png)を配置します。c:v libx264 -crf 22 -pix_fmt yuv420pは動画再生の互換性と品質を確保します。- 出力ファイル
preview_with_stamp.mp4が、レビュー準備完了の最終プレビューです。
もちろん、チームやクライアントのレビュー用にプレビューを標準化するため、必要に応じてフォントサイズ、位置、透かしの配置などを調整できます。

これで、制作に向けた低解像度アニメーションプレビューの準備が完了です。ファイルは、素早いフィードバックのためにKitsuへアップロードする準備ができています。
5. Gazu経由でKitsuへアップロードする
低解像度プレビューが用意できたら、ダッシュボードから直接Kitsuへアップロードするか、gazuのPython SDKを使えます。Kitsuは、アーティストやスーパーバイザーがプレビューにすぐアクセスしてレビューできる共同作業型のパイプライントラッカーです。
次のPythonスクリプトは、プロジェクトとタスクを選んでプレビューをアップロードできる、シンプルな対話型CLIを提供します:
import gazudef pickProject(label, list_of_items): """Helper UI to pick one item from a list.""" for i, item in enumerate(list_of_items): print(f"{i + 1}. {item'name'}") idx = int(input(f"Choose {label} number: ")) - 1 return list_of_itemsidx
def pickTask(label, list_of_items): """Helper UI to pick one item from a list.""" for i, item in enumerate(list_of_items): asset = gazu.entity.get_entity(item"entity_id") status = gazu.task.get_task_status(item"task_status_id") type = gazu.task.get_task_type(item"task_type_id")
print(f"{i + 1}. {asset'name'} {type'name'} {status'name'}") idx = int(input(f"Choose {label} number: ")) - 1 return list_of_itemsidx
gazu.set_host("<http://localhost/api>") user = gazu.log_in("admin@example.com", "mysecretpassword")
projects = gazu.project.all_projects() project = pickProject("project", projects)
tasks = gazu.task.all_tasks_for_project(project) task = pickTask("task", tasks)
print("Uploading preview...") task_status = gazu.task.get_task_status_by_name("todo") result = gazu.task.publish_preview( task, task_status, comment="Auto-generated preview", preview_file_path="./preview.mp4", )
print("Done:", result)
まず、gazuであなたの資格情報を使ってKitsuにログインします。ここでは、 Kitsu Dockerによるローカル開発環境のインストールを使用します。このプログラムでは、利用可能な異なるKitsu APIエンドポイントを使って制作データをすべて取得し、そこからプロジェクトとタスクを選択できます:

そして、前のステップで生成したプレビュー動画を、選択したタスクへアップロードします。
完了すると、プレビューはKitsuのレビュー画面で利用可能になり、高解像度のレンダーを待たずに、チームメンバーやスーパーバイザーがフィードバックを出しやすくなります。

レビューエンジンは、フレームに素早く注釈を付け、正確なショットに対してコメントを追加するのに最適です:

6. すべてをまとめる
タスクを最初から最後まで自動化するには、簡単なbashコマンドを書きます:
preview.sh
python3 render.py && ./watermark.sh && python3 upload.pyその後、プレビューを共有する必要があるたびにスクリプトを実行できます:
./preview.sh最終結果を自分で試すには、私たちの Githubリポジトリ blender-kitsu-low-res-previewをご覧ください。
7. アーティスト向けアドオンの概要
この記事の範囲外ですが、このコードをBlenderのアドオンにまとめて、アーティストが簡単に使えるようにすることも可能です。
アップロードするために、制作物(プロダクション)、アセット、タスクを選ぶドロップダウンメニューを格納するメインパネルが必要になります。そして、アップロード用のボタンをクリックするだけでよい形にします。アップロードのロジックでは、レンダリング、透かし処理のためのffmpegをサブプロセスとして呼び出し、さらに一時ファイルを実際にKitsuへ送信します。
詳しくは Blender Add-on UI Developmentに関する記事をご覧ください。
結論
ここまでで、完全なパイプラインを構築できました。Blenderでシンプルな3Dオブジェクトを作り、アニメーションさせ、低解像度のプレビューを生成し、タイムスタンプと透かしを追加し、そしてKitsuへアップロードします。得られるメリットはすぐに明確です:
- より速いレビュー - スーパーバイザーやチームメンバーは、フル解像度のレンダーを待たずに、プレビューをすぐに視聴できます。
- より速い反復 - アーティストはより早くフィードバックを受け取れます。これにより反復ループが短くなり、ボトルネックが減ります。
- より少ない詰まり(ブロッカー) - 自動化されたプレビューとアップロードにより、パイプラインでの反復的な手作業がなくなり、成果物の一貫性が保たれます。
これまで1時間かかっていた手作業は、いくつかのスクリプトで処理できるようになり、チームは制作の「創造的な側面」に集中する時間を増やせます。
さらに、あなたのアニメーションスタジオのニーズに応じてこのワークフローを発展させることもできます。Blenderにボタンやパネルを追加してワンクリックでパイプライン全体を実行したり、単一のスクリプトで複数のショットやシーンのプレビューを自動で一括生成したり、といったことが可能です。


