小学生向けのワークショップを準備しています。子どもが描いた絵を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_file が model.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回(うち多色印刷変換を含む)


コメント