今回はGrasshopperを使用して、上画像のようなタワーを作成していこうと思います。
データ構造を把握しながら進めていく必要があるかと思いますので、「Panelコンポーネント」でこまめに中身をチェックしながら進めていくとより理解できるかと思います。また、今回「Weaver bird」というプラグインを少し使用してますが、なくても概ねできますのでインストールをするかしないかはお任せいたします。する方は、こちらからインストールしてください。
目次
概要

上画像がプログラムの全体像です。大まかな流れは以下の様になります。
- 各層のベースとなる多角形作成
- 多角形を拡大させる
- 多角形の回転
- 多角形の押し出し
- スパイラルチューブの位置を決定
- スパイラルチューブ作成
- 余分なスパイラルチューブの消去
- タワーの軸方向ベクトル作成
- タワー中心の柱を作成
- 必要な出力結果を整理
各層のベースとなる多角形作成

- 「Polygonコンポーネント」を使用し、多角形を作成します。入力端子Pには「Construct Pointコンポーネント」を接続し原点(0,0,0)を入力入力端子R・入力端子Sには「NumberSliderコンポーネント」で値を入力していきます。今回は、XY平面における原点を中心とした半径1000の5角形を作成しました。
- 「Boundary Surfacesコンポーネント」でサーフェイスを張ります。
- 「Moveコンポーネント」でZ方向に複製していきます。入力端子Gに「Boundary Surfacesコンポーネント」の出力端子を接続します。
- 「Seriseコンポーネント」を使用し、Z方向への移動距離を作成します。今回は、スタートを0とし、200ピッチでリストを作成し、50カウントします。
- 「Unit Zコンポーネント」で作成したリストをZ方向のベクトル化します。
- 「Moveコンポーネント」の入力端子Tに作成したベクトルを接続します。

上画像の様になっていればOKです。
多角形を拡大させる

- 「Scaleコンポーネント」を使用して各層の多角形を拡大していきます。入力端子Gに「Moveコンポーネント」の出力端子Gを接続します。
- 「Scaleコンポーネント」の入力端子Cに拡大させる際の基点を入力します。「Areaコンポーネント」を「Moveコンポーネント」の出力端子に接続し、各層の中心点を取得し接続します。
- 「Scaleコンポーネント」の入力端子F(Factor)拡大倍率を検討していきます。今回は下層から上層にかけて徐々に大きくなるように拡大させていきます。
- 「Remap Numbersコンポーネント」を使用し、「Seriseコンポーネント」で作成したリストを倍率にリマップします。入力端子Vに「Seriseコンポーネント」の出力端子を接続します。
- 「Boundsコンポーネント」を使用して「Seriseコンポーネント」の最小値から最大値までのドメインを作成し、「Remap Numbersコンポーネント」の入力端子S(Source)に接続します。
- 「Remap Numbersコンポーネント」の入力端子Tに倍率を入力します。「Construct Domainコンポーネント」で作成したドメインを接続していきます。今回は最下層で1倍、最上層で2倍としたいので、「1~2」のドメインを入力してます。
- 「Remap Numbersコンポーネント」で、「Seriseコンポーネント」で作成した50カウントのリストをリマップし、「1倍~2倍」までの50カウントのリストを取得できました。
- 「Moveコンポーネント」の入力端子Fに「Remap Numbersコンポーネント」で取得したリストを接続します。

上画像の様になっていればOKです。
多角形の回転

- 「Rotateコンポーネント」を2つ用意し、先ほど「Scaleコンポーネント」で作成した拡大させた層を接続します。
- 「Rotateコンポーネント」の入力端子Pに回転の中心を入力します。先ほど「Areaコンポーネント」で取得した各層の中心点を接続します。
- 「Seriseコンポーネント」を使って回転角のリストを作成します。今回は、下層から上層に向かって徐々に回転角を増やしていきます。入力端子Nには「Number Sliderコンポーネント」を接続し、増加させる角度、入力端子Cには層の枚数を入力します。今回は、5度ずつ増える50カウントのリストを作成しました。
- 「Rotateコンポーネント」の入力端子Aに作成した角度のリストを接続します。片方には作成したリストをそのまま接続し、もう一方は「Negativeコンポーネント」を接続して逆回転させていきます。
- 「Rotateコンポーネント」の入力端子A上で右クリックを押し、入力をDegreeに変更します。
- 「Rotateコンポーネント」で正回転させたものを、「Moveコンポーネント」を使用しZ方向に移動させます。移動距離は、各層の中間に入れたいので、序盤に作成した「Z方向の移動距離のピッチの半分」の距離を入力します。今回は200の半分で100になります。

上画像の様になっていればOKです。
多角形の押し出し

- 「Extrudeコンポーネント」を使用し、作成した多角形をZ方向に押し出していきます。今回は、負回転をさせた層のみをモデルとして使用していきたいので、そちらのみ押し出していきます。
- 「Unit Zコンポーネント」で押し出し距離を設定します。

ちょっとわかりづらいですが、近くで見ると厚みがついてます。
スパイラルチューブの位置を決定

続いて、スパイラル上のチューブを作成していきます。まずは位置を決定していきます。
- 「Scaleコンポーネント」2つ用意し、先ほど「Rotateコンポーネント」で回転させた各層をそれぞれ縮小していきます。入力端子Gに「Rotateコンポーネント」の出力端子をそれぞれ接続します。
- 「Areaコンポーネント」を使用各層の中心点を取得、それぞれ「Scaleコンポーネント」に接続します。
- 「Scaleコンポーネント」の入力端子Fに縮小倍率を接続します。今回は0.7を入力しています。

上画像の緑色が縮小した層になります。この緑の層の位置にスパイラル上のチューブを作成していくので、元々の層から0.7倍セットバックした位置に作成していくことになります。
スパイラルチューブ作成

縮小した各層の5角形の各頂点を接続していくことで、スパイラル上のチューブを作成します。
- 「Deconstruct Brepコンポーネント」を使用し、縮小した多角形の頂点を取得します。


- 「Deconstruct Brepコンポーネント」で取得した頂点を「Panelコンポーネント」に接続して中身を確認すると、各層の頂点(今回は5点)を含んだブランチが層の個数分あることがわかります。つまり層ごとに頂点がグループ分けされていることがわかります。
- 「Flip Matrixコンポーネント」を使用し、リストの行列を反転させ再度「Panelコンポーネント」で確認すると、各層の1つの頂点(今回は50点)を含むブランチが5個になったことがわかります。つまり縦方向にグループ化されたことがわかります。
- 「Flip Matrixコンポーネント」でグループ化した頂点のリストを「Interpolateコンポーネント」を使用してそれぞれ繋いでいきます。
- 「Pipeコンポーネント」を使用してパイプ化していきます。入力端子Cに2つの「Interpolateコンポーネント」を接続し、入力端子Rにパイプの半径を入力します。

上画像の様にスパイラル上のパイプができていればOKです。
余分なスパイラルチューブの消去


上画像1枚目の様に、先ほど作成したスパイラル上のパイプのうち半分は、最上段ではみ出てしまっています。はみ出た部分を消去していきます。
- 「Pipeコンポーネント」の出力端子を「Flattan」しておきます。
- 「Dispatchコンポーネント」を使用して、はみ出ている方のパイプを取得します。今回は出力端子Bから取得できました。
- 「Reverse Listコンポーネント」を「Scaleコンポーネント」で縮小した平面のリストに接続し、「List Itemコンポーネント」で0番目のリスト取り出すことで、最上段のサーフェイスを取得します。
- 「Planeコンポーネント」に「List Itemコンポーネント」の出力端子を接続し、最上段の平面を取得します。
- 「Brep | Planeコンポーネント」を使用し、はみ出たパイプと最上段の平面との交線を取得します。入力端子Bに「Dispatchコンポーネント」を、入力端子Pに「Planeコンポーネント」を接続します。
- 「Split Brepコンポーネント」を用いて、はみ出た部分を切断していきます。入力端子Bに「Dispatchコンポーネント」で取得したパイプを接続し、「Graft」しておきます。入力端子Cには「Brep | Planeコンポーネント」で取得した交線を接続します。
- 「List Itemコンポーネント」で切断後のパイプを取得します。

上画像の様にきれいに切断されていればOKです。
タワーの軸方向ベクトル作成

中央の柱を作成する前に、下準備としてタワーの軸方向のベクトルを取得しておきます。
- 「List Itemコンポーネント」を使用し、縮小した各層を出力している「Scaleコンポーネント」に接続し、0番目の値を取得することで、最下段のサーフェイスを取得します。
- 「Reverse Listコンポーネント」を、縮小した各層を出力している「Scaleコンポーネント」に接続し、「List Itemコンポーネント」で0番目の値を取得すことで最上段のサーフェイスを取得します。
- 「Areaコンポーネント」でそれぞれの中心点を取得します。
- 「Vector2Ptコンポーネント」で「Areaコンポーネント」で取得した中心点をつなぐことで軸方向のベクトルを取得できました。
タワー中心の柱を作成

- 「Scaleコンポーネント」に、先ほど「List Itemコンポーネント」で取得した最下段のサーフェイスを接続します。
- 「Scaleコンポーネント」の入力端子Cに、先ほど「Areaコンポーネント」で取得した最下段のサーフェイスの中心点を接続します。
- 「Scaleコンポーネント」の縮小倍率を入力します。今回は0.9を入力しています。この位置に内部の柱を据えていきます。
- 「Extrudeコンポーネント」を使用し、縮小したサーフェイスを押し出していきます。入力端子Bに「Scaleコンポーネント」の出力端子を、入力端子Dに「Vector2Ptコンポーネント」の出力端子を接続します。(※ここから後はプラグイン「Weaverbird」を使用しますが、不要であれば飛ばしていただいて大丈夫です)
- 「Extrudeコンポーネント」の出力端子に「Meshコンポーネント」を接続し、メッシュ化します。
- プラグインWeaverbirdを使用します。「Weaverbird’s Split Triangles Subdivisionコンポーネント」でメッシュを細分化します。入力端子Mに先ほど作成した「Meshコンポーネント」を接続し、入力端子Lに細分化レベルを接続します(今回は2を接続しています)。
- 「Weaverbird’s Picture Frameコンポーネント」に、先ほど「Weaverbird’s Split Triangles Subdivisionコンポーネント」で細分化したメッシュを接続し、穴をあけていきます。入力端子Dにメッシュのエッジにどれくらい厚みを持たせるか入力します。今回は10を入力してます。

上画像の様な柱ができていればOKです。
必要な出力結果を整理

最後に必要な出力結果を整理します。
- 「Brepコンポーネント」を用意し、スパイラル上のパイプを取得します。上部をカットしたパイプを「List Itemコンポーネント」から、カットをする必要がなかったパイプを「Dispatchコンポーネント」の出力端子Aから取得します。
- 「Meshコンポーネント」を用意し、「Weaverbird’s Picture Frameコンポーネント」の出力端子から中央の柱を取得します。
- 「Brepコンポーネント」を使用し、各層のプレートを取得します。「Extrudeコンポーネント」の出力端子から取得します。

完成です!変数をいじっていろんな形状を試してみて下さい!最後に「WeaverBird」というプラグインを少し使用しましたが、他にもいろんなことができるので、ぜひ試してみてください!
【参考文献】
- Grasshopper Docs : https://grasshopperdocs.com/
- Giulio Piacentio : https://www.giuliopiacentino.com/weaverbird/