画像から 3D を起こす AI の出力 GLB は、そのままではゲームに使えない。頂点が共有されていない三角形の山で、1 体 70MB 超えもざらにある。
これを Blender をヘッドレス (画面なし) で走らせる自動処理に通して、実測で verts 187 万 → 29.4 万、GLB 71MB → 8.5MB まで落とした。
パイプラインの工程と、Blender 4.2 のヘッドレス固有の罠を書く。
画像から 3D を起こす AI の出力 GLB は、そのままではゲームに使えない。頂点が共有されていない三角形の山で、1 体 70MB 超えもざらにある。これを Blender をヘッドレス (画面なし) で走らせる自動処理に通して軽量化した。
実測 (1 体):
- 頂点 1,870,000 → 294,000
- 三角形 624,000 → 40,000
- GLB 71MB → 8.5MB
工程
bpy スクリプト 1 本で、読み込み → join + weld → DECIMATE → 接地 → 検証 → QA レンダー → 書き出し、まで通す。
- join + weld: AI 出力は頂点非共有の三角形スープなので、まず結合して近接頂点を溶接する。これをやらないと後段の削減が正しく効かない
- DECIMATE modifier で目標三角形数まで削減
- 接地: 最下点を Z=0 に揃える (ゲーム側で置くだけで立つ)
- 実 reimport: 書き出した GLB をもう一度読み込んで、頂点数・UV・マテリアルが期待通りか機械チェック
- QA レンダー 3 面: 前・横・斜めを PNG に出して目視
罠 1: Blender 4.2 で EEVEE の名前が変わった
ヘッドレスのレンダーエンジン指定で、EEVEE は BLENDER_EEVEE_NEXT に改名されている。旧名指定だとエラー。版によって分岐する小関数を挟んで吸収した。
罠 2: QA レンダーのカメラは「向き」を間違えると全部空白
カメラの向きベクトルは target - pos。逆に書くと全 PNG が同サイズの空白になるのに、工程のゲート自体は合格で通ってしまう。数値ゲートが緑でも、レンダー結果の中身は必ず目視する。
罠 3: 重さの正体を測ってから道具を選ぶ
別の軽量化案件で「頂点を削れば軽くなる」と思い込んでいたら、実測したら重さの 77% はテクスチャで頂点は 23% だった。正解はテクスチャの 2048 → 512 縮小。inspect スクリプトで内訳を数えてから手を選ぶ。
ついでに: gltf-transform は手軽だが、VRM 拡張を落とす・既定値がマテリアル名を壊す、という副作用があったので用途を選ぶ。
まとめ
- AI 出力 GLB は join + weld してから削減
- ヘッドレス Blender は 4.2 で EEVEE 名が変更済み
- ゲートが緑でもレンダーは目視
- 軽量化は先に「何で重いのか」を数える (テクスチャ 77% の例)
コメント (0)
まだコメントなし。