STUDIO TAMA

thumbnail

投稿日:2022-03-11

【Grasshopper Tutorial】 Deformed Sphere Surface

  • #Grasshopper

  • #GH Modeling

  • #Basic

今回は上画像の様に球体を変形させたオブジェクトを作成していきたいと思います。プラグインを使用せず実装していきます。ツリー構造を理解していないとやや混乱するかもしれません。ツリー構造を理解してからチャレンジすることをお勧めします。また、おまけで下の Gif 画像の様なアニメーションも作成していこうと思います。こちらのチュートリアルは動画化しております、動画の方がよい方は以下のリンクからどうぞ!

thumbnail

概要

thumbnail

上画像がプログラムの全体像となっております。黄色のブロックは、おまけのアニメーション作成部分になります。

各ブロックごとに説明していこうと思います。

基準円弧作成

thumbnail
  1. Arc コンポーネントで基準となる円弧を作成します。原点(0,0,0) XZ 平面に半円を作成します。

円弧を複製し球を作成

thumbnail
  1. Rotate コンポーネントで先ほど作成した円弧を Z 軸を中心に回転させながら複製していきます。
  2. Range コンポーネントで回転角のリストを作成します。球体を生成したいので、0 ~ 2π を等分割していきます。Step 数に 100 を入力しています。0 Step から始まるので、101 の円弧で球が生成されます。ここで最初の円弧と最後の円弧が重なっていることが閉じたサーフェイスを生成するうえで重要になってきます。

円弧の分割し移動ベクトル作成

thumbnail
  1. Divide Curve コンポーネントで先ほど作成した円弧を分割していきます。今回は 30 分割しました。
  2. 作成した分割点を移動させることで球の表面を波打たせていきますが、球の上下の頂点は動かしたくないので、リストから間引いておきます。Cull Index コンポーネントに**「0,‐1」**を接続し、分割点のリストから最初と最後の点を間引きます。
  3. Vector 2Pt コンポーネントで、頂点を間引いた分割点のリストを球の中心点とのベクトルを作成します。

ベクトルの大きさを再設定 ①

thumbnail
  1. 先ほど作成した球の中心から各分割点に向かうベクトルの大きさを再設定していきます。
  2. List Length コンポーネントで作成したベクトルの数を取得します。入力端子をFlattenしておきます。変数が同じなら 2929 が取得できるかと思います。
  3. Range コンポーネントで「-1 ~ 1」を 2929 分割したリストを取得します。Step 数には 2928 を入力したいので、入力端子 N 上で右クリックを押し、Expressionで**「x-1」**と入力端子します。
  4. Range コンポーネントで作成した、値が 2929 個のリストをGraph Mapper コンポーネントで操作していきます。今回はPerlin Noiseを使用していきたいので、Graph TypePerlinとします。X,Y の範囲を‐1 ~ 1に設定します。
  5. **Perlin Noise**で操作した-1 ~ 1 までのリストにMultiplication コンポーネントで値を掛けていきます。今回は 50 倍しています。
  6. Jitter コンポーネントで 50 倍したリストをランダムに並べ替えます。

ベクトルの大きさを再設定 ②

thumbnail
  1. Jitter コンポーネントで並べ替えたリストは、上流でFlattenしているので、2929 個のリストが 1 ブランチ内に入っている状態です。再設定するベクトルは 29 個のベクトルが入ったブランチが 101 ブランチある状態なので、データ構造をベクトルに合わせていきます。Unflatten Tree コンポーネントを使用し、入力端子 T にJitter コンポーネントで作成したリストを、入力端子 G にVector 2Pt コンポーネントの出力端子を接続します。
  2. Amplitude コンポーネントでベクトルの大きさを再設定します。
  3. ここで閉じたサーフェイスとするため(※厳密には閉じていませんが。)に、円弧の重なり部分(0 番目の円弧と 101 番目の円弧)の移動距離を同じにしていきます。
  4. Split Tree コンポーネントで移動ベクトルが格納されている最後のブランチを消去していきます。Tree Statics コンポーネントで Path を取得し、List Item コンポーネントで‐1 番目を取得することで、最後のブランチの Path を取得します。
  5. Split Tree コンポーネントの入力端子 M に取得した最後のブランチの Path を接続することで、出力端子 N から最後のブランチを間引いたものが取得できます。
  6. Split Tree コンポーネントをさらに接続し、入力端子 D をSimplifyします。入力端子 N にPanel コンポーネントを使用し{0}を接続し、最初のブランチを指定し、出力端子 P から取得します。
  7. Entwine コンポーネントで取得した最初のブランチを最後に付け加えます。この時、端子下の Flatten をGraftに変更します。これで、移動ベクトル 29 個のが入った 101 ブランチの最初と最後のブランチが同一のベクトルとなるものが取得できました。(※ややこしいかもしれませんので、Panel コンポーネントでデータの中身を確認しながら行ってください。)

点を移動

thumbnail
  1. Move コンポーネントを使用し、Cull Index コンポーネントから取得できる、球の頂点を除いた分割点のリストを、先ほど作成したベクトルのリストで動かしていきます。後々のために、出力端子はSimplifyしておきます。

移動させた点をサーフェイス化

thumbnail
  1. Divide Curve コンポーネントの出力端子にList Item コンポーネントを接続し、-1 番目と 0 番目を取得することで、球の頂点を取得します。
  2. Merge コンポーネントで先ほど移動させた点のリストと頂点のリストを結合します。この時、D1 にはList Item コンポーネントの i 端子を、D2 にはMove コンポーネントで移動させた点のリストを、D3 にはList Item コンポーネントの‐1 番目の端子を接続します。
  3. Surface From Points コンポーネントMerge コンポーネントの出力端子をFlattenして接続します。U カウントには円弧の数 101 が入力されています。
  4. 最後にCustom Preview コンポーネントColour Swatch コンポーネントで色付けして完成です。

おまけ:Animation 作成 ① 球の表面の起伏

thumbnail
  1. おまけなので簡単に説明していきます。Grasshopper でアニメーションを作成する際は、Number Slider コンポーネントの Animate 機能を使っていきます。なので、1 つのNumber Slide コンポーネントを変化させることで、Gif 画像の様に球の表面を起伏させることと色を変化させることを実装しています。
  2. 上画像の黄色いグループでは、球体を徐々に起伏させ、また球体に戻すような処理を書いています。
  3. 工夫した個所は、Multiplication コンポーネントで 50 倍していた箇所を、0 ⇒ 50 ⇒ 0 といった感じで変化するように設定しています。
  4. もう 1 つは、Amplitude コンポーネントで再設定したベクトル量をRelative Item コンポーネントでブランチとリストをずらしています。こうすることで、ベクトル量がNumber Slider コンポーネントを動かすと同時に、1 ブランチ・1 リストずれて動きがでてきます。

おまけ:Animation 作成 ② 色を変化させる

thumbnail
  1. Colour Swatch コンポーネントPanel コンポーネントを接続するとわかるのですが、Colour Swatch コンポーネントが返す値は、RGB コードとなっております。右下の 2 個目の黄色いグループでは、RGB コードの値のうち、R と G の値を動的に変化させることで、色を変化させる処理を書いています。

おまけ:Animation 作成 ③

thumbnail
  1. 上画像の赤枠箇所のNumber Slider コンポーネントを変化させることで、Gif 画像の様な挙動をするので、右クリックでAnimation Controlを開き、保存先や Frame Count などを設定し OK を押せば、Frame Count 分の画像が出力されます。これらの画像を動画編集ソフトなどで動画化すればアニメーションの完成です。

完成

thumbnail
thumbnail
thumbnail

以上になります。データツリーを理解していないとやや難しく感じるかもしれません。Panel コンポーネントなどでデータの中身を確認しながらやってみてください。

目 次