Blender

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を使わない手順でした。

  1. 面を細分割する(subdivide_edges
  2. 頂点を解析的に求めた理論面へスナップする
  3. 波形などの造形は頂点の変位で表現する

細分割と頂点移動だけならトポロジが変わらないため、非多様体が原理的に発生しません。 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の実装が変わっても有効です。


本記事の内容は個人が実作業で遭遇した事例に基づくものであり、動作を保証するものではありません。記事中の製品名・会社名は各社の商標または登録商標です。

スポンサーリンク