AIで絵を3Dモデルにしたら厚さ1.3mmの板が出てきた話 3MFを解剖して原因を突き止める

小学生向けのワークショップを準備しています。子どもが描いた絵をAIで3Dモデルに変換し、3Dプリンタで出力して持ち帰ってもらう、という内容です。

生成AIのデモを見る限り、この工程は簡単そうに見えました。実際、絵を渡せばモデルは出てきます。画面の中でくるくる回ります。

ところが、スライサーに読み込んで横から見たら、厚さ1.3mmの板でした。

そこから8回の生成を回して、3MFファイルの中身を全部開けて調べた記録です。

目次

結論

長いので先に書きます。

  • 線画をそのまま3D化すると、平たい板になることがある
  • 同じ画像・同じ設定でも結果が大きくばらつく。しかもその振れ幅は、他のどの要因の効果よりも大きい
  • プロンプトで「厚くして」と指示しても効かない
  • 効いたのは、AIに一度「陰影のある絵」を描かせてから3D化すること
  • 色はGLBやSTLで書き出すと必ず消える。専用の変換を通す必要がある
  • AIの自己申告は当てにならない。自分で測るしかない

測り方

画面のプレビューは信用しないことにしました。理由は後で書きますが、AIが「立体感が出ています」と言っているモデルが板だった、ということが実際に起きたためです。

3MFは実体がZIPなので、解凍すると中のXMLが読めます。3D/Objects/object_1.model に頂点座標が並んでいるので、そこから直接バウンディングボックスを出しました。

import re, numpy as np
pat = re.compile(r'<vertex x="([-\d.eE]+)" y="([-\d.eE]+)" z="([-\d.eE]+)"')
V = [tuple(map(float, m.groups()))
     for line in open('3D/Objects/object_1.model')
     if (m := pat.search(line))]
V = np.array(V)
print(V.max(0) - V.min(0))

あわせて Metadata/model_settings.config に入っている mesh_stat(面数とメッシュ異常の数)と、三角形に付く paint_color 属性(色情報が載っているか)も見ました。

出力サイズが条件ごとに違ったので、奥行はすべて全高60mm換算に正規化して比べています。

実測結果

条件 奥行(60mm換算) 面数
線画・横向き写真 23.7mm 191.6万
4色に塗った絵 9.0mm 199.4万
線画・縦向き写真 1回目 17.2mm 197.7万
線画・縦向き写真 2回目 1.3mm 111.7万
「厚みを持った立体に」と指示 3.4mm 199.4万
旧世代モデルで生成 9.8mm 27.6万
中間コンセプト画像を経由 32.1mm 196.8万

同じクマの絵です。全高60mmに対して、奥行が1.3mmから32.1mmまで散らばりました。

一番大事な行

表の中で決定的なのは、3行目と4行目です。

**同一画像、同一設定、同一プロンプト。**それで17.2mmと1.3mm。

これが分かった時点で、それまでに立てていた仮説が全部崩れました。「色を塗ると平たくなるのでは」「写真の向きが影響しているのでは」と考えて数字を並べていたのですが、同一条件での振れ幅のほうが、それらの差より大きい。棄却するしかありません。

生成AIを検証するとき、n=1の比較には意味がない、ということです。頭では分かっていたつもりでしたが、主効果よりノイズが大きいケースを実際に踏むと、印象がだいぶ変わります。

加工でいえば、切削条件の効果を見ようとして、そもそも機械の再現性のほうが大きかった、という状況です。条件を振る前に、まず同一条件を複数回打つ。当たり前のことでした。

なぜ板になるのか

線画には陰影がありません

人間は輪郭線を見れば丸みを補完できます。子どもの描いた○を見て、球だと思う。しかしAIが立体を推定する主要な手がかりは明暗で、白地に黒線だけの絵にはその情報がゼロです。

実際、板になったモデルを観察すると、輪郭線が針金のように浮き上がって、内側が空洞になっていました。線を線のまま立体化したわけです。絵として正しく解釈されていない、というより、絵としてしか解釈されていない。

プロンプトは効かなかった

そこで「平たい板ではなく、奥行きのある厚みを持った立体にしてください」と指示を足しました。

結果は3.4mm。失敗の側です。

Image-to-3Dの立体復元は、基本的に画像から形状を推定する処理です。画像に厚みの手がかりがない以上、テキストで頼んでも推定は変わらない。そう解釈しています。

効いたのは、絵を描き直させることだった

うまくいったのは、工程を1つ挟む方法でした。

線画 → AIに陰影付きの絵を描き直させる → その絵から3D化

これで32.1mm。奥行が幅の78%あり、頭・耳・体・腕・脚がそれぞれ独立した塊として造形されました。ようやくフィギュアの比率です。

このとき使った指示が、これです。

線を線のまま立体化せず、線で囲まれた部分をふくらんだ塊にしてください。
絵に描かれた形と色は活かし、描かれていないものは足さないでください。

面白いのは、さっきは効かなかったのとほぼ同じ趣旨の指示が、今度は効いたことです。違いは、これが3D生成ではなく画像生成の段階で使われた点にあります。

プロンプトが無力なのではなく、効く工程が違った。テキストが介入できるのは画像生成までで、そこから先の形状推定は画像が全部を決めている。そういう構造だと理解しています。

色が出ない

もう1つ引っかかったのが色です。8回中7回、3MFの中に色情報が1件も入っていませんでした。

原因は書き出し形式でした。全ファイルの source_filemodel.glb になっていました。

GLBはテクスチャ画像を持っています。しかしスライサー側が、標準3MFの色情報として解釈できるのは頂点カラーと面カラーだけで、テクスチャマッピングには対応していません。生成側は色を作っているのに、受け側が読めない。STLに至っては形状しか持てないので、当然消えます。

解決策は、Meshy側の**多色印刷(Multi-Color Printing)**を通してから書き出すことでした。これを経由すると、テクスチャがフィラメントの色ゾーンに焼き直され、三角形ごとに paint_color が付いた3MFになります。スライサーはこれを読めます。

実際に通したモデルの色分割がこれです。

グループ 面数 占有率 部位
1 1,818,082 91.0% 体・頭
2 144,904 7.3% スナウト・お腹
3 32,346 1.6% 目・鼻・輪郭
4 4,332 0.2% 耳の内側

境界は元の絵の線に沿ってきれいに分かれていました。1色が9割を占めるので、色替えの回数は少なくて済みそうです。

なお、3MFに書き込まれている色コードは生成側の表示色にすぎません。スライサーで任意のスロットに再割り当てできるので、同じ色のフィラメントを買い揃える必要はありませんでした。ここは最初、勘違いしていました。

AIの説明文と実物が合わない

検証中、エージェントの説明文に事実と違う記述がいくつも出てきました。

左右対称に描いたクマについて「左右非対称な部分も保持されています」。色情報が1件もないモデルについて「色も元画像の見た目に近い状態です」。奥行5.7mmの板について「立体感が出ているように見えます」。

責める気はありません。エージェント自身が「2Dプレビューでの確認のため、細部までは保証できません」と断っていました。サムネイル画像を見て感想を述べているのであって、生成された3D形状を検証しているわけではない。

ただ、使う側がこれを「検証結果」として受け取ると事故になります。特に教育現場で、子どもが「AIができたって言ってる」と言ってきたとき、それは確認ではありません。

**横から見る。**これだけです。正面から見ている限り、板と立体は区別がつきません。

おまけ:1枚に1体だけ

途中、比較用に作った3面図(同じクマを3方向から描いた画像)をそのまま投入してしまったことがありました。

出てきたのは、繋がっていないクマ3体でした。188mm幅の中に、9mmと16mmの空隙を挟んで3つのメッシュが浮いている。

人間なら「同一物体を3方向から見た図」と読みます。AIは「3つの物体が並んだ絵」と読みました。構図という概念がない。

三面図から3Dを起こす、という使い方はできません。そして実務的には、紙に2つ以上描かない、隣の紙を写り込ませないという運用ルールになります。

まとめ

  • 線画は陰影がないので板になりやすい
  • 同一条件でも大きくばらつく。単発の比較で結論を出さない
  • テキスト指示は3D生成そのものには効かない。画像の段階には効く
  • 中間画像を挟むのが、今のところ最も確実
  • 色は書き出し形式で消える。専用の変換を通す
  • AIの自己申告ではなく、実物を測る

生成AIを工程に組み込むとき、いちばん危ないのは「それらしい出力が返ってくること」だと思いました。エラーが出れば気づけますが、板も立派に3Dモデルです。ファイルは開けるし、スライサーも通るし、プリンターも動く。印刷が終わるまで誰も気づかない。

出力が正しいかどうかを、出力そのものではなく別の手段で確かめる。加工でも同じことをやっているはずで、そこは変わらないのだと思います。


検証環境:Meshy(エージェントモード)/Bambu Lab P2S・A1 mini/Bambu Studio 生成回数:8回(うち多色印刷変換を含む)

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次