rig-service — 3Dモデル自動リグ + VRM化サービス
image-3d などで生成した3Dポリゴンモデル(GLB)に
ヒューマノイドボーンを自動で付与し、ポーズデータで動かせるようにする独立サービス。
image-3d とは HTTP だけで繋がる疎結合で、コードの相互参照は無い
(image-3d 側に IMAGE3D_RIGSVC_URL を設定すると「リグ/VRM化」ボタンが出る)。
設計と実装計画は docs/RIG_SERVICE_PLAN.md を参照。
現在の実装状況
| フェーズ | 内容 | 状態 |
|---|
| R1-1 | bpy 技術スパイク | 完了 |
| R1-2 | Tポーズ自動リグ(autorig.py) | 完了(実Tポーズメッシュで検証済) |
| R1-3 | FastAPI + 直列ジョブキュー + GLBダウンロード | 完了 |
| R1-4 | Godot インポート検証 | 完了(Godot 4.4.1 で合格) |
| R2 | VRM 1.0 出力 | 完了(VRMC_vrm を自前生成) |
| R3 | 3Dプレビュー + モーション + ポーズ駆動 | 完了(VRMA/BVH読み込みのみ未実装) |
| R4 | image-3d 統合 | 完了(「リグ/VRM化」ボタン) |
セットアップ
bpy は cp311 ホイールしか無いため Python 3.11 専用 venv が必要
(システムに 3.11 が無くても uv で sudo 不要に用意できる)。
cd rig-service
uv venv --python 3.11 .venv-rig
uv pip install --python .venv-rig/bin/python -r requirements.txt
venv をディレクトリごと移動した場合、.venv-rig/bin/ のコンソールスクリプトは
shebang に旧パスが残って壊れる。./run.sh と python -m pytest は
python -m 経由なので影響を受けないが、bin/uvicorn 等を直接叩くなら
作り直すか shebang を書き換える。
システム Blender は不要(bpy モジュールで完結する)。
bpy が導入できない環境では Blender 4.5 LTS を入れて
RIGSVC_ENGINE=blender_cli を指定すれば同じスクリプトで動作する。
起動
./run.sh # http://127.0.0.1:8100
使い方
ブラウザで を開き、Tポーズの立ち絵から生成した GLB を
アップロードする。curl の場合:
curl -F "model=@model.glb" -F 'params={"height_m":1.6}' \
http://127.0.0.1:8100/api/rig
# -> {"job_id": "..."}
curl "http://127.0.0.1:8100/api/rig/jobs/"
curl -O -J "http://127.0.0.1:8100/api/rig/jobs//download?format=glb"
API
| メソッド | パス | 説明 |
|---|
| POST | /api/rig | multipart: model(GLB必須)+ params JSON → {job_id} |
| GET | /api/rig/jobs | ジョブ一覧 |
| GET | /api/rig/jobs/{id} | 状態・ボーン数・ウェイト統計・警告 |
| GET | /api/rig/jobs/{id}/download?format=glb|vrm[&motion=] | リグ済み GLB / VRM 1.0(motion 指定でアニメ焼き込み) |
| POST | /api/rig/jobs/{id}/pose | ポーズを適用した GLB / VRM を返す |
| GET | /api/motions | 同梱モーションクリップ一覧 |
| GET | /api/motions/{name} | クリップのキーフレーム |
| GET | /api/rig/jobs/{id}/preview.png | 正面プレビュー(静止画) |
| DELETE | /api/rig/jobs/{id} | ジョブ削除 |
| GET | /api/health | エンジン可否・bpyバージョン |
params
| キー | 既定 | 説明 |
|---|
height_m | 1.6 | 出力の全高(メートル)。VRM/Godot はメートル系 |
up_axis | "auto" | 入力GLBの上方向軸。"z"(image-3d 慣習)/ "y"(glTF仕様) |
facing | `"a | |