🗿

Geminiで3Dモデルを作ってみた

に公開

この記事は jig.jp Engineers' Blog Advent Calendar 2025 の12月1日分の記事です。

はじめに

生成AIの登場により、専門的な3Dモデリングツールの操作スキルを持たない人でも、誰でも簡単に3Dモデルを作成できるようになりました。

例えば、Meshyのようなサービスを利用すれば、テキストや画像をもとに3Dモデルを生成できます。

Meshyでプロンプトに「恐竜」と入力するだけで、以下のような3Dモデルが生成されます。

Meshyで生成した恐竜の3Dモデル

本記事では、3D生成専用のAIではなく、テキストを扱うのが得意な汎用的なLLM (Gemini 3.0 Pro)を使って、3Dモデル(OBJ形式)を生成してみます。

頂点座標データの直接生成

OBJ形式ファイルとは、頂点座標が記述された以下のようなテキスト形式のファイルです。

# Dinosaur Model
# Vertices: 120
# Faces: 90
o Dinosaur
v -1.5000 3.2500 -3.0000
v 1.5000 3.2500 -3.0000
v 1.5000 6.7500 -3.0000

Geminiに

恐竜の3DモデルのOBJファイルを作ってください

とプロンプトを入力し、出力されたテキストをOBJ形式で保存し、Macのプレビューで表示させると、以下のような3Dモデルになりました。

ブロック数個で作ったようなモデル

とてもシンプルな3Dモデルになりました。

頂点座標データ出力用Pythonコードの生成

もう少しポリゴン数を増やしたいので、OBJデータを直接生成させるのではなく、OBJファイルを生成するためのPythonプログラムを出力してもらう方法に切り替えます。

Geminiに以下のプロンプトを入力します。

恐竜の3DのOBJファイルを作るPythonプログラムを書いて。
numpyを使って頂点とメッシュを定義し、OBJ形式で出力してください。

Pythonのソースコードを実行して出力されたファイルをプレビューすると、ちょうどよいポリゴン数になりました。

ラグビーボール十数個で構成されたような3Dモデル

自動化とセキュリティ

ここからは、3Dモデルを自動で大量生成するために処理をスクリプト化していきます。

Geminiの利用には様々なAIモデルを従量課金で利用できるOpenRouterを使用します。

AIが生成したPythonプログラムを中身の確認なしに自動実行することになるため、セキュリティを考慮して3Dモデルを生成するたびに新しいDockerコンテナを立ち上げる仕組みにすることで、安全性を確保します。

頂点座標を効率的に計算するために、数値計算ライブラリであるnumpyが利用可能なPython環境を構築するDockerfileを作成します。

FROM python:3.14-slim
WORKDIR /app
RUN pip install --no-cache-dir numpy
CMD ["python", "script.py"]

OpenRouterのAPIでGeminiを呼び出して、レスポンスからPythonコードを抽出して、それをDockerコンテナで実行する一連のPythonプログラムを作成します。

import os
import re
import sys
import subprocess
from pathlib import Path
import requests

request = sys.argv[1]
tmp_dir = Path.cwd() / "tmp"
output_dir = Path.cwd() / "output"
tmp_dir.mkdir(exist_ok=True)
output_dir.mkdir(exist_ok=True)

prompt = f"{request}の3DのOBJファイルを作るPythonプログラムを書いて。numpyを使って頂点とメッシュを定義し、OBJ形式で出力してください。ファイルは /app/output/{request}.obj に保存してください。outputディレクトリが存在しない場合は作成してください。実行可能な完全なコードを提供してください。"

print("-- GeminiでPythonプログラム生成 --")
print(prompt)

response = requests.post(
    "https://openrouter.ai/api/v1/chat/completions",
    headers={"Authorization": f"Bearer {os.environ['OPENROUTER_API_KEY']}"},
    json={"model": "google/gemini-3-pro-preview", "messages": [{"role": "user", "content": prompt}]}
)
ai_response = response.json()["choices"][0]["message"]["content"]

print("-- Geminiの回答 --")
print(ai_response)

matches = re.findall(r"```(?:python)?\s*\n(.*?)\n```", ai_response, re.DOTALL)
code = matches[0] if matches else ai_response

Path("tmp/script.py").write_text(code)
print("-- Pythonコード --")
print(code)

print("-- Dockerで実行 --")
subprocess.run(["docker", "build", "-t", "lowpoly-sandbox", "."], check=True)
subprocess.run(["docker", "run", "--rm", "-i",
    "-v", f"{tmp_dir}/script.py:/app/script.py:ro",
    "-v", f"{output_dir}:/app/output:rw",
    "--network", "none",
    "--memory", "512m",
    "--memory-swap", "512m",
    "--cpus", "1",
    "--pids-limit", "50",
    "--ulimit", "nofile=100:100",
    "lowpoly-sandbox"
],check=True, timeout=30)

実行方法

OPENROUTER_API_KEY="xxx” python lowpoly.py "恐竜”

まとめと実行結果

安全かつ効率的に3Dモデルを量産できる環境が整いました。
1つの3Dモデルの生成にかかるOpenRouterのAPIの費用は0.05ドルでした。

最後にこのシステムで生成した3Dモデルのサンプルを掲載します。

レッサーパンダ

かわいいレッサーパンダの3Dモデル

うさぎ

かわいいうさぎの3Dモデル

jig.jp Engineers' Blog

Discussion