本記事は Zenn に公開した記事の転載です。
【夏、再構築中。#1】MacのローカルAIだけで、ゲーム用3Dアセットを100点以上・完全無料で量産した話
はじめまして。StudioMidoriと申します。ひとりで、Unreal Engine 5 を使って「90年代の夏休みゲームの、あの空気感」を再現する協力ゲーム(仮題「エンガワ・サマー」)を制作しております。
この連載「夏、再構築中。」では、制作の技術的な中身を、成功も失敗も包み隠さず記録してまいります。丁寧に、しかしときどき本音がこぼれる感じで。
第1回のテーマは、個人開発における永遠の難題――**「3Dアセット、どうやって用意するのか問題」**です。結論を先に申し上げます。Mac1台・ローカルのAIだけで、追加課金ゼロ、100点以上を生成しました。 その構成と、つまずいた点を共有いたします。
構成:画像生成 →「画像→3D」変換の2段パイプライン
使ったのは、すべてローカルで動く無料のツールです。
| 工程 | 使用ツール | 補足 |
|---|---|---|
| ① 参照画像の生成 | ComfyUI + SDXL(RealVisXL) | 「無地白背景に浮いた1990年代の丸ポスト」等の"商品写真"を生成 |
| ② 画像→3D変換 | Hunyuan3D-2(fp16, 約4.9GB) | 単一画像から3Dメッシュ(GLB)を生成 |
| ③ 実行環境 | Apple Silicon Mac / MPS | クラウドAPIは一切不使用 |
Hunyuan3D は本来 CUDA(NVIDIA)前提の空気が濃いのですが、Apple Silicon の MPS でも一応動きます。ここ、地味にいちばん心配していた部分でした。過去に別の3D系モデルが MPS 上の未実装オペレーターで綺麗に爆散した前科があるもので……。今回は無事に完走してくれました。えらい。
実測値は以下のとおりです。
-
生成時間:約 6〜8分/個(
octree_resolution256〜320) -
GPU使用率:生成中は Device Utilization 100%(
ioregで確認。サボっていない証拠です) - 出力メッシュ:自販機1点で 約709,000頂点 / 35万トライアングル(後述しますが、これは後で問題になります)
品質を左右するのは、8割が「入力画像の作り方」
やってみて痛感したのですが、3Dの出来は、入力画像でほぼ決まります。試行錯誤の末、以下のレシピに落ち着きました。
- 箱型は正面/円筒・球体は斜め45度から撮る(形状を正しく推定させるため)
-
「白い虚空に浮かせる」プロンプトを入れる(
levitating in an empty white void, nothing underneath)
→ これを入れないと、物体の下の床や影が地面ごと立体化され、羽根の生えた自販機が爆誕します -
ネガティブに
podium, plinth, table, shadowを厳命(商品写真は放っておくと勝手に展示台に乗せてきます) -
文字は一切描かせない(
no text+ ネガティブにchinese characters, garbled text)
最後の「文字」がとにかく鬼門でして。看板に日本語を入れようとすると、画像AIは自信満々に"中国語のような何か"を捏造してきます。ここは早々に諦め、看板はすべて無地で生成し、実際の文字は後でエンジン側で正しいフォントを貼る方針にしました。……この判断、後で「著作権的にも大正解だった」と気づくのですが、それはまた別のお話。
▼ 入力画像(左)と、生成された3Dの3面シルエット(右)
盛大にコケた記録(ここがいちばん役に立ちます)
綺麗な成功例だけ並べるのは技術記事として不誠実なので、再現性のある失敗を共有します。
失敗①:薄い・小さい物は「パンケーキ化」する
平成の象徴たる折りたたみ携帯。生成した結果は、厚み方向の情報が死に、ぺったんこの煎餅でした。プロンプトを何度いじっても厚みが出ません。
原因:単一視点の image-to-3D は、見えない面を推測で埋めるため、薄く小さい物ほど破綻します。
対策:携帯・ポケベル・カセットのような薄物はAIに通さないと割り切り、後でエンジン側の単純な箱プリミティブで作ることにしました。適材適所です。
失敗②:石像が無断で「増殖」する
お地蔵さんを1体お願いしたところ、2体並んで生成され、それが融合した二頭身の何かが出てきました。
対策:プロンプトに one single ... , only one figure と明記し、ネガティブに multiple, two を追加。狛犬も稲荷の狐も、この一言で単体に戻りました。AIは放っておくと気を利かせて増やしてくるので、はっきり「1体で結構です」と伝えるのが肝心です。
失敗③:コード・アンテナが「宙に散る」
ゲーム機のコントローラーを生成したら、ケーブルが分解されて空中に浮遊するスパゲッティになりました。
対策:細い付属物(コード/アンテナ/紐)はプロンプトから除外。本体だけを作り、線は後で足します。
歩留まりは約85%。ただし、大きな落とし穴が待っていた
塊のある物(家・家電・像・車・建物)に絞れば、歩留まりは概ね85%。三輪車やトラクターのような「車輪付き」は、車輪が強い構造ヒントになるのか、驚くほど綺麗に決まりました。
有機物(動物)も、思ったより形になってくれます。
ところが、生成した66点を検査して判明した事実がひとつ。
生成されたGLBには、UVも法線もマテリアルも存在しません。全部、のっぺりしたグレーの塊です。
つまり「テクスチャを1枚貼る」という常識的な着色ができない。ここが次の山でございます。
この時点の私は「エンジン側でまとめて色を乗せれば済む」と考えておりました。結論を先に申し上げますと、この見通しは後日ひっくり返ります。 何をどう外したのかは、次回に。
まとめと、次回予告
- Mac + ローカルAIだけで、ゲーム用3Dを無料量産できる(塊物なら歩留まり85%)
- 品質は入力画像が8割。虚空に浮かせ、文字は描かせず、像には「1体で」と念を押す
- 出力はUV・マテリアルなしのグレーメッシュ。この着色をどうするかが次の課題
次回は、この量産した100点を Unreal Engine に取り込んで、実際に動く形にするまでを、つまずいた所ごとPythonスクリプトつきで共有する予定です。「グレーの塊たちに、命ならぬ"色"を吹き込む回」でございます。
……と申し上げたいところですが、正直に前置きしておきます。この回で私は、着色の方針を一度まるごと作り直すことになります。
制作の進捗は X(@StudioMidori)で、毎日こまめに垂れ流しております。よろしければフォローして、夏が1ピクセルずつ再構築されていく様を、生温かく見守っていただけますと幸いです。
――StudioMidori





