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

目次
概要

上画像がプログラムの全体像となっております。黄色のブロックは、おまけのアニメーション作成部分になります。
各ブロックごとに説明していこうと思います。
基準円弧作成

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

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

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

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

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

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

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

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

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

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



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