AI / Gemini / Stable Fast 3D

画像から3Dモデル生成してみたら悲惨な結果に!

はじめに・目的

簡単に3Dモデリングできると聞いて、Stable Fast 3Dで適当にGemini CLiにやらせてみた。結果は悲惨。

開発環境

  • マシン: MacBook Pro (M5チップ, メモリ32GB)
    ※SF3Dはメモリを大食いするため、Macの場合はユニファイドメモリ32GB以上を推奨。
  • Python環境: Python 3.11 (パッケージ管理に uv を使用)
  • ゲームエンジン: Godot 4.6
  • AIモデル: Stable Fast 3D
  • AIクライアント: Gemini CLI

何をしたか

  • Stable Fast 3Dダウンロード
  • Geminiに必要な作業をさせる
  • 画像から3Dモデルを生成
  • Godotで表示(Blendarなど他ツールでも可能)

Step 1: 魔の環境構築(Mac/MPS向け)

SF3Dは主にNVIDIA(CUDA)向けに作られているため、Mac(Apple Silicon)への導入には少し工夫が必要です。最新のPython 3.14等ではライブラリのビルドエラーが起きるため、uv を使って安定した Python 3.11 環境を作ります。

# プロジェクトフォルダの作成と仮想環境(Python 3.11)の用意
mkdir sf3d-godot-pipeline && cd sf3d-godot-pipeline
uv venv --python 3.11
source .venv/bin/activate
# Mac(MPS)用並列計算ライブラリの導入
brew install libomp
# PyTorchのNightly版(Mac最適化版)をインストール
uv pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cpu
# SF3Dリポジトリのクローンと依存パッケージのインストール
git clone https://github.com/Stability-AI/stable-fast-3d .
# ビルドエラー回避のために --no-build-isolation をつけるのがコツ!
uv pip install -r requirements.txt --no-build-isolation
# 背景切り抜きライブラリも追加
uv pip install rembg

Step 2: 3D生成本体スクリプトの作成 (generate_mac.py)

MPSを有効化し、背景が透明でない画像は自動で切り抜く(RemBG)処理を入れた生成スクリプトを作ります。

import torch
import os
import argparse
from PIL import Image
from sf3d.system import SF3D
import trimesh
from rembg import remove
# Mac(MPS)特有の環境変数を強制設定
os.environ['PYTORCH_ENABLE_MPS_FALLBACK'] = '1'
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'
def generate_3d(image_path, output_dir='output'):
    print(f'Loading image from {image_path}...')
    image = Image.open(image_path)

    # 背景透過処理
    if image.mode != "RGBA":
        print("Image is not RGBA. Removing background automatically using rembg...")
        image = remove(image)

    device = 'mps' if torch.backends.mps.is_available() else 'cpu'

    print('Loading SF3D Model...')
    model = SF3D.from_pretrained('stabilityai/stable-fast-3d', config_name='config.yaml', weight_name='model.safetensors')
    model.eval()
    if device == 'mps':
        model = model.to('mps')

    os.makedirs(output_dir, exist_ok=True)
    out_file = os.path.join(output_dir, 'model.glb')

    with torch.no_grad():
        meshes = model.run_image(image, 1024, remesh='none')
        meshes[0].export(out_file)
        print(f'Success! 3D Model saved to: {out_file}')
if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('image_path', help='Path to input image')
    args = parser.parse_args()
    generate_3d(args.image_path)

Step 3: MCPサーバーの作成 (godot_sf3d_mcp.py)

AIから呼び出される窓口となるサーバーを作ります。ここで生成〜Godotへの転送までを一気に処理させます。

import os
import shutil
import subprocess
from mcp.server.fastmcp import FastMCP
# MCPサーバーの初期化
mcp = FastMCP("Godot SF3D Generator")
# ※ご自身の環境に合わせてパスを変更してください
GODOT_PROJ_DIR = "/Users/YourName/GodotProjects/YourGame"
SF3D_SCRIPT = "./generate_mac.py"
@mcp.tool()
def generate_3d_and_import_to_godot(image_path: str, new_model_name: str) -> str:
    """画像から3Dモデルを生成し、Godotプロジェクトに自動インポートするAIツール"""

    if not new_model_name.endswith('.glb'):
        new_model_name += '.glb'
    print("--- 1. 3Dモデル生成開始 (SF3D) ---")
    try:
        subprocess.run(["python", SF3D_SCRIPT, image_path], check=True)
    except subprocess.CalledProcessError as e:
        return f"SF3D生成エラー: {e}"
    print("--- 2. Godotへのインポート開始 ---")
    output_glb = "./output/model.glb"
    target_dir = os.path.join(GODOT_PROJ_DIR, "models", "sf3d")
    os.makedirs(target_dir, exist_ok=True)
    final_dest = os.path.join(target_dir, new_model_name)

    # 出来上がったモデルをGodotフォルダへコピー
    shutil.copy2(output_glb, final_dest)

    # Godotのヘッドレスモードでインポート処理を強制トリガー
    godot_exec = "/Applications/Godot.app/Contents/MacOS/Godot"
    subprocess.run([godot_exec, "--path", GODOT_PROJ_DIR, "--headless", "--editor", "--quit"])

    return f"成功! 画像から3Dモデルを生成し、Godotの {new_model_name} にインポートしました。"
if __name__ == "__main__":
    mcp.run()

Step 4: MCPサーバーとしてGemini CLIに登録

最後に、作成したスクリプトをGemini CLIにMCPサーバーとして登録します。

gemini mcp add godot_sf3d /絶対パス/.venv/bin/python /絶対パス/godot_sf3d_mcp.py

プロンプト

Gemini CLIに下記画像を添付し、「この新幹線の画像を使って、bullet_train.glb としてゲームに追加して」と指示を出してみました。

https://newswitch.jp/p/44919 時速320km・ブレーキ距離15%短縮…JR東日本が開発着手、「東北新幹線」新型車両の全容 より

生成物出力までの流れ

  1. JPG画像から自動的に背景が切り抜かれる(RemBG)
  2. Apple M5のパワーでわずか数秒で高精度な3Dメッシュが生成される
  3. エディタを開くと、Godotのファイルシステムに既に .glb がインポートされている!

実際の生成物

雨風にさらされ続けた靴じゃん。。。

まとめ

初回はこんなもんでしょう。。。
そう言い聞かせるしかないね!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です