画像から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 rembgStep 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 としてゲームに追加して」と指示を出してみました。

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

雨風にさらされ続けた靴じゃん。。。
まとめ
初回はこんなもんでしょう。。。
そう言い聞かせるしかないね!
