GH Basics GH Tutorial Grasshopper Objects

【Grasshopper Tutorial】 Sin波を描いて『Remap Numbersコンポーネント』を理解する

前回の記事で、「Remap Numbersコンポーネント」の基礎について記事を書きました。今回は、実践編として上画像の様に正方形の中心から発生するSin波を描く過程で「Remap Numbersコンポーネント」を使用していきたいと思います。
「Remap Numbersコンポーネント」の基礎がわかっていない方は、前回の記事のリンクも参考に載せておきますので是非参考にしてください。
また、こちらのチュートリアルは動画化もしてますので、動画の方がよい方は是非以下のリンクからご覧ください。

概要

上画像はコードの全体像となっております。大まかな流れは以下の様になります。

  1. 正方形を作成しサーフェイス化
  2. 正方形をグリッドに分割
  3. 正方形の中心からグリッドの各交点までの距離を取得
  4. 取得した距離を長さに応じて角度にRemap
  5. グリッドの各交点をsin波を使って移動させる
  6. 移動させる点を制限する
  7. 移動した点からサーフェイスを作成

ざっくりとした流れはこんな感じになります。それでは早速説明していきます。

正方形を作成しサーフェイス化

  1. 「Rectangle コンポーネント」を使用して正方形を作成していきます。今回は1辺10m(10000mm)の正方形を作成しております。
  2. 「Areaコンポーネント」を使用して正方形の中心点を取得しておきます
  3. 「Boundary Surfacesコンポーネント」を使用して、正方形をサーフェイス化しておきます。

正方形をグリッドに分割

  1. 「Divide Surfaceコンポーネント」を使用して、作成した正方形のサーフェイスをグリッド状に分割します。今回は28個×28個のグリッドに分割しました

上画像の様に、作成した正方形が指定した数で分割されていればOKです。

正方形の中心からグリッドの各交点までの距離を取得

  1. 「Lineコンポーネント」を使用して、正方形の中心点からグリッドの各交点を結ぶ直線を作成します。
  2. 「Lengthコンポーネント」を使用して、各直線の長さを取得します
  3. 「Lengthコンポーネント」の出力端子を「simplify」し不要な階層を消去します。更に、「Flatten」しデータを1つのブランチに格納します。

取得した距離を長さに応じた角度にRemap

グリッドの各点が、正方形の中心点から離れれば離れるほど大きき角度になるようなプログラムを書いていきます。

  1. 「Remap Numbersコンポーネント」を用意して、入力端子V (Value)に先ほど取得した正方形の中心点からグリッドの各交点までの距離を接続します。
  2. 「Boundsコンポーネント」を使用して、正方形の中心点からグリッドの各交点までの距離の最大値から最小値までのドメインを取得します。
  3. 「Remap Numbersコンポーネント」入力端子S (Source)に「Boundsコンポーネント」で取得したドメインを接続します。
  4. 「Remap Numbersコンポーネント」入力端子T (Target) に、「Multiplicationコンポーネント」と「NumberSliderコンポーネント」を使用して、360の倍数を入力していきます。上画像では1080を入力しております。
  5. 「Remap Numbersコンポーネント」の出力端子R (Mapped)から、正方形の中心点からグリッドの各交点までの距離を、0~1080までの範囲でRemapしなおした値のリストを取得することができました。正方形の中心に近ければ近いほど値は小さく、遠ければ値は大きくなります。

「Panelコンポーネント」を接続して取得したリストを確認してみてください。上画像のようなリストが取得できていればOKです。(※設定したドメインによって中身は変わってくると思います。

グリッドの各交点をsin波を使って移動させる

  1. 「Remap Numbersコンポーネント」で取得した「0~1080」までの値を「Radiansコンポーネント」を使用してラジアンに変換していきます。
  2. 「Sineコンポーネント」を使用して、「Radiansコンポーネント」の出力端子を接続することで、Sin波を取得することができました。上画像では、Remapした範囲を「1080 = 360×3」としているので、中心点から端部まで、3波長分のsin波を取得できてます。
  3. 「Multiplicationコンポーネント」を使用して、sin波の振幅を設定していきます。上画像では500mmとしております。「Sineコンポーネント」の出力端子も接続し、sin波に振幅を掛けていきます。
  4. 「Unit Zコンポーネント」を使用し、Z方向のベクトルに変換します。また、出力端子を「Graft」することで、値を個別のブランチに格納します。
  5. 「Moveコンポーネント」を使用し、グリッドの各交点を、取得したSin波を使用して移動させます。入力端子Gには「Divide Surfaceコンポーネント」で取得したグリッドの各交点を「Graft」したものを接続し、入力端子T(Motion)に「Unit Zコンポーネント」の出力端子を接続します。

「Moveコンポーネント」以外をPreviewOffにして上画像の様になっていればOKです。正方形の中心点から発生するSin波が見えてきました。

移動させる点を制限する

移動させる点を制限していこうと思います。今回はグリッド各交点が正方形に内接する円の範囲を超える場合、その点は移動させないようにしています。

  1. 「Divisionコンポーネント」を用意して、最初に設定した正方形の1辺の長さの半分の値を取得します。
  2. 「Minimumコンポーネント」を使用し、「Divideコンポーネント」で取得した正方形の1辺の半分の長さと、「Lengthコンポーネント」で取得した、正方形の中心点からグリッドの各交点までの距離を比較し、小さいほうの値を返します
  3. 「Remap Numbersコンポーネント」の入力端子Vに「Minimumコンポーネント」で取得した値を接続しなおします。
  4. 「Boundsコンポーネント」の入力端子も「Minimumコンポーネント」に接続しなおします。

上画像の様に、Z方向に移動している点が正方形に内接する円の範囲内に制限されていればOKです。

移動した点からサーフェイスを作成

  1. 「Moveコンポーネント」の出力端子から得られた、Z方向に移動した点のリストを「Flattan」し1つのブランチ内に格納します。
  2. 「Surface from Poinsコンポーネント」を使用し、移動させた点からサーフェイスを生成していきます。入力端子P(Points)に「Moveコンポーネント」の出力端子を接続します。
  3. 「Surface from Poinsコンポーネント」の入力端子UにU方向のグリッドの頂点の数を入力します。今回は28×28のグリッドに分割したので、頂点の数は「28+1=29」となります。
  4. 「Custom Previewコンポーネント」「Colour Swatchコンポーネント」を使用して色付けして完成です。

上画像の様になっていればOKです。「Remap Numbersコンポーネント」に接続しているTargetの範囲を調整したり、「Sineコンポーネント」と掛けている振幅を調整すれば、波の数や高さを変更することもできます。

以上になります。今回は「Remap Numbersコンポーネント」を使った例を紹介しました。便利なコンポーネントなので是非使いこなしましょう。

【参考文献】

-GH Basics, GH Tutorial, Grasshopper, Objects