今回は 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」というプラグインを少し使用しましたが、他にもいろんなことができるので、ぜひ試してみてください!
【参考文献】