AniGen を Apple Silicon Mac で動かし、1枚の画像からリグ付き3Dモデルを作る
こんにちは、皆さん。
1枚のイラストから、動かせる3Dキャラクターまで自動で作れたら便利ですよね。ただ、3Dの形だけでなく、骨格と「どの骨でどこが動くか」まで作る必要があります。
さて、今日は AniGen の Apple Silicon 対応版を M1 Max の Mac で動かし、2枚の画像からリグ付き3Dモデルを生成できるか検証しました。
先に結果を書くと、単純なマスコット画像は成功しましたが、細い手足や衣服のある人物イラストは失敗しました。固定条件での完走は2枚中1枚です。
今回検証する内容
AniGen は、1枚の画像から次の3要素をまとめて生成するモデルです。
- mesh: 3Dモデルの表面形状
- skeleton: モデルを動かすための骨格
- skinning weight: 各頂点がどの骨にどれだけ追従するかを表す値
今回は AniGen-mac を使い、Apple の GPU を PyTorch から使うための仕組みである MPS 上で、次を確認しました。
-
mesh.glb、skeleton.glb、背景除去後の画像を生成できるか - GLB に mesh、skin、joint、
JOINTS_0、WEIGHTS_0が入っているか - 単純なマスコットと、複雑な人物イラストで結果がどう変わるか
- 失敗がパイプラインのどこで起きたか
対象の lab: kiarina/labs/2026/07/11/anigen-mac
検証環境の再現
Apple Silicon Mac、macOS 26 以降、Full Xcode 26 以降、mise、uv、Node.js、Google Chrome、FFmpeg が必要です。初回はソース、Python 環境、学習済み weight などで約24 GBを使います。
git clone --depth 1 --filter=blob:none --sparse \
https://github.com/kiarina/labs.git
cd labs
git sparse-checkout set .gitignore .mise/tasks Makefile mise.toml 2026/07/11/anigen-mac
mise -C 2026/07/11/anigen-mac run
初回実行では依存関係と Metal 拡張をビルドし、Hugging Face から学習済み weight を取得します。完了済みの結果は再利用されます。推論をやり直す場合は ANIGEN_FORCE=1 を付けます。
使用したモデルとライセンス
使用条件は次のとおりです。
- AniGen-mac commit:
4ff0baa - weight: VAST-AI/AniGen
- SS Flow:
ss_flow_duet - SLat Flow:
slat_flow_auto - seed: 42
- simplify ratio: 0.95
- texture size: 1024
- bake mode:
fast
Hugging Face のモデルリポジトリは MIT License と表示されています。AniGen 自体のソースコードも MIT License です。
ただし、リポジトリ内の全依存物が一律に MIT という意味ではありません。THIRD_PARTY_LICENSES.md では、FlexiCubes は Apache-2.0、CUDA 用 CUBVH の一部は非商用・研究用途限定とされています。今回の Mac 推論は CUBVH ではなく Metal 用の mtlbvh などを使い、AniGen の README でも CUBVH は学習用で推論には不要と説明されています。実際に利用・配布する場合は、生成物の用途を含め、使用する依存物と最新版の条件を個別に確認してください。
AniGen の仕組み
処理の流れを短くすると、次の3段階です。
- 入力画像から背景を除き、画像の特徴を読み取る
- Sparse Structure で大まかな3D構造を作り、Structured Latent で形状・骨格・skinningを詳しく生成する
- FlexiCubes で内部の数値場から三角形の表面を取り出し、GLBへ書き出す
Sparse Structure は「粗い3Dの設計図」、Structured Latent は「細部を持った内部表現」と考えるとわかりやすいです。FlexiCubes は、その内部表現から実際に表示できる三角形 mesh を作る処理です。
AniGen の特徴は、形状を作った後に別モデルで骨を付けるのではなく、Shape、Skeleton、Skin の3つを同じ空間上の S³ Fields として一緒に扱う点です。これにより、形と骨格の整合した asset を直接作ることを狙っています。
検証結果
MacBook Pro(Apple M1 Max、64 GB)で実行しました。
| 入力 | 結果 | 時間 | mesh抽出時の形状 | 最終成果物 |
|---|---|---|---|---|
miineko1 |
成功 | 751秒 | 358,370 vertices / 716,820 faces | 9,854 vertices / 14,427 triangles / 10 joints |
miineko2 |
失敗 | 879秒 | 1,866,415 vertices / 0 faces | なし |
成功したマスコット画像
mesh.glb と skeleton.glb は GLB 2.0 として読み込めました。rigged mesh には1 mesh、1 skin、10 jointsがあり、skinningに必要な JOINTS_0 と WEIGHTS_0 も含まれていました。animation clipは入っていません。
入力に見えない背面は前面より単純ですが、正面の形と色は概ね反映されています。生成結果を一周して確認できるターンテーブル動画も用意しました。これはカメラを回した確認用動画で、骨を動かしたanimationではありません。
失敗した人物イラスト
画像のsamplingは完了しましたが、FlexiCubes が頂点を作った後、三角形の面が0になりました。そのため、後段のmesh簡略化処理が Input mesh for decimation must be all triangles で停止し、GLBは生成されませんでした。同じ seed の再試行でも0 facesが再現しています。
表面が最初から存在しなかったのかを調べるため、FlexiCubes の直前と直後を計測しました。
scalar values: 16,974,593
finite values: 16,974,592
negative values: 821,173
positive values: 16,153,420
surface cubes: 1,470,942
surface edge references: 7,657,618
output vertices: 1,866,415
output faces: 0
正と負の値があり、約147万個の表面候補も見つかっています。つまり「表面の手掛かりがなかった」のではなく、候補から三角形を決める段階ですべての面が失われました。
失敗の考察
確認できた事実は、約1,678万個の cube を処理したケースで、表面候補と頂点は作られたのに面が0になったことです。また、一部の試行では MPS の command-buffer error も記録されました。
ここからは推測ですが、大規模なindexingを行う FlexiCubes の処理が MPS 上で正しく完了せず、case判定または三角形化の段階で破綻した可能性があります。未修正の AniGen-mac では大きなboolean maskのindexingで範囲外エラーになったため、labでは有効なindexへ明示変換する小さなpatchを当てています。このpatchで1枚目は完走しましたが、2枚目の0-face問題までは解消できませんでした。
2枚目は、1枚目より細い手足、髪、衣服、曲げた脚を含みます。この複雑さが大規模な中間データにつながった可能性はありますが、入力が直接の原因だと断定できるだけの比較数はありません。
検証環境
machine: MacBook Pro (Apple M1 Max, 64 GB)
OS: macOS 26.5.1, arm64
Xcode: 26.6
Metal compiler: 32023.883
Python: 3.10.18
PyTorch: 2.12.0 (MPS available)
NumPy: 1.26.4
Pillow: 12.3.0
checkpointだけで約20 GBあり、初回準備は軽くありません。また、今回は外部motionの適用、骨を動かしたときのskinning品質、別モデルやparameterの比較までは行っていません。
検証後の感想
1枚の画像から、形だけではなく骨格とskinningまで入ったGLBをMac上で作れたのは面白い結果でした。成功例はそのまま3D viewerで確認でき、プロトタイプの素材作りには使えそうです。
一方で、2枚中1枚の成功なので、まだ「画像を渡せば安定してassetになる」とは言えません。失敗が十数分後に起き、初回に約24 GB必要な点も、気軽なツールとしては重いです。次は、画像のリサイズや切り抜き、別のFlow variantで中間データ量と成功率がどう変わるかを試したいです。

