今回はGrasshopperを使用して、上画像の様な、様々なタイプの平面パターンを実装していきます。比較的基本的な5種類ピックアップしました。難易度的にはまちまちですが、1つ1つ順を追って進めていけばさほど難易度は高くはありません。初級者向けの記事となっております。
ベース平面作成


最初に上画像1枚目の様な、曲面を5つ作成していきます。今回は、こちらの5つの平面にそれぞれのパターンを描いていきます。
- 「Construct Pointコンポーネント」を使用し、原点(0,0,0)に点を作成します。
- 「Moveコンポーネント」を使用し、作成した点を複製していきます。
- 「Seriseコンポーネント」で入力端子S・Nに2100、入力端子Cに5を入力します。「2100・4200・6300・8400・10500」のリストが作成されます。
- 「Unit Xコンポーネント」で「Seriseコンポーネント」で作成したリストをX方向のベクトル化し、「Moveコンポーネント」の入力端子Tに接続します。最初に原点に作成した点が(2100,0,0)…(10500,0,0)の位置に複製されました。「Moveコンポーネント」出力端子Gを「Graft」します。
- 複製した5つの点をZ方向に複製していきます。新たに「Moveコンポーネント」を用意し、先ほどの「Moveコンポーネント」の出力端子を接続します。
- 「Seriseコンポーネント」を使用し、移動距離のリストを作成します。入力端子Sは0,Nは300,Cは20を入力します。
- 「UnitZコンポーネント」に「Seriseコンポーネント」の出力端子を接続します。
- 「Moveコンポーネント」に「UnitZコンポーネント」を出力端子を接続します。

- 上画像の様にZ方向に点が複製されたものが5列できていればOKです。これらの点をSin波を使用してウェーブ状に移動させていきます。

- 「Remap Numbersコンポーネント」を使用し、「Seriseコンポーネント」で作成したZ方向への移動距離のリストを角度のリストにリマップします。入力端子Vに「Seriseコンポーネント」の出力端子を接続します。
- 「Remap Numbersコンポーネント」の入力端子Sに「Boundsコンポーネント」を使用して作成した、「Seriseコンポーネント」のリストの最小値から最大値までのドメインを接続します。
- 「Remap Numbersコンポーネント」の入力端子Tに「Construct Domainコンポーネント」で作成した、「0~2π」のドメインを接続します。
- 「Remap Numbersコンポーネント」の出力端子Rから「0~2π」までを20分割したリストが出力されます。「Sineコンポーネント」にこのリストを接続します。
- 「Unit Yコンポーネント」に「Sineコンポーネント」を接続し、Sin波を取得します。
- 「Multiplicationコンポーネント」を使用し先ほど取得したSin波に振幅を掛けていきます。今回は400を掛けています。
- 「Moveコンポーネント」を使用し、入力端子GにZ方向に複製した点を入力し、入力端子Tに「Multiplicationコンポーネント」で取得したSin波に振幅を掛けたものを接続します。

- 上画像の様に、点がSin波を描いていればOKです。
- 「Interpolateコンポーネント」を使用し、作成した点をつなぐ曲線を作成していきます。
- 「Extrudeコンポーネント」を使用し、作成した曲線をX方向に押し出します。入力端子Bに「Interpolateコンポーネント」で作成した曲線を、入力端子Dに「Unit Xコンポーネント」に押し出し距離2000を接続したものをつなげます。

- 上画像の様に曲面が作成されていればOKです。「Extrudeコンポーネント」の出力端子を「Simplify」「Flatten」しときます。
- コンポーネントをすべてドラッグして選択し、右クリックを押し「Cluster」しておくことでパッケージ化しておきます。これでベースとなる曲面は完成です。
Triangle Mesh

最初に三角形メッシュに分割した平面を作成してみます。今回は「Weaverbird」というプラグインを使用します。
- 「List Itemコンポーネント」で先ほど作成した5つの曲面から0番目を取り出します。
- 「Meshコンポーネント」に接続し、メッシュに分割します。
- 「Weaverbird’s Split Triangles Subdivisionコンポーネント」を使用し作成したメッシュを三角形に分割します。入力端子Lにはメッシュの細かさを入力します。今回はLevel2を入力しています。
- 「Weaverbird's Picture Frameコンポ―ネント」を使用し、先ほど作成した三角形の各メッシュに穴をあけて完成です。
Voronoi

続いてVoronoiパターンを実装していきます。
- 「List Itemコンポーネント」を使用し、5つの曲面のうち1番目を取り出します。
- 「Deconstruct Brepコンポーネント」を使用し、取得した曲面をフェイス・エッジ・ポイントに分解します。
- 「List Itemコンポーネント」を使用し、「Deconstruct Brepコンポーネント」で分解したエッジのリストから0番目の要素、曲面の下部の直線を取得します。
- 「List Itemコンポーネント」を使用し、「Deconstruct Brepコンポーネント」で分解したエッジのリストから1番目の要素、曲面の曲線部分を取得します。
- 取得したエッジのうち曲線を「Lengthコンポーネント」で曲線の長さを取得します。
- 「Unit Y」コンポーネントに「Lengthコンポーネント」で取得した曲線の長さを接続します。
- 「Extrudeコンポーネント」で取得した曲面下部の直線をY方向に押し出します。押し出し距離は、「Unit Yコンポーネント」の出力端子を接続します。これで、XY平面に縦が曲線の長さ、横が平面下部の直線の長方形が作成されます。

- XY平面に作成した長方形をVoronoi分割していきます。「Populate 2Dコンポーネント」を使用し、長方形内にランダムにポイントを作成します。今回は200点作成しています。
- 「Voronoiコンポーネント」を使用し、Voronoi分割していきます。入力端子Pに「Populate 2Dコンポーネント」の出力端子を接続、入力端子Bには「Extrudeコンポーネント」で作成した長方形を接続します。
- 「Polygon Centerコンポーネント」を使用し、Voronoi分割したそれぞれの多角形の中心点を算出します。
- 「Scaleコンポーネント」を使用し、分割した多角形を縮小していきます。入力端子Gには「Voronoiコンポーネント」の出力結果を接続、入力端子Cには「Polygon Centerコンポーネント」の出力端子Cvを接続、入力端子Fには縮小倍率0.9を入力します。
- 「Explodeコンポーネント」で縮小した多角形を直線に分解していきます。
- 「Point on Curveコンポ―ネント」を接続し値を0.5とすることで、分解した直線の中点を取得します。
- 「Nurbs Curveコンポ―ネント」を「Point on Curveコンポ―ネント」の出力端子に接続し、Nurbs曲線を作成します。入力端子Pは右クリックでメニューを開き「Invert」することで閉じた曲線とします。
- 「Boundary Surfacesコンポーネント」に「Extrudeコンポーネント」の出力端子から得られる、XY平面に描いた長方形と、「Nurbs Curveコンポ―ネント」の出力端子を接続し、入力端子を「Flatten」することで、上画像の緑部分の様なVoronoi分割された平面を作成することができました。

- 長方形に作成したVoronoi分割を曲面に投影していきます。「Splopコンポーネント」を使用します。入力端子Gに「Boundary Surfacesコンポーネント」で作成したVoronoi分割した長方形を入力します
- 「Splopコンポーネント」入力端子Pには長方形の中心点を入力します。「Extrudeコンポーネント」に「Areaコンポーネント」を接続して取得します。
- 「Splopコンポーネント」入力端子Sには最初に「List Itemコンポーネント」で取得し曲面を入力します。また、入力端子Sは「Reparametrized」しておきます。
- 「Splopコンポーネント」入力端子uvには「MD Sliderコンポーネント」を接続します。値は(0.5, 0.5)とします。

上画像の様になっていればOKです。
Circle Plot

次にCircle Plotパターンを実装していきます。
- 「List Itemコンポーネント」を使用し、作成した5つの曲面から2番目を取得します。
- 先ほどと同じ手順でXY平面に縦が曲線の長さ、横が平面下部の直線の長方形を描きます。

- 「Divide Surfaceコンポーネント」を使用し、長方形を指定した個数に分割していきます。今回は縦方向30, 横方向10分割しております。
- 「Circleコンポーネント」を使用し、各分割点に円を描きます。半径を100としてます。
- Rhinocerosに移動します。長方形内に適当な曲線を描きます。
- 「Curvesコンポーネント」で先ほど描いた曲線をセットします。
- 「Curve Closest Pointコンポーネント」を使用し、分割点に作成した各円の中心から、曲線上の最も近い点を算出します。
- 「Sort Listコンポーネント」を使用し、「Curve Closest Pointコンポーネント」で取得した円の中心点から曲線までの最短距離のリストを昇順に並び替えます。入力端子Kで「Flatten」し出力端子Kで「Reverse」します。
- 「List Itemコンポーネント」を使用し、各円の中心から曲線までの最短距離のリストから最も長い距離を取得します。
- 「Multiplicationコンポーネント」を使用し、「List Itemコンポーネント」で取得した最長距離を0.5倍します。
- 「Smaller thanコンポーネント」を使用し、入力端子Aには「Curve Closest Pointコンポーネント」で取得した円の中心点から曲線までの最短距離のリストを接続、入力端子Bには「Multiplicationコンポーネント」の出力値を接続し、最長距離を0.5倍したものよりも小さいかどうかをBool値で取得します。
- 「Cull Patternコンポーネント」を3つ用意します。1つ目の入力端子Lには「Circleコンポーネント」の出力端子を接続し、入力端子Pには「Smaller thanコンポーネント」で取得したBool値のリストを接続します。Falseの値を間引いていきます。
- 「Cull Patternコンポーネント」の2つめ入力端子Lには「Divide Surfaceコンポーネント」の出力端子Pを接続し、入力端子Pには「Smaller thanコンポーネント」で取得したBool値のリストを接続します。
- 「Cull Patternコンポーネント」の3つめ入力端子Lには「Curve Closest Pointコンポーネント」の出力端子Dを入力し、入力端子Pには「Smaller thanコンポーネント」で取得したBool値のリストを接続します。
- 上画像の様に、曲線付近の円のみが残ればOKです。

- 取得した曲線付近の円を曲線からの距離に応じて縮小していきます。「Scaleコンポーネント」を用意し、入力端子Gには1つめの「Cull Patternコンポーネント」で取得した、円を接続します。
- 「Scaleコンポーネント」の入力端子Cには2つ目の「Cull Patternコンポーネント」で取得した円の中心点を接続します。
- 「Remap Numbersコンポーネント」を使用し、入力端子Vに3つ目の「Cull Patternコンポーネント」で取得した曲線から円の中心点までの距離のリストを接続します。
- 「Remap Numbersコンポーネント」の入力端子Sに、「Boundsコンポーネント」で取得した「Cull Patternコンポーネント」のリストの最小値から最大値までのドメインを入力します。「Boundsコンポーネント」の入力端子は「Flatten」します。
- 「Remap Numbersコンポーネント」の入力端子Tに縮小倍率を入力します。今回は「0.95~0.19倍」にしてます。
- 「Remap Numbersコンポーネント」の出力端子Rから、円の縮小倍率のリストが取得できましたので、「Scaleコンポーネント」に接続します。
- 上画像の様に、曲線から遠くなれば遠くなるほど円が小さくなっていればOKです。

- 「Boundary Surfacesコンポーネント」に「Extrudeコンポーネント」で取得した長方形と、「Scaleコンポーネント」で取得したプロットした円を接続し、境界をサーフェイス化します。入力端子Eは「Flatten」します。
- 円をプロットした長方形サーフェイスを曲面に投影していきます。「Splopコンポーネント」を使用します。入力端子Gに「Boundary Surfacesコンポーネント」で作成したサーフェイスを入力します。
- 「Splopコンポーネント」入力端子Pには長方形の中心点を入力します。「Extrudeコンポーネント」に「Areaコンポーネント」を接続して取得します。
- 「Splopコンポーネント」入力端子Sには最初に「List Itemコンポーネント」で取得した曲面を入力します。また、入力端子Sは「Reparametrized」しておきます。
- 「Splopコンポーネント」入力端子uvには「MD Sliderコンポーネント」を接続します。値は(0.5, 0.5)とします。

上画像の様になっていればOKです。
Hexagon

続いて、Hexagonパターンを実装していきます。今回は、Rhino7で実装されたコンポーネント「TriRemeshコンポーネント」を使用するので、Rhino7より前のバージョンを使用している方はもしかしたらコンポーネントがないかもしれません。別の方法でも実装できるかと思いますので、チャレンジしてみてください。
- 5つの曲面のうち3番目を取得します。
- 今までと同様に、XY平面に長方形を作成します。

- 「Extrudeコンポーネント」で取得した長方形を「TriRemeshコンポーネント」に接続します。出力端子Tからは、なるべく均等サイズに分割された三角形メッシュが取得できますが、今回は出力端子Dから出力される、三角形の頂点を中心とした六角形メッシュを使用します。
- 「Face Boundariesコンポーネント」に「TriRemeshコンポーネント」の出力端子Dを接続し、六角形のエッジを取得します。
- 「Boundary Surfacesコンポーネント」に「Face Boundariesコンポーネント」の出力端子を接続し六角形をサーフェイス化します。

- 六角形をランダムに間引いていきます。「List Lengthコンポーネント」に「Boundary Surfacesコンポーネント」を接続し、六角形の個数を取得します。
- 「Randomコンポーネント」を使用し、「0~六角形の個数までの数字」をランダムに並べたリストを作成します。入力端子Rには「Countruct Domainコンポーネント」で作成した「0~六角形の個数までの数字」のドメインを入力、入力端子Nには「List Lengthコンポーネント」を接続します。
- 「Randomコンポーネント」の出力端子Rから取得されたリストを「Integerコンポーネント」を使用し整数化します。
- 「Sort Listコンポーネント」を使用し降順に並べ替えます。
- 「Delete Consecutiveコンポーネント」を使用し、隣り合う値が同じ値だった場合にダブりの値を消去します。
- 「List Itemコンポーネント」の入力端子Lに「Boundary Surfacesコンポーネント」を接続し、入力端子iに「Delete Consecutiveコンポーネント」でダブりを除いたランダムなリストを入力します。
- 上画像緑箇所のように六角形がランダムに間引かれていればOKです。

- 今まで同様に、長方形に作成したHexagonパターンを曲面に投影します。

上画像の様になっていればOKです。
Birds Nest

最後にBird's Nestパターンを実装していきます。
- 5つの曲面から4番目を取得します。
- 今までと同様にXY平面に長方形を作成します。

- 「Deconstruct Brepコンポーネント」を使用し、長方形のエッジを取得します。
- 「List Itemコンポーネント」を4つ用意します。それぞれに長方形の各エッジを取得します。
- 「Divide Curveコンポーネント」を4つ用意し、取得したエッジを分割します。今回は長手方向のエッジは30分割、短手方向は16分割しています。出力端子Pを「Simplify」しておきます。
- 「Jitterコンポーネント」を4つ用意し、それぞれ「Divide Curveコンポーネント」の出力端子Pを接続します。Jitterコンポーネントは取得したリストをランダムに並べ替えてくれます。
- 「Jitterコンポーネント」の4つのうち長手方向の直線1個と、短手方向の直線1個の入力端子Sにseed値を入力します。今回は3を入力してます。

- 「Mergeコンポーネント」を2つ用意します。「Jitterコンポーネント」で並べ替えた分割点のリストのうち、長手方向1つと短手方向1つをマージします。出力端子はそれぞれ「Simplify」しておきます。
- 「Lineコンポーネント」を作成し、入力端子A・Bに「Mergeコンポーネント」をそれぞれ接続します。
- 上画像の緑箇所の様にランダムに並べ替えた点が直線で結ばれていればOKです。

- 今までと同様に長方形上に作成した直線を曲面に投影します。
- 「Curvesコンポーネント」を使用し、曲面を分解した「Deconstruct Brepコンポーネント」からエッジをすべて取得します。
- 「Pipeコンポーネント」を使用し、取得した曲面のエッジと「Splopコンポーネント」で投影したランダムな直線をパイプ化します。

上画像の様になっていればOKです。

以上になります。基本的な5パターンを選んでみました。理解できたら是非立体へ応用してみてください。
【参考文献】
- AppliCraft : https://www.applicraft.com/
- Youtube : チャンネル名:「June Lee」「Voronoi Gradient Pattern Facade Rhino Grasshopper Tutorial」https://www.youtube.com/watch?v=zCFxSLIOECs
- Giulio Piacentio : https://www.giuliopiacentino.com/weaverbird/