Grasshopper: 既存モデルを分解し、形状要素を抽出する

Grasshopperでは、形を作っていくだけでなく、既にあるモデルを分解して、さまざまな要素を抽出することができます。
他者から提供された形状データに変更を加えたり、解析用に簡略化する場合などに役立ちます。

最初からGrasshopperで作成したモデルの場合は、初期値や入力パラメータは明確ですが、過去に作成したモデルや他人から受け取ったデータなどの場合は、どのような入力内容で作成されたモデルなのか調べるのに時間を要する場合が多々あります。
Rhinoの機能を使って分解や長さを測るなどの解析もできますが、オブジェクト数が多い場合は繰り返し作業が発生し、現実的でない場合もあるでしょう。

それら既存モデルに対して何らかの加工(例えば、穴あけや部材付与、解析のための簡略化など)をGrasshopperを使って行うには、例えば基準線や作業平面、各種サイズを抽出することが必要になります。

ここでは簡単な壁のような形状を例に、Grasshopperを使って各種形状要素を抽出する方法について解説します。

モデルの確認

下記のような厚みのある折れ曲がった壁のような形状を考えます。
壁は3つそれぞれ結合はせず独立した状態となっているとします。

サンプルモデルダウンロード(walls.3dm、Deconstruct.gh)

このモデルから、以下の要素を抽出・再生成することをゴールとします。

  • 厚みを除いた表面サーフェス
  • 表面サーフェスの作業平面
  • 表面サーフェスの面積
  • 底面サーフェス
  • 壁の中心軸
  • 壁の中立面

モデルの分解

まずは、[Brep]コンポーネントを配置します。
右クリック>Set Multiple Brepsで壁を読み込みます。

(Set後、Rhino上のオブジェクトはHideコマンドで非表示にしています)

[Deconstruct Brep]に接続します。
それぞれ、Faces(表面のサーフェス)、Edges(エッジ)、Vertices(頂点)が抽出されます。
出力データはオブジェクト毎に階層が分かれますので、各壁で要素が混ざらないようになっています。

他にも、データの型に応じて[Deconstruct ~]というコンポーネントが多数あります。
以下の例はその一部です。

  • [Deconstruct] ⇒ 点をXYZの座標成分に分解
  • [Deconstruct Box] ⇒ Boxの基準平面とXYZのサイズを抽出
  • [Deconstruct Rectangle] ⇒ 長方形の基準平面とXYのサイズを抽出
  • [Deconstruct Mesh] ⇒ Meshオブジェクトの頂点、Face、色、法線方向を抽出
  • [Deconstruct Domain] ⇒ Domain(「○○ To ●●」という形式)を最小値・最大値に分解

分解系コンポーネントは名前が長いので、キーワード検索で「debrep」「demesh」のように先頭に「de~」とニックネーム表記で記入すると呼び出しやすいです。

表面サーフェスの抽出

分解されたサーフェスの内、壁の表面(あるいは裏面)に該当する面だけを抽出します。
ここでは壁の表面・裏面は、「外周長さが最も長い2面」とします。
「面積の最も大きい2面」でも良いのですが面積を計算する[Area]コンポーネントは同時に面積重心も計算するためオブジェクト数によっては計算が重くなる場合があるため長さを指標とします。

[Brep Egdes]で外周エッジを取得し、[Join Curves]で結合、[Length]で各面の外周長さを取得します。

長さ取得までの工程でデータ階層の分岐が増えるので[Unflatten Tree]で元のデータ構造に揃え、[Sort List]でサーフェスデータを外周の長さを基準に並べ替えます。
Keysがサーフェスデータ、Values Aが長さ情報です。

[List item]で指定の順位のデータを抽出します。
Sortは昇順で固定なのでインデックス0が最小値となります。
リストはループ構造なので、インデックス-1、-2を入力すれば最大値と2番目に大きい数が抽出できます。

[List Item]の出力では、下図の通り、底面・上面・側面の細長いサーフェスは除外されています。

各壁で表と裏を揃えて振り分けます。ここではY座標の大小で振り分けます。

[Evaluate Surface]で各サーフェス上の中心点を取得します(Reparametarizeオプションを忘れないように)。
取得した中心点を[Deconstruct]で座標成分に分解し、Y座標で先ほどの外周と同様にサーフェスをソートします。

(クリックで拡大表示します)

[List item]に接続し、ズームオプションで端子を増やしてインデックス番号別に振り分けます。
これで表面サーフェスが抽出できました。

表面サーフェスの作業平面の抽出

[Evaluate Surface]のFrame出力が、指定点における作業平面(=要素座標系)に該当します。

ここではサーフェス端部を要素座標系の原点(0.0,0.0)としていますが、サーフェス中心点を原点としたい場合はPanelの入力を「0.5,0.5」と入力します。

表面サーフェスの面積算出

面積は[Area]で取得します。

底面サーフェスの抽出

最初の工程([Join Curves]時点)に戻ります。
[Polygon Center]で各サーフェスの外周エッジの中心点を求めます。

求めた中心点を[Deconstruct]につないでZ座標を抽出し、Z座標の大きさでサーフェスをソートします。
[List Item]でインデックス0(Index端子はデフォルト値でOK)を指定すれば底面サーフェスが抽出できます。

(クリックで拡大表示します、ワイヤー整頓のため、最初に[Deconstruct Brep]したFacesを[Brep]につないで中継しています)

壁の中心軸の抽出

抽出した底面サーフェスを利用して中心軸を求めます。
[Brep Edges]でエッジを取得し、[Curve Middle]で各エッジの中点を取得します。

[List Item]でズームオプションで端子を4つに増やし、インデックスがそれぞれ「0と2」「1と3」の中点同士を[Line]で直線化します。

四角サーフェスのエッジは分解しても、ぐるっと1周つながるような順番で分解されるため、1つ飛ばしのインデックスを組み合わせれば対面同士になります。

[Merge]で直線をまとめてから、長さでソートして長い方を抽出すれば、中心軸の取得が完了です。

この方法は、壁が直線の場合に中心軸を取得することが前提となっています。
曲線の壁を含む場合や、中心軸では無く壁の表面から何mmオフセットした軸を取得したい、というような場合には、
[Isocurve]や[Tween][Offset Curve]などを使用すれば応用できます。

壁の中立面の抽出

先ほど取得した中心軸を押し出せば中立面になります。
押し出す高さを取得します。

[Bounding Box]で各壁のバウンディングボックスを取得します。

[Deconstruct Box]でバウンディングボックスを各要素に分解します。
X/Y/Z端子からは値ではなく、ドメイン(範囲)が出力されるので[Number]につないで値(ドメインの大きさ)に変換します。

取得したバウンディングボックスのZの範囲の値で中心軸をZ方向に[Extrude]で押し出すと中立面の完成です。

(中立面であることがわかるように底面サーフェスもプレビューしています)

以上が、既存モデルから面や基準線、作業平面などの各要素を抽出する方法の例でした。

入力形状や取得したい要素によっても組み合わせるコンポーネントなどは調整が必要になると思いますので、ここでの方法をベースとして目的に応じて応用していただければと思います。

サンプルモデルダウンロード(walls.3dm、Deconstruct.gh)

▼動画でチェック!