今回は 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 コンポーネント」の出力端子を接続します。
1- 「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」します。
1- 「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 コンポーネント」でデータの中身を確認しながらやると理解できてくるかと思います。