🍌

Bananacraft: 4歳の息子と遊ぶために、GeminiでマイクラAI建築エージェントを作った話

に公開

はじめに

今回のハッカソンに向けて制作した "Bananacraft" をご紹介します。
これは、Gemini 3 Pro をマインクラフト専用の「建築エージェント」として活用し、理想の街をマインクラフト上に自律的に建設するシステムです。

ユーザーの「言葉」を起点に、Geminiがコンセプト立案・都市計画・建物設計・施工指示・装飾までをエージェントとして自律的に判断し、様々なツールを呼び分けながらマインクラフトの世界にブロックを積み上げます。

https://youtu.be/EHGDArkTnrg

背景:パパ、お城作って!

私は4歳の男児の父です。
昨年末になんとなく遊んでみたマインクラフトに父子ともに大ハマリしてしまい、週末は「マイクラパーティー」と称してマインクラフトの世界に入りびたる日々を過ごしています。

最初は土を掘ったり、牛や羊を育てたり、弓矢を放ったりしているだけで楽しめたのですが、最近は建築にも興味が出始め、どんどん新しい建物を作るようになりました。

ただ、子供の要求レベルは日に日に上がっていきます。
ついには、

「YouTubeみたいなお城を作って〜」

というお願いをされる日が来てしまいました...
しかしながらそんな無邪気なお願いには、私のプレイスキル的にも、確保できる時間的にも答えることができません。

「ここはひとつ、AIの力でなんとかできないものか……」
と考え、今回の開発に至りました。

なぜ今まで解決できなかったのか?

Minecraftの建築を支援するツール自体は存在します。しかし、既存のMODは「コピー&ペースト」的な効率化はできても、創造的な設計は人間任せです。また、AI画像生成→3Dモデル→ボクセル変換というアプローチも試みましたが、構造的な意味(壁・屋根・窓の区別)が失われ、Minecraftの建築としては破綻してしまいます(詳しくは後述)。

「イメージを伝えるだけで、構造的に正しい建物を自動で建ててくれる」── そんなシステムは、まだ存在していないと考え、開発に至りました。

Bananacraftの概要

Bananacraftは、ユーザから入力される「葉っぱがいっぱいのかっこいい街」といった曖昧なコンセプトをGeminiが受け取り、200x200ブロックという広大な領域を使った街をデザイン・施工するシステムです。

具体的なフローは以下の通りです。

  1. コンセプト立案: ユーザーの言葉から、Geminiがコンセプトアートと詳細な設定を生成。フィードバックを伝えると、文脈を保持したまま改善案を再生成できる対話型のデザインループを搭載。
  2. 都市計画 (Zoning): 200x200のエリアを区画整理し、どこに何を建てるか(住宅エリア、商業エリア、ランドマークなど)をJSON形式で決定。建物同士の衝突検出と自動修正も行う。
  3. インフラ設計: 建物の配置が確定した後、Geminiが空間を俯瞰し、道路・広場・街灯といったインフラをFunction Callingで自動設計
  4. 建築デザイン: 各区画の建築物について、装飾込みの完成予想図構造のみの設計用画像の2枚を生成。
  5. 設計図生成: 設計用画像をGemini 3 Proに入力し、2段階の分析を経て建築指示書(JSON)に変換(後述)。
  6. 施工 & 装飾: RCON経由で構造体を一瞬で建築したあと、AI大工ボットが完成予想図と見比べながら外装の装飾を施工。

技術構成図

システム全体の構成は以下のようになっています。

要素 技術
Frontend Python (Streamlit)
AIモデル Gemini 3 Pro (テキスト/構造化出力/Function Calling), Nano Banana Pro (画像生成)
施工 RCON (即時建築), Mineflayer (装飾ボット)
インフラ PaperMC + Streamlit on Google Compute Engine

Google Compute Engine上に、Minecraft ServerとStreamlit Webアプリを同居デプロイしています。これにより、親子が同じGCEインスタンスに接続し、パパはブラウザからAI建築を指示 → 隣で子どもがMinecraftに入って建物が建つ様子をリアルタイムに体験する、という一体型のUXを実現しています。

開発最大の壁:2D画像からどうやって3D建築を作るか?

開発において最も技術的難易度が高く、苦労したのが 「AIが生成した2D画像から、整合性の取れた3Dデータをどう起こすか」 という点です。

失敗ルート:3D生成AIによるボクセル化

当初は、Meshyのような「画像 to 3Dモデル」の生成AIを使い、生成された3Dメッシュをボクセル(ブロック)化する方法を実装していました。
しかし、このアプローチには致命的な欠点がありました。

  • 意味論(Semantics)の欠如: 3Dモデルを単にボクセルに変換すると、AIは「どこが壁で、どこが屋根か」を理解しません。窓もドアも、ただの色付きブロックの塊になります。
  • 構造の破綻: 結果として、中身が詰まった塊になったり、物理的にありえないブロックの積み上がり方をしてしまい、マインクラフトの建築としてはかなり破綻したものになりました。

解決策:Gemini Visionによる「AI建築士」アプローチ

そこで、諦め半分で 「画像をGeminiに見せて、建築士として振る舞わせる」 方向に舵を切ったところ、大きな手応えを感じました。
画像を直接3Dデータにするのではなく、Gemini 3 Proのマルチモーダル機能を使って画像を解析し、独自の Function Calling(関数呼び出し) 形式で建築指示を出させるアプローチです。

なぜ Function Calling なのか?

最初は「JSONをテキストで出力させてパース」する方式を試しましたが、座標値の整合性が取れず破綻しがちでした。
Function Callingを使うことで、パラメータの型・数値範囲がスキーマレベルで保証され、Geminiの出力が格段に安定しました。

# 定義した建築ツール(Function Calling スキーマ)
TOOL_DECLARATIONS = [
    {"name": "draw_plane",        # 壁・床・傾斜屋根(四辺形サーフェス)},
    {"name": "place_window",      # 窓(ガラス+フレーム+花箱) },
    {"name": "place_door",        # ドア(ポーチ付き)},
    {"name": "place_smart_pillar",# 柱・コラム },
    {"name": "draw_curve_loft",   # アーチ屋根(ベジェ曲面)},
    {"name": "place_decoration",  # ランタン、フェンスなど },
]

2段階生成 ── 画像理解と座標変換の分離

ただし、「画像を見せて一発でFunction Callを出させる」だけでは精度が不十分でした。Geminiは画像の内容を理解できても、それを正確な3D座標に一気に変換するのは難しいという発見がありました。

そこで辿り着いたのが 2段階生成アーキテクチャ です。

Stage 1: 画像 → 構造記述JSON(「何があるか」を言語化)
Stage 2: 構造記述 → Function Call(「どう作るか」を座標化)

Stage 1 では、Geminiが建物画像を分析し、コンポーネント単位で構造を記述します。

# architect.py - Stage 1: 画像 → 構造記述
system_prompt = f"""
建物画像を分析し、以下のJSON形式で構造を記述してください。
幅: {width}ブロック, 奥行: {depth}ブロック

{{"building_type": "cottage",
  "components": [
    {{"name": "front wall", "material": "bricks", "has_windows": true}},
    {{"name": "gable roof", "material": "dark_oak_stairs", "slope": "steep"}}
  ]}}
"""
# temperature: 0.3 (低め=正確な分析重視)

Stage 2 では、この構造記述を入力にFunction Callを生成します。画像を見る負荷から解放されたGeminiは、座標計算に集中でき、精度が大きく向上しました。

# architect.py - Stage 2: 構造記述 → Function Call
system_prompt = f"""
You are a Minecraft architect.
Generate building tool calls to FAITHFULLY recreate the structure.

RULES:
- Use draw_plane with different Y values for sloped roofs
- The roof MUST have a slope - not flat boxes!
- Add windows using place_window
- Add doors using place_door
"""
# GeminiにToolスキーマを渡し、Function Callingで応答させる
response = client.models.generate_content(
    model=model_name,
    contents=user_prompt,
    config=types.GenerateContentConfig(
        tools=[tool_config],  # Function Calling有効化
        temperature=0.5,
    )
)

結果、「豆腐建築(真四角な家)」ベースではあるものの、「ここは屋根だから斜めにする」「ここは柱だから地面まで通す」 といった構造的整合性が保たれた建物を生成することに成功しました。

https://youtu.be/Cy5t_Czwu7I
(30秒の建築デモ動画)

もう一つの壁:装飾をどこに付けるか問題

構造体を建てられるようになった後、次の課題は 装飾 でした。ランタン、花箱、バルコニーなどを「壁のこの位置に」と正確に指定するには、構造の意味的な理解が必要です。

BlueprintAnalyzer:構造の意味解析エンジン

そこで、Stage 2で生成した建築指示を解析し、各要素にID・位置・サーフェス法線(壁がどの方角を向いているか)を付与する BlueprintAnalyzer を実装しました。

解析結果の例:
  ID: 0 | Type: WALL  | Face: SOUTH | Range: (0,0,0)→(12,6,0) | Size: 12x6
  ID: 1 | Type: WALL  | Face: EAST  | Range: (12,0,0)→(12,6,8) | Size: 1x6
  ID: 2 | Type: ROOF  | Face: UP    | Range: (0,6,0)→(12,8,8)
  ID: 3 | Type: WINDOW| Parent: ID:0 | Pos: (3,3,0)

Decorator:装飾AIエージェント

Decoratorは、この要素マップ + 完成予想図(Phase 2で生成した装飾込み画像)を入力に受け取り、decorate_element というFunction Callを発行します。

ポイントは、装飾位置を壁ごとのローカル座標で指定する点です。「ID:0の壁の(3, 4)の位置にランタンを付ける」のように、壁の表面を基準とした相対座標で指定するため、建物がどの向きに建っていても正しく装飾できます。

生成された装飾指示は、RCON経由で即座に反映することも、Node.jsベースの**AI大工ボット(Mineflayer)**をサーバーに参加させてプレイヤーの目の前で1つずつ設置させることもできます。息子はこのボットがお気に入りで、建築中のボットを追いかけ回して遊んでいます。

Gemini活用のまとめ ── 「建築エージェント」としてのGemini

本プロジェクトでは、Gemini 3 Proの複数の能力をパイプライン的に連鎖させ、1つのAIモデルに「都市計画家→建築デザイナー→構造分析士→施工監督→装飾師」という複数の役割を段階的に担わせるエージェント構造を構築しています。

Geminiの能力 活用箇所
チャットセッション コンセプトの対話的な洗練(フィードバック反映)
画像生成 (Nano Banana Pro) コンセプトアート、装飾画像、構造用画像
マルチモーダル理解 建物画像を見て構造を言語化(Stage 1)
Structured Output 都市計画のゾーニングJSON生成
Function Calling 建築ツール呼び出し(Stage 2)、インフラ設計、装飾指示

特にFunction Callingは、建築(6種)・インフラ(3種)・装飾(1種)の計10種のツールに対して使用しています。Geminiが「状況を判断し、適切なツールを選択し、パラメータを決定して実行する」という、まさにAgentic AIとしての振る舞いがシステムの中核です。

最後に:AIネイティブ世代との遊び方

Bananacraftを実際に子供と遊んでみると、こんな反応が返ってきます。

「うーん、なんかちょっと微妙だね」
「屋根はさ、こっちの色が良かったよね」

正直、AIが作ったものに対して容赦ないダメ出しをされます(笑)
ただ、これこそがBananacraftに期待したことだと考えています。

AIネイティブの時代に生きる子どもたち(私たちも含めて)にとって、「どんなものがあったら嬉しいか?」を想像するクリエイティビティと、何が良くて何が良くないかを判断する審美眼を培うことが、ますます重要になっていくと思います。

「こんなものが欲しい」というオーダーに対して、少し物足りないものが出てくる。
すると子供は「じゃあこうしよう!」「次はもっと詳しく言ってみよう」とすぐに発想を転換します。

そして実は、このBananacraft自体もAntigravityを使って開発しており、私自身は1行もコードを手書きしていません。息子がBananacraftに「こんなお城がほしい」と伝え、私はAntigravityに「こんな機能がほしい」と伝える ── 親子そろって、AIとの対話でものづくりをしています。

この遊びを繰り返すことで、これからの時代に欠かせない力を楽しく身に着けることができると信じ、これからも息子とのマイクラパーティーを楽しみたいと思います。

Discussion