スタジオを訪問したり、CGアーティストとパイプライン設計について話し合ったりすると、話題に上がることが多いのがファイル階層です。フォルダ構造は一見シンプルに見えるかもしれませんが、スケーラブルで保守可能な階層を作るには、慎重な計画が必要です。
以前の記事でファイル階層の設計について取り上げたので、今回は理論ではなく実装に焦点を当てます。このチュートリアルでは、Kitsu APIとそのPythonクライアントであるGazuを使って、生産構造を自動生成し、タスクを作成し、完全なファイルツリーを構築する方法を学びます。
それでは、最初のパイプライン自動化チュートリアルを始めましょう。
手順1:Kitsu APIを設定する
このチュートリアルの例を実行する前に、ローカルネットワークからアクセス可能なサーバー上で動作するKitsuインスタンスが用意できていることを確認してください。
すぐに始めたい場合は、Dockerでサーバーを起動することができます:
docker build -t cgwire .
docker run
-ti --rm
-p 80:80
--name cgwire
-v zou-storage:/var/lib/postgresql
-v zou-storage:/opt/zou/zou/thumbnails
cgwire
この後のチュートリアルでは、APIが次の場所で利用できると仮定します:
http://localhost/apiPythonクライアントをインストールする
GazuのPythonクライアントをインストールします:
pip install gazu
APIに接続する
build_file_tree.pyという新しいファイルを作成し、次のコードを追加します:
import gazu
gazu.set_host("http://localhost/api") gazu.log_in("admin@example.com", "default")
この時点で、スクリプトはKitsu APIに接続され、生産データを作成する準備が整います。
手順2:アセットとショットを作成する
次に、いくつかのアセットとショットを含むサンプルのプロダクションを作成します。
new_prod = gazu.project.new_project("Super Production")characters = gazu.asset.new_asset_type("Characters") props = gazu.asset.new_asset_type("Props")
rabbit = gazu.asset.new_asset(new_prod, characters, "Rabbit") monkey = gazu.asset.new_asset(new_prod, characters, "Monkey") chair = gazu.asset.new_asset(new_prod, props, "Chair")
episode = gazu.shot.new_episode(new_prod, "E01") sequence = gazu.shot.new_sequence(new_prod, episode, "SE01")
gazu.shot.new_shot(new_prod, sequence, "SH01") gazu.shot.new_shot(new_prod, sequence, "SH02") gazu.shot.new_shot(new_prod, sequence, "SH03")
このスクリプトにより作成されます:
- 1つのプロジェクト:Super Production
- 3つのアセット:Rabbit、Monkey、およびChair
- 1つのエピソードとシーケンス
- 3つのショット:SH01、SH02、およびSH03
手順3:タスクを作成する
プロダクションの構造が整ったら、アーティストが取り組むタスクを作成します。
modeling = gazu.task.get_task_type_by_name("Modeling") setup = gazu.task.get_task_type_by_name("Setup") animation = gazu.task.get_task_type_by_name("Animation") render = gazu.task.get_task_type_by_name("Render")for asset in gazu.asset.all_assets_for_project(new_prod): gazu.task.new_task(asset, modeling) gazu.task.new_task(asset, setup)
for shot in gazu.shot.all_shots_for_project(new_prod): gazu.task.new_task(shot, animation) gazu.task.new_task(shot, render)
これにより作成されます:
アセットのタスク
- Modeling
- Setup
ショットのタスク
- Animation
- Render
これで、各アセットとショットにプロダクション作業のためのタスク構造が用意されました。
手順4:ファイル階層を生成する
プロジェクト、アセット、ショット、タスクが作成できたので、それに対応するフォルダ構造を生成できます。
import osgazu.files.set_project_file_tree(new_prod, "simple")
for asset in gazu.asset.all_assets_for_project(new_prod): for task in gazu.task.all_tasks_for_asset(asset): path = os.path.dirname( gazu.files.build_working_file_path(task) )1: os.makedirs(path, exist_ok=True)
for shot in gazu.shot.all_shots_for_project(new_prod): for task in gazu.task.all_tasks_for_shot(shot): path = os.path.dirname( gazu.files.build_working_file_path(task) )1: os.makedirs(path, exist_ok=True)
このスクリプトが行うこと
simpleのファイルツリーテンプレートを適用する- すべてのタスクに対してファイルパスを生成する
- 必要なディレクトリを自動で作成する
- プロダクション全体で構造が一貫することを保証する
生成されるフォルダ構造
スクリプトを実行すると、次のディレクトリツリーが作成されます:
my_root_folder/
└── productions
└── super_production
├── assets
│ ├── characters
│ │ ├── monkey
│ │ │ ├── modeling
│ │ │ └── setup
│ │ └── rabbit
│ │ ├── modeling
│ │ └── setup
│ └── props
│ └── chair
│ ├── modeling
│ └── setup
└── shots
└── se01
├── sh01
│ ├── animation
│ └── render
├── sh02
│ ├── animation
│ └── render
└── sh03
├── animation
└── render
フォルダ構造をカスタマイズする
生成される階層はテンプレートによって制御されます。スタジオのパイプライン要件に合わせてカスタマイズできます。
例のテンプレート:
{
"working": {
"mountpoint": "/my_root_folder",
"root": "productions",
"folder_path": {
"shot": "<Project>/shots/<Sequence>/<Shot>/<TaskType>",
"asset": "<Project>/assets/<AssetType>/<Asset>/<TaskType>"
}
}
}
これらのパスを変更することで、自動化スクリプトを変えることなく、あらゆるプロダクションのワークフローに合わせて階層を適応できます。
ファイル階層の作成を自動化する理由は?
小規模なテストプロジェクトであれば手作業でフォルダを作成することも可能ですが、プロダクションが大きくなるとすぐにエラーが起きやすくなります。
Kitsu APIを使うことで、次のことが可能になります:
- プロジェクトをプログラム的に作成する
- チーム間でフォルダ構造を標準化する
- 手作業によるセットアップミスをなくす
- 何千ものアセットやショットにスケールする
- パイプライン設定を集約して保守可能に保つ
Pythonをほんの数行書くだけで、プロダクションデータとそれに対応するファイル構造の両方を生成でき、初日からアーティストに一貫した環境を提供できます。
CGパイプライン、プロダクション管理、ワークフロー自動化に関心がある方は、ぜひ他の記事もチェックしてみてください!



