今回はGrasshopperを使用して、画像のような「Tree Parasol」を作成していきたいと思います。
基本的な内容ですが、データ構造をしっかり理解している必要があるので、中級レベル程度となっております。
データ構造を理解している方は問題なくできると思いますので、ぜひチャレンジしてみてください。
概要

上画像がプログラムの全体像となっております。
大まかな流れは以下になります。
- ベースとなる円を作成
- プレート部分の倍率設定
- プレート部分を倍率を掛けて複製
- プレートを多角形化してそれぞれランダムな角度で回転
- プレートに厚みを持たせる
- プレートをつなぐパイプを作成
- プレートをつなぐ交差したパイプを作成
- Treeの中心に柱を作成
- Treeの足元にドーナツ状のベンチを作成
ベースとなる円を作成

- 「Construct Pointコンポーネント」を使用し、(0,0,0)に原点となるPointを作成します。
- 「Circle CNRコンポーネント」を使用し、先ほど作成した原点を中心とした円を作成します。今回は半径は500mmに設定してます。
プレート部分の倍率設定


上画像1枚目の様にプレートが高さが高くなるにつれて大きくなっております。この大きくなる倍率を設定していこうと思います。
- 「Number Slideコンポーネント」を用いて、プレートの枚数を設定します。今回は17枚にしました。
- 「Seriseコンポーネント」を使用して、「0~16」まで1ずつ増えるリストを作成します。入力端子Cに先ほど作成した「Number Slideコンポーネント」の出力端子を接続します。
- 今回は、指数関数状に拡大するように設定します。「Power of Eコンポーネント」を用いて、「Seriseコンポーネント」の出力端子を接続します。「eの0乗~eの16乗」までのリストが取得できました。
- 「Remap Numbersコンポーネントを」使用し、「eの0乗~eの16乗」までのリストを最小値を「1」最大値を「5」として、リストを置き換えます。入力端子Vに元となるリスト「Power of Eコンポーネント」の出力端子を接続します。
- 「Remap Numbersコンポーネントを」の入力端子Sには、元のリストの最小値~最大値をドメインで入力します。「Boundsコンポーネント」を使用して、「Power of Eコンポーネント」の最小値から最大値までのドメインを取得。「Boundsコンポーネント」の出力端子を「Remap Numbersコンポーネント」の入力端子Sにつなぎます。
- 「1~5」まで指数関数状に増加する17個の値が入ったリストが取得できました。
プレート部分を倍率を掛けて複製

「Circle CNRコンポーネント」で作成したベースとなる円を先ほど作成した倍率のリストを用いて複製していきます。
- 「Scaleコンポーネント」を使用して、入力端子Gにベースとなる円を、入力端子Fに「Remap Numbersコンポーネント」で取得した倍率を入力します。
- 「Moveコンポーネント」を使用して、Z方向に移動させていきます。入力端子Gに「Scaleコンポーネント」の出力端子Gを接続します。
- 「Moveコンポーネント」の入力端子Tに接続するものを検討していきます。
- 「Number Sliderコンポーネント」を使用して、Treeの高さを設定します。今回は「4000mm」に設定しました。
- 高さ4000mmをプレートの枚数分で均等割りしていきます。「List lengthコンポーネント」で「Remap Numbersコンポーネント」のリスト長さを求めることでプレートの枚数17を取得します。
- 「Subtractionコンポーネント」でプレート枚数から1を引き、「Divisionコンポーネント」で高さ4000mmを16等分します。
- 「Seriseコンポーネント」を用いて分割点の高さをリスト化します。入力端子Nに「Divisionコンポーネント」の出力端子を接続し、入力端子Cには「List lengthコンポーネント」の出力端子Lを接続します。「0~4000」の範囲で等分割された17個の値を含むリストが取得できました。
- 「Unit Zコンポーネント」を用いて、Z方向のベクトルに変換します。入力端子Fに「Seriseコンポーネント」の出力端子Sを接続します。
- 「Moveコンポーネント」の入力端子Tに「Unit Zコンポーネント」の出力端子を接続します。
- 「Moveコンポーネント」の出力端子Gに無駄な階層があるので「simplifi」し、1つ1つのジオメトリを個別のブランチに格納するために「Graft」しておきます。

「Moveコンポーネント」以外をPreviewOffにして上画像のようになっていればOKです。
プレートを多角形化してそれぞれランダムな角度で回転

1枚1枚を多角形化していきます。
- 「Polygonコンポーネント」を使用します。入力端子Pには各プレートの中心点を入力します。「Moveコンポーネント」の出力端子Gを「Areaコンポーネント」に接続し中心点を取得し接続します。
- 「Polygonコンポーネント」の入力端子Rには各プレートの半径を入力します。「Moveコンポーネント」の出力端子Gを「Deconstrust Arcコンポーネント」に接続し各プレートの半径を取得します。取得した半径を「Polygonコンポーネント」の入力端子Rに接続します。
- 「Polygonコンポーネント」の入力端子SにはSegmentを入力します。今回は7を入力し7角形を作成しました。
- 多角形化した各プレートをランダムな角度で回転させます。「Rotateコンポーネント」を使用し、入力端子Gに「Polygonコンポーネント」の出力端子Pを接続します。
- 「Rotateコンポーネント」の入力端子A(アングル)に「Randomコンポーネント」を使用してランダムな角度を入力していきます。
- 「Randomコンポーネント」の入力端子Rに「Construct Domainコンポーネント」で作成した「0~360のドメイン」を接続します。
- 「Randomコンポーネント」の入力端子Nにはプレートの枚数を入力することで、プレートの枚数分のランダムな角度を取得できます。「List Lengthコンポーネント」の出力端子を接続します。これで「0~360」の間で17個のランダムな数値が取得できました。
- 「Radiansコンポーネント」をもちいて取得した17個の角度をラジアンに変換します。
- 「Radiansコンポーネント」の出力に無駄な階層があるので「simplifi」し、それぞれの角度を個別のブランチに格納するために「Graft」します。
- 「Rotateコンポーネント」の入力端子Aに「Radiansコンポーネント」の出力端子を接続します。

「Rotateコンポーネント」以外をPreviewOffにして上画像のようになっていればOKです。
プレートに厚みを持たせる

多角形化したプレートに厚みを持たせていきます。
- 「Extrudeコンポーネント」の入力端子Bに「Rotateコンポーネント」の出力端子Gを接続します。
- 「Extrudeコンポーネント」の入力端子Dに「UnitZコンポーネント」を接続します。「NumberSliderコンポーネント」を「UnitZコンポーネント」に接続し厚みを設定します。今回は63mmに設定しています。
- 「Cap Holesコンポーネント」を使用しCapします。

「Cap Holesコンポーネント」以外をPreviewOffにして上画像のようになっていればOKです。プレート部分はこれで完成です。
プレートをつなぐパイプを作成


上画像1枚目の緑色箇所の縦方向にまっすぐつながっているパイプと、2枚目の緑色箇所のように斜めに交差しているパイプを作成していきます。まずは1枚目のパイプを作成します。

- 「Areaコンポーネント」を使用し、各多角形の中心点を求めます。入力端子Gに「Polygonコンポーネント」の出力端子Gを接続します。
- 「Scaleコンポーネント」を用いて回転する前の多角形を縮小します。縮小した位置がパイプが通る位置になります。入力端子Gに「Polygonコンポーネント」の出力端子Gを接続します。
- 「Scaleコンポーネント」の入力端子Fには「NumberSliderコンポーネント」を使用して、縮小倍率を入力します。今回は0.6を入力しています。
- 「Discontinuityコンポーネント」を用いて縮小した多角形の頂点を取得します。入力端子Cに「Scaleコンポーネント」の出力端子Gを接続します。7角形の各頂点(7点)が格納されたブランチが17個入ったリストを取得でました。(※Panelコンポーネントでデータの中身を確認してみてください)
- 今回は各頂点を縦方向につなげたいので、データの構造を変更していきます。「Flip Matrixコンポーネント」を使用し、先ほどのリスト【7点が格納された17ブランチのリスト】を【17点が格納された7つのブランチのリスト】に変更していきます。この時の17点は縦方向に同一な17点になります。(※Panelコンポーネントでデータの中身を確認してみてください)
- 取得したリストに「Polylineコンポーネント」を接続しポリライン化していきます。入力端子Vに「Flip Matrixコンポーネント」の出力端子Dを接続します。
- 「Pipeコンポーネント」でPolylineをパイプ化します。入力端子Rにパイプの半径を入力します。今回は15mmを入力しています。

「Pipeコンポーネント」以外をPreviewOffにして上画像の様になっていればOKです。
プレートをつなぐ交差したパイプを作成

上画像の様に、縮小した7角形の頂点に番号を振りました。各頂点の番号が「0~6」で振られており、同じ番号同士をつなぐことでスパイラル上のパイプを作成していきます。
各7角形を回転させ頂点をずらしていきます。回転する角度は【「360度÷7角形=51.4...度程度」×n層目】になります。

- 「Divisionコンポーネント」を使用し1層あたりの回転させる角度を求めます。今回は7角形なので360度÷7になります。
- 「Seriseコンポーネント」を使用して各層を回転させる角度を求めていきます。入力端子Nには「Divisionコンポーネント」の出力端子を接続し、入力端子Cにプレートの枚数を入力します。各層を回転させる角度(1層目は51.4度、2層目は102.8度・・・・)が17層分取得できました。
- 「Radiansコンポーネント」を使用して先ほど取得した角度をラジアンに変換していきます。
- 「Rotateコンポーネント」を使用して、縮小した7角形を回転さていきます。入力端子Gには縮小した7角形を入力し、入力端子Pには各7角形の中心点「Areaコンポーネント」出力端子を接続します。入力端子Aには先ほど「Radiansコンポーネント」で算出した各層の回転角を入力します。このとき角度のリストを「Graft」し個別のブランチに格納します。
- 正回転だけでなく負回転の両方をモデル化したいので、角度を「Negativeコンポーネント」でマイナスしたものも作成し、「Rotateコンポーネント」をもう1つ設けます。
- 後はまっすぐなパイプを作成した時と同じように、「Discontinuityコンポーネント」を用いて各多角形の頂点を取得します。
- 「Flip Matrixコンポーネント」でリストの構造を変更し
- 「Polylineコンポーネント」で各頂点を結びます。
- 「Pipeコンポーネント」でパイプ化します。

「Pipeコンポーネント」以外をPreviewOffにして上画像のようになっていればOKです。
Treeの中心に柱を作成

Treeの中心に柱を設置していきます。
- 最初「Circle CNRコンポーネント」で求めたベースとなる円を「Scaleコンポーネント」で縮小します。今回は0.1倍し半径50mmとしました。
- 「Extrudeコンポーネント」でZ方向に押し出していきます。押し出し距離はTreeの高さを入力しています。

上画像の緑箇所のような柱ができていればOKです。
Treeの足元にドーナツ状のベンチを作成

Treeの足元にドーナツ状のベンチを作成していきます。
- 「Offset Curveコンポーネント」を使用して、ベースとなる円をオフセットします。今回はオフセット距離を300mmと700mmに設定しているので、半径800mmの円と1200mmの円が作成されています。
- 「Boundary Surfacesコンポーネント」を使用して、先ほど作成した2つの円同士の間にサーフェイスを張っていきます。
- 作成したサーフェイスを「Extrudeコンポーネント」を使用してZ方向に押し出していきます。今回は400mm押し出しております。

上画像の緑色箇所のようにベンチが出来上がっていればOKです。
あとは「Custum Previewコンポーネント」「Colour Swathコンポーネント」を使用して、作成したものに好きな色を割り当てていきます。
以上で完成です。データ構造がしっかりできていないと難しいチュートリアルとなっております。「Graft / Flatten / Simplify」の理解と、頻繁に「Panelコンポーネント」でデータの中身を確認しながらやると理解できてくるかと思います。