BlenderのBooleanが壊れる6つの条件|症状から引く原因と対処
BlenderのBooleanは、3Dプリント用のモデルを作るときに最も使う機能であり、最も壊れる機能でもあります。
「Differenceしたのに何も削れない」「母材が消えた」「非多様体が数百個出た」。これらには、それぞれ明確な原因があります。
この記事は、実際にトミカ道路の互換部品を作る過程で踏んだ破綻を、症状から逆引きできる形で整理したものです。
症状から原因を引く
| 症状 | 原因 | 対処 |
|---|---|---|
| 母材が丸ごと消える | 工具が複数の島を持つ1オブジェクト | 工具は1島ずつ当てる |
| Differenceしても何も削れない | 座標入れ替えで法線が内向きに反転 | 回転で作る/符号付き体積で検査 |
| 全エッジが非多様体 | テキスト→メッシュ変換で面が未溶接 | 包含ボックスとINTERSECT |
| 接触面まわりが壊れる | 接線一致・コプレーナ接触 | 0.2〜0.6mm食い込ませる |
| 穴の周囲だけ非多様体 | 穴の外接点が既存頂点と一致 | 穴を0.5mmずらす |
| メッシュがZero facesになる | 工具形状が自己交差している | 工具を分割する |
1. 複数の島を持つオブジェクトを工具にすると母材が消える
穴を20個開けたいとき、20本の円柱をjoinして一括Differenceする。これをやると母材そのものが消えます。
厄介なのは、数が少ないうちは通ってしまうことです。12個までは正常に削れ、20個で顕在化しました。「昨日は動いたのに」という状況になります。
対処は単純で、工具は必ず1島ずつ当てる。処理時間は延びますが、確実です。
2. 座標の入れ替えは法線を裏返す
円柱の向きを変えたくて、頂点座標を (x, y, z) → (x, z, y) と入れ替える。これは回転ではなく鏡像変換です。裏返るので法線が内側を向きます。
症状は「Differenceを実行してもエラーは出ないが、何も削れない」。工具の内外が反転しているため、削る対象が存在しないと解釈されます。
recalc_face_normals では直りません。 個々の面の向きを揃える機能であって、閉じた形状が裏返っている事実は変えられないためです。
対処は2つ。
- 向きを変えるときは座標の入れ替えではなく回転で作る
- 全プリミティブの生成時に、符号付き体積が負なら面を反転するガードを入れる
後者を入れておくと、この事故は構造的に起きなくなります。
3. テキストをメッシュに変換すると全エッジが非多様体になる
看板に文字をモールドしようとして、テキストオブジェクトをメッシュに変換する。この時点で全エッジが非多様体になります。面が張られるだけで溶接されていないためです。
この状態のままBooleanに入れると破綻します。
対処は、文字を包含するボックスとINTERSECTに通すこと。これで水密な実体に作り直されます。厚みのある文字として扱えるようになります。
4. 接線が一致する形状同士のBooleanは壊れる
これが最も頻繁に踏む罠です。2つの形状がぴったり接しているとき、Booleanは面が重なった状態をうまく処理できません。
具体的に壊れる組み合わせです。
- 段付き穴(貫通穴+座繰りの円錐)を、別々にUnionして作る
- 庇の裏面と本体の前面が同一平面で接する
- リブの端が壁の内側面にちょうど接する
対処は2つあります。
段付き穴は1体の回転体として作る。 分けてUnionしない。
接触する部分は0.2〜0.6mm食い込ませる。 ぴったり合わせず、必ずめり込ませる。3Dプリントの分解能では0.2mmの食い込みは造形結果に影響しません。
5. 穴の外接点が既存頂点と一致すると非多様体になる
穴の縁が、たまたま既存の頂点をかすめる位置にあると、そこだけ非多様体が発生します。
対処は拍子抜けするほど簡単で、穴の位置を0.5mmずらす。設計上そこでなければならない理由がなければ、これで解決します。
Booleanを使わないほうが速い場合がある
ここが一番の教訓かもしれません。
螺旋スロープの走行面に溝を彫ろうとして、螺旋に沿ってスイープした工具でDifferenceを試みました。結果は連続した破綻でした。
- 螺旋が1回転を超えると工具形状が自己交差し、EXACT DifferenceがメッシュをZero facesまで破壊
- 密なメッシュへの細い溝のBooleanは、細長い三角形を大量に生み、非多様体を数百個発生させる
- その非多様体を修復すると、走行面に膜(=壁)や分裂が生まれるという悪循環
最終的に安定したのは、Booleanを使わない手順でした。
- 面を細分割する(
subdivide_edges) - 頂点を解析的に求めた理論面へスナップする
- 波形などの造形は頂点の変位で表現する
細分割と頂点移動だけならトポロジが変わらないため、非多様体が原理的に発生しません。 Booleanは形状を作り直す操作なので壊れる余地がありますが、頂点を動かすだけなら壊れようがありません。
逆に、この場面で使ってはいけなかったものです。
- 大きな距離を指定した
remove_doubles(離れているべき頂点まで溶接する) holes_fill(意図しない面を張る)- 幅広・波状のBoolean工具(自己交差する)
非多様体がゼロでも壊れていることがある
最後に、検証についてです。
Blenderのbmeshで非多様体を判定して0だったのに、出力したSTLに縮退ポリゴンが残っていたことが複数回ありました。面積がほぼゼロの四角形で、頂点が2組完全に一致しているものです。bmeshのエッジ判定はこれをすり抜けます。
確実に検出するには、STLを三角形単位で直接パースして、エッジの共有数を数える方法が要ります。エッジを frozenset((v0, v1)) でカウントし、2以外のものを検出します。閉じた多様体なら、すべてのエッジはちょうど2つの三角形に共有されるためです。
Blender側の判定に加えて、この検証を併用することを勧めます。
なお縮退三角形は、多角形を三角形分割する処理(ear-clipping)が共線の頂点を処理したときにも出ます。この場合は該当面に beautify_fill(method='AREA') をかけると解消します。単純に削除してはいけません。縮退三角形が境界エッジを担っている場合、削除すると穴が開きます。
検証環境
- Blender 5.1
- 用途:3Dプリント用の実体モデリング(FDM/Bambu Lab A1)
バージョンによって挙動が変わる可能性はありますが、接線一致を避ける・工具は1島ずつ・トポロジを変えない操作を選ぶという3つの原則は、Booleanの実装が変わっても有効です。
本記事の内容は個人が実作業で遭遇した事例に基づくものであり、動作を保証するものではありません。記事中の製品名・会社名は各社の商標または登録商標です。