【集中講座】Rhino・Grasshopper: ブール演算と面の向き

ここでは立体同士の足し算、引き算などを行うブール演算と面の向きの関係について書いてあります。また最後にGrasshopperでの例、メッシュでの例などもありますので併せてご確認ください。

結合とは

通常Rhinoでは複数の曲線やサーフェスを[Join]コマンドで結合して、ポリカーブやポリサーフェスにできます。[ポリ〜]は、Rhinoでは[複数の〜]を表します。ですのでポリカーブは複数の曲線が結合したもの、ポリサーフェスは複数のサーフェスが結合したものという意味になります。

[ShowEnds]コマンドで曲線の開いている箇所をで確認できます(左下図)。[ShowEdges]コマンドでポリサーフェス内の隙間が空いている箇所を確認できます(右下図)。

端点やエッジが許容差以内に存在する場合は、[Join]コマンドで開いている箇所を結合して1つの形状にできます。

ブール演算とは

ただし隙間となる箇所が一致しないサーフェス同士の場合は、[Join]コマンドでは結合できません(下図参照)。

[Join]コマンドで結合するには、

  1. [Intersect]で形状が交差する曲線を求める。
  2. 交差する曲線を使って[Trim]で不要な箇所を削除する。
  3. 残ったサーフェス同士を[Join]コマンドで結合

することもできますが、手数がかかります。

そういった時は立体同士を足し算・引き算するブール演算で作業を楽に行うことができます。

ブール演算の種類

ブール演算には和(立体の足し算)、差(立体から立体の引き算)、積(立体同士の掛け算)と言った考え方があります。
コマンド名は順に[BooleanUnion]、[BooleanDifference]、[BooleanIntersection]です。

位置関係が分かりやすいようゴースト表示で確認してみます(下図)。ここでは左側の直方体をA、右側の直方体をBと呼びます。

和[BooleanUnion]はAとBを足した外側のサーフェスのみ残します。
なので、外観のみ集めたポリサーフェスとなります(下図参照)。また立体同士が交差している内側は削除されます。

差[BooleanDifference]は立体同士を引き算しますが、どちらを先に選ぶかで結果が変わります。
左下図:Aを先に選び、AからBを引いた形。右下図:Bを先に選び、BからAを引いた形。

積[BooleanIntersection]はAとBのそれぞれの内側の箇所のみサーフェスを残します。なので下図のように交差する箇所だけが残ったポリサーフェスとなります。

体積で考えると、ブール演算の和の体積は、差(A-B)と差(B-A)と積を足した体積と同じになります。

ブール演算 応用 ポリサーフェスとサーフェス

次にもう少し応用として、ポリサーフェスと交差するサーフェスでブール演算の差を行ってみます(左下図)。
初めにポリサーフェスを選び、開いたサーフェスで引き算すると結果はポリサーフェスの右側だけ残りました(右下図)。

一見するとサーフェスは閉じていないため、立体の内側や外側がないので、疑問に思われるかもしれません。

これはサーフェスはソリッド状態の閉じたポリサーフェスだけではなく、開いた1枚のサーフェスにも表側・裏側があるからになります。

[Dir]コマンドでサーフェスが向いている方向を確認できます。Rhino上ではソリッド状態のサーフェスデータは必ず外側を向く仕様になっています。ですので、直方体では白い矢印が立体の外側を向いているのが分かります。

次に開いたサーフェスの向きを[Dir]コマンドで確認してみます。
ここでは画面の奥側(右側)を向いているようです(下図)。[BooleanDifference]は後から選んだ形状の内側を削る仕様なので、内側に当たる左側が削除されたことになります。

また[Dir]コマンドを使用中に

  • サーフェスをクリックする、
  • [反転]オプションを押す

でサーフェスの向きを反転もできます(左下図)。

サーフェスを反転した(向きを逆にした)状態で、[BooleanDifference]を行うと内側(裏側)が逆になります。
反転することで先ほどと反対側を残すことができます(右下図)。

ブール演算と面の向きの関係を理解しておくと、モデリングが楽になります。
ぜひ、ブール演算を使いこなしていただけたらと思います。

補足1:

面の向きを考えたくない場合は、[Boolean2Objects]コマンドを使用することもできます。
このコマンドは入力した2つの形状のそれぞれの表と裏を組み合わせて、ブール演算を行ってくれる機能となります。

組み合わせを左クリックするたびに切り替えて、Enterキーで決定できます。

ただし[Boolean2Objects]は名前の通り2つのオブジェクト間でのみ使用可能です。
通常のブール演算のように、複数のオブジェクト対複数のオブジェクトと言った使い方はできません。ご注意ください。

補足2:

Rhinoの場合、閉じているサーフェス形状は自動的に修正され、外側を向きます。
しかしGrasshopperを使った場合は、使用する断面曲線の向きによっては内側を向いたソリッド形状ができることがあります。

Grasshopperで曲線を2つRhinoから読み込み、[Sweep1]で閉じたソリッドを作成した図。

作成した形状を使い、[SolidDifference]コンポーネント(GHでの差の引き算)でBoxに穴を開けます。

閉じている形状で差の演算を行ったにもかかわらず、結果の形状は2種類作成される可能性があります(下図参照)。
これはGrasshopperでは閉じた内向きのソリッド形状が作成される可能性があるからになります。

GHで作成した閉じたソリッド形状が内側を向いている図。

その場合は、

  • 断面曲線の向きを反転する(作成される形状は、断面の向きに影響を受けます)
  • 面を抽出し、再度結合する(Joinコンポーネントには複数のサーフェスを結合するときに向きを修正する機能があります)
  • BakeしてRhino上のデータにする(Rhino上のデータになるので、自動的に向きが修正されます)

などで、修正することができます。

補足3:

メッシュには結合する際に面の向きを一定にすると言った機能がありません。
上面メッシュのみ反転した状態で[Join]コマンドで結合してみます(左下図)。結合後も面の向きが修正されず、反転した状態のまま結合されます(右下図)。
メッシュの向きを一定にするには、[MeshRepair]コマンドなどで修復は可能です。

またメッシュの場合は、[Join]コマンドを使うと閉じたメッシュや、隙間が空いているメッシュでも1つのメッシュにまとまってしまいます。
まとめた後は[開いたメッシュ]タイプとなります。[SplitDisjointMesh]コマンドで距離が離れているメッシュを、それぞれのメッシュに分割もできます。

メッシュのブール演算を行うには、[MeshBooleanDifference]、[MeshBooleanUnion]、[MeshBooleanIntersect]とコマンド名の頭が[Mesh〜]から始まる別のコマンドを使用する必要があります。またNurbsサーフェスからメッシュに変換はできますが、メッシュからサーフェスには基本的に変換が難しいため、メッシュのブール演算を行なった場合、結果はメッシュとなります。

こういった形でNURBSのサーフェスとメッシュは扱い方が全く異なりますので、ブール演算を行うには注意が必要です。


関連記事:Rhino・Grasshopper:ブール演算の差(BooleanDifference・SolidDifference)の演算時間と代替案