Grasshopperでチェーン構造のバッグをつくる【その2】

By 11/05/2017 All posts, Tips
[:ja]前回の続きになります。三角ピースまでは出来ました。
ここから、メッシュで出来た三角ピースをBrep(閉じたソリッドポリサーフェース)に変換していきます。

まず、Mesh Explodeコンポーネントで三角ピースのメッシュを分解します。

次に、weaverbird’s Face Polylineコンポーネントを選択します。

このコンポーネントは、メッシュのエッジを閉じたポリラインに変換します。
今回の場合は、三角ピースを構成している、三角形メッシュと四角形メッシュのアウトラインになります。

↓接続するとこんな感じになります。

次に、Curve>>Analysis>>Discontinuity>>Discontinuityコンポーネントを選択します。

このコンポーネントは、線に沿ったすべての不連続点を抽出します。
今回の場合は、先ほど作成したアウトラインの各頂点を抽出します。

次に、Sets>>List>>Dispatchコンポーネントを選択します。

このコンポーネントは、リスト内のデータを振り分けます。
Lにフィルタをかけるリストを接続し、Pに数式などの条件フィルタを接続します。
すると、Aから条件に合うデータ、Bから条件に合わないデータが出力されます。
条件を作っていきます。
Sets>>List>>List Lengthコンポーネントを選択します。

次に、Maths>>Operators>>Equalityコンポーネントを選択します。

↓図のように接続します。

List Lengthコンポーネントは、リストの長さを数値で出力します。
Equalityコンポーネントは、Aで入力された数値がBの数値と等しいか判別します。
↓図のように中身を見てみると、三角形のアウトラインの頂点と四角形のアウトラインの頂点が、Discontinuityコンポーネントから出力され、それがList Lengthコンポーネントを通して、各頂点項目の数に変わっています。(三角形、四角形が何個あるか)

ここで、EqualityコンポーネントBの部分に3を入力します。

これで、Dispatchコンポーネントに、3つの頂点を持っているか、持っていないか(4つの頂点)が条件として入力されました。
つまり、DispatchコンポーネントAから3つの頂点群(三角形)、Bから4つの頂点群(四角形)がそれぞれ出力されます。
↓図に描くとこんな感じです。

次に、Sets>>List>>List Itemコンポーネントを選択します。

List Itemコンポーネントを4つ複製し、それぞれのi(Index)0123と入力します。
List Itemコンポーネントは、Lからデータリストを受け、iに入力した数値の番号のデータを出力します。

↓図のように接続します。

0indexから三角形、四角形の1番目の頂点、1indexから三角形、四角形の2番目の頂点、2indexから三角形、四角形の3番目の頂点、3indexから四角形の4番目の頂点を取り出すといった感じです。
Discontinuityコンポーネントから直接各indexのデータを受け取ることも出来るのですが、今回は三角形と四角形の頂点を識別したかったので図のようにしました。
次に、Surface>>Freeform>>4Point Surfaceコンポーネントを選択します。

↓図のように接続します。

4Point Surfaceコンポーネントは、3もしくは4つ点からサーフェースを作成します。
先ほどの各頂点をもとにサーフェースが出来ました。

次に、Surface>>Util>>Brep Joinコンポーネントを選択します。
このコンポーネントは、Brep(先ほどの各サーフェース)を結合します。
Brepコンポーネントで結合したBrepを格納します。

サーフェースが繋がり閉じたソリッドポリサーフェースが出来ました。
これで、ブール演算が出来るようになりました。

なんかモデルだけ見ると前回から全然進んでない!って感じですが、
無事面取りも出来るようになったので、怪我しないバッグになりました。
次回は、各三角形ピースのジョイント部分を作っていこうと思います。

こんな動きが目標です。出来るのかな。。

[:en]今日は、前回モデリングしたお皿をベースにGrasshopperを使ってボロノイ化させていきます。

STEP.02【お皿をGrasshopperに読み込ませる】

まず、Rhinocerosを開いて、Grasshopperを立ち上げます。

次に、FileからNew Documentを選択して新規ファイルを作ります。

112

ParamsタブのGeometry内のBrepコンポーネントを選択します。

21

Brepコンポーネントはサーフェースやポリサーフェース等を格納するコンポーネントです。読み方分かんなかったんですが、偉い人たちはびーれっぷと言っていました。

Brepコンポーネントにお皿を読み込ませます。

右クリックして、Set one Brepを選択します。

32

Rhinocerosの画面に切り替わるので、お皿を選択します。

42

52

選択すると、こんな画面になるかと思います。

見づらいので、一旦ここでお皿のモデルは非表示にします。

(オブジェクトを非表示ツールを使用します)

61

お皿モデルが消えて、赤い半透明のものが残りました。

この赤いものは、先ほどのBrepコンポーネントがお皿のモデルを格納したということです。

このBrepを元にボロノイ化させていきます。

次に、Vevtor→Grid→Populate Geometryコンポーネントを選択します。

(何もない部分をダブルクリックするとショートカットの検索ウィンドウが現れます。下記画像参照)

71

先ほどのBrepの右端と、Populate GeometryGを繋げます。

81

すると、点がたくさん現れました。

このPopulate Geometryコンポーネントは、先ほど指定したBrepの形状をジオメトリとして取得し、ランダムに点を発生させます。

点の数を調整してみましょう。

Number Sliderコンポーネントでスライダーを作成します。

ダブルクリックでショートカットを表示させ、任意の数字を打つと

自動的にNumber Sliderコンポーネントが作成されます。

92

スライダーを2つ作成し、それぞれPopulate Geometryコンポーネント

NSに繋ぎます。

すると、自動的にスライダーの名前がCountSeedに変わりました。

Countは、発生させる点の数、Seedは乱数生成の元となる値です。(僕は難しいことは分からないのでランダム具合と呼びます)

102

少しスライダーをいじってみます。

113

Countを87、Seedを4にしてみました。

点の数が変わりましたね。

Seedはいじってもらうと分かるのですが、ランダム具合が変わります。

とりあえずここは、Count15Seed4にしておきます。

次に、Params→Geometry→Pointコンポーネントを使います。

121

Populate GeometryコンポーネントPointコンポーネントを繋げます。

Pointコンポーネントは点を格納するコンポーネントです。

131

Params→Input→Panelコンポーネントを使うと、先ほどの点群の座標値が分かります。

1_14

151

Countを15にしたので15個分です。

このPanelは確認用で、今回はあまり関係ないので消します。

次は、この15個の点をもとにボロノイ分割をします。

Mesh→Triangulation→Voronoi 3Dコンポーネントを選択します。

161

先ほどのPointコンポーネントVoronoi 3DコンポーネントPに繋げると

171

ボロノイ分割されました!

15の点を母点としたボロノイです。

(スライダーのCountSeedを変更するとここのボロノイ分割も変わります。)

でも、なんか勝手に立方体出来てますね。

これは、先ほどの15の点を持つ最大外形の立方体です。

ボロノイ分割するための母点は入力されましたが、まだどれくらいの範囲を分割するかのボリュームが入力されていません。

そこで、Params→Geometry→Boxコンポーネントでボリュームを指定してあげます。

181

Boxコンポーネントを右クリックして、Set one Boxを選択します。

191

すると立方体作成モードに切り替わるので、3点を指定して立方体をつくります。

ここでポイントですが、お皿(Brep)の大きさよりも大きい立方体をつくります。(後述します)

20

211

22-2

こんな感じになりました。

立方体が出来たら、BoxコンポーネントVoronoi 3DコンポーネントBに繋げます。

23

気持ち悪い模様になりました。

これは、Boxコンポーネントが格納した立方体とVoronoi 3Dコンポーネントが格納した立方体が重なっている状態です。

見づらいので、Boxコンポーネントを右クリックして、Previewを消しましょう。

2_1_24

25

気持ち悪いのが消えましたね。

これでボロノイ分割するための母点と、ボリュームが指定されました。

なんかそれっぽくなってきましたね!

今日はこのへんで、、

 [:]

Leave a Reply

CAPTCHA