GH Tutorial Grasshopper Objects

【Grasshopper Tutorial】 Balls popping up with cosine wave

今回は、COS波を使用して下のGIF画像のように、波状に飛び出すボールを実装していこうと思います。難易度は中級程度ですが、よく使用するパターンかなとも思うので是非実装してみてください。このチュートリアルでは、三角形グリッドを作成する際にLunchBoxというプラグインを使用しています。こちらからインストールしてからチャレンジしてみてください。こちらのチュートリアルは動画化しております、動画の方がよい方は以下のリンクからどうぞ!

概要

上画像がプログラムの全体像となっております。各ブロックごとに説明していこうと思います。

三角形グリッドを作成

  1. Polygonコンポーネントで三角形を作成します。
  2. プラグインLunch BoxのSubdivide Triangleコンポーネントを使用し、作成した三角形を小さな三角形で分割し、三角形グリッドを作成します。

蓋の作成

  1. Surfaceコンポーネントで三角形グリッドの各要素をサーフェイス化します。
  2. Areaコンポーネントで各三角形サーフェイスの中心点を取得します。
  3. Discontinutyコンポーネントで各三角形の頂点を取得します。
  4. Lineコンポーネントで各頂点と中心点を結ぶ直線を作成します。中心点の入力はGraftしてデータ構造を頂点に合わせます。
  5. Surface Splitコンポーネントで先ほど作成した直線で、各三角形サーフェイスを切断します。各三角形サーフェイスが3つの2等辺三角形サーフェイスに分割されました。

蓋を開閉する回転軸を取得

  1. Explodeコンポーネントで先ほど作成した2等辺三角形サーフェイスのエッジを3本の直線に分割します。このうち最も長い直線を回転軸とします。
  2. Lengthコンポーネントで3本の直線の長さを取得します。
  3. Sort Listコンポーネントで分割した直線のリストを長さ順に並べ替えます。これでリストの一番最後に長い直線がきます。

蓋の開閉方向の整理

  1. 先ほど取得した回転軸を中心に、二等辺三角形を回転させれば蓋が開閉するのですが、回転軸の方向がまちまちなので、上に開くものと下に開くものがあり、すべて上側に統一するひつようがあります。その処理をしていこうと思います。
  2. Sort Listコンポーネントで並べ替えた二等辺三角形のエッジのリストから最後の値(-1番目)を取得し、回転軸を取得します。
  3. Surface Splitコンポーネントの出力端子にGraft Treeコンポーネントを接続します。入力端子をFlattenして接続することで、各直線が個別のブランチに格納されます。後々楽なのでこの処理をしています。
  4. Is Planeコンポーネントを接続し、各二等辺三角形の法線ベクトルを取得し、Unit Vectorコンポーネントで単位ベクトルに変換します。
  5. リストの中身を確認するとわかるのですが、法線方向が上向きのものと下向きのものがあります。ここでFlipコンポーネントで法線方向を揃えれば開閉方向が統一しそうなもんですが、実際は回転軸をFlipしなければいけないので、法線方向が負の方向の三角形のみ取得していきます。Member IndexコンポーネントでとConstruct Vectorコンポーネントで値が(0,0,-1)のリストのインデックスを取得します。
  6. List Itemコンポーネントで先ほど取得したインデックスの直線を取得し、Flipコンポーネントで向きを反転します。
  7. Cull Indexコンポーネントで反転させなかった直線も取得します。
  8. Mergeコンポーネントで反転した直線としなかった直線を結合して、先ほどのデータ構造になるように元に戻します。この時、Cull Indexコンポーネントの後にTrim Treeコンポーネントをかまし、Tree構造の階層を合わせてます。
  9. Rotateコンポーネントで向きを統一させた軸を中心に二等辺三角形を回転させていきます。適当に上画像の様に45度回転させると上画像の様になると思います。この回転角度をCos波を用いて段階的に開閉させていきます。

蓋の開閉角度のリスト作成①

  1. それでは段階的に開閉させるための角度のリストを作成していきます。
  2. Discontinutyコンポーネントで最初に作成した大きな三角形の頂点を取得し、List Itemコンポーネントで頂点を1つ取得します。今回は‐1番目を取得しています。
  3. Pointコンポーネントで以前Areaコンポーネントで取得した三角形グリッドの中心点を取得してきます。
  4. Discontinutyコンポーネントで先ほど取得した頂点と各グリッドの中心点までの距離のリストを作成します。

蓋の開閉角度のリスト作成②

  1. 作成した距離のリストをRemap Numbersコンポーネントで角度にリマップします。とりあえず0度~360度にリマップします。こうすることで、先ほどの距離が短ければ0度に近づき、長ければ360度に近づきます。Radiansコンポーネントでラジアンに変換し、出力端子をGraftします。
  2. この角度のリストをCosコンポーネントに接続していく前に、波の位相をずれをコントロールするためにAdditionコンポーネントで角度を足し算できるようにしておきます。最終的にこのスライダーを変化させることで、波の頂点をずれていき、波打つようにボールが飛び出すようになります。とりあえず今は0度を足しておきましょう。
  3. 足し算した角度をCosineコンポーネントに接続し、Cos波を取得します。-1~1までのが取得できているかと思います。

蓋の開閉角度のリスト作成③

  1. 先ほどCosコンポーネントで取得したリストは-1~1までの値となっております。1のとき蓋が完全に開いた状態、-1~0のときは閉じた状態、0.5のときは半分開いた状態、といった感じでCosの値によって開く角度を変えていこうと思うので、この値に角度を掛けていくことで、蓋の開き角度を設定していきます。
  2. とりあえず負の値に角度を掛けると下側に蓋が開いてしまうので、Maximumコンポーネントを使用し、負の値は0になるようにします。これでCosのリストが0~1までの値になりました。
  3. Multiplicationコンポーネントで角度を掛けていきます。この時かける角度は最大開き角度を掛けます。今回は90度を掛けているので、最も開いたときは90度となります。つまり、先ほどのリストが1のとき90度蓋が開き、0.5のときは45度、0のときは0度といった感じになります。Radiansコンポーネントでラジアン変換します。
  4. Repeat Dataコンポーネントで各値を3つずつ用意します。1つの三角形グリッドに対して3との2等辺三角形があるので3つ用意しています。
  5. Graft Treeコンポーネントを用意入力端子をFlattenし、Graftすることで、角度のリストを個別のブランチに格納します。これを先ほどのRotateコンポーネントに接続すると上画像の様になります。
  6. 頂点からの距離が一番近い箇所と最も遠い箇所で蓋が90度開いているかと思います。これは、Cosの値は0度のときと360度のときに値が1となるためです。
  1. 上画像の赤丸で囲ったNumber Sliderコンポーネントを変化させると波の周波数を変えることができます。例えば、720度にすれば、2波できるので90度開く箇所が2波分できます、
  2. 上画像の青丸で囲ったAdditionコンポーネントで足している位相のNumber Sliderコンポーネントを変化させれば、蓋が波打つように開いていくと思います。

ボールを作成

  1. Pointコンポーネントで三角形グリッドの中心を持ってきます。
  2. Line SDLコンポーネントで各三角形グリッドの中心点からZ方向に延びる直線を作成します。長さは0.4にしています。
  3. Evaluate Curveコンポーネントを作成した直線に接続し、Reparametraizeします。入力端子tに先ほど作成したMaximumコンポーネントの出力端子0~1までの値を接続します。こうすることで、0のとき直線の始点、1のとき直線の終点を取得できます。
  4. Mesh Sphereコンポーネントで取得した点を中心とした球を作成します。Brepでもいいのですが、メッシュの方が動作が軽いのでメッシュにしています。
  5. 蓋が閉じ切ったとき、球は蓋より下あってほしいので、作成した球体をMoveコンポーネントで-Z方向に移動させます。-0.15動かすといい感じになりました。調整してみてください。

蓋に隙間を設ける

  1. 現状、蓋同士がゼロタッチなので、若干小さくします。Curve Middleコンポーネントで回転軸の中心点を取得します。
  2. Scaleコンポーネントで取得した中心点をもとに縮小します。0.98倍しました。

箱の作成

  1. 一番最初に作成した大きなPolygonコンポーネントから取得できる大きな三角形をExtrudeコンポーネントでーZ方向に押し出します。-0.2押し出しています。
  2. Cap Holeコンポーネントで蓋をします。
  3. 上面は不要なので取り除きます。Deconstrut Brepコンポーネントで分解し、Cull Indexコンポーネントで上面を取り除きます。リストの4番目が上面でした。
  4. Custom PreviewコンポーネントColour Swatchコンポーネントで色付けします。

ボールの色付け

  1. ボールの色付けをします。今回は虹色に変化するように設定していきます。NumberコンポーネントMaximumコンポーネントから取得できる0~1までのリストを取得します。リストはFlattenしておきます。
  2. Boundsコンポーネントで最小値~最大値までのドメインを取得し、Deconstruct Domainコンポーネントで最小値と最大値を取得します。
  3. GradientコンポーネントのL0に最小値、L1に最大値を接続し、Numberコンポーネントで取得した0~1までのリストを入力端子tに接続します。
  4. Custom Previewコンポーネントに接続し色付けします。ボールが最も高い位置にあるときは、Gradientコンポーネントの右側の色、最も低い位置のときは左側の色に近づきます。

完成

以上になります。最初のGif画像のようなアニメーションを作成したい方は、位相をずらすためのNumber SliderコンポーネントでAnimate機能を使用し、動画編集ソフトなどで画像を結合してアニメーションを作成してみてください。難しく感じた方は、Panelコンポーネントでデータの中身を確認しながら、少しづつ進めいき理解していっていただければと思います。

-GH Tutorial, Grasshopper, Objects
-, ,