今回は、上画像の様にサーフェイスをnoiseやsine波を使用して変形させていきます。数パターン実装していきますので、自分なりに応用してみてください。またAnemoneというプラグインを使用していますので、インストールしていない方はこちらのリンクからインストールしてから臨んでください。こちらのチュートリアルは動画化しております、動画の方がよい方は以下のリンクからどうぞ!
概要

上画像がプログラムの全体像となっております。各ブロックごとに説明していきます。
基準となる点を生成

- Rectanglarコンポーネントでグリッドを作成します。今回は、1マス1×1で100マス×100マスのグリッドを作成しました。
- Rectanglarコンポーネントの出力端子Pから、グリッドの交点を取得し、Pointコンポーネントに格納します。101点×101点で10201点取得できるかと思います。取得した点のリストをFlattenしときます。
- これらの点を移動させ、最終的にサーフェイス化していきます。
Sine波を生成し点を移動①

- Deconstructコンポーネントで先ほど取得した点をx, y, z成分に分解します。
- x座標をパラメーターをしたSine波を生成します。まずは、x座標の値から角度を生成していきます。Remap Numbersコンポーネントを用いて、取得したx座標を0度~720度に変換します。Radiansコンポーネントで弧度法に変換します。
- Y座標も同様に変換します。Y座標に関しては、0度~540度に変換しています。
Sine波を生成し点を移動②

- 先ほど取得した角度を使用し、SineコンポーネントでSine波を生成していきます。
- Multiplicationコンポーネントで取得したSine波に振幅3を掛けます。
- Multiplicationコンポーネントで振幅を掛けた2つのSine波をかけ合わせ、Unit ZコンポーネントでZ方向のベクトルに変換します。
- MoveコンポーネントでZ方向に点を移動させれば、上画像の様に点が波打つように移動するかと思います。
- 今回、x方向は720度(2周期分)、y方向は540度(1.5周期分)にしているので、x方向は4山、y方向は3山分波打っているかと思います。
Perlin noiseを使用し細かく変形させていくための値を取得

- Sine波を使用して変形させた点を更に細かく変形させていきます。Deconstructコンポーネントで変形させた点をx, y, z成分に分解していきます。
- プラグインAnemoneを使用します。Loop Start / Loop Endコンポーネントを用意します。取得したz座標をAnemoneで再帰処理を行い、変化させていきます。ループ回数は10回としています。
- 先ほど取得したx座標の値から、Perlin noiseでz方向に変化させる値を取得していきます。Graph Mapperコンポーネントを用意し、x座標を接続します。Graph TypeをPerlinにし、x座標の値をノイズで変化させていきます。
- これらの値をRemap Numbersコンポーネントで0~1の値にリマップします。
- 元のz座標の値に、Perlin noiseで取得した値を足し合わせます。この処理を10回ループします。
点を移動させ、サーフェイスの生成

- Construct Pointコンポーネントに元のx, y座標、Perlin noiseで生成したz座標を使用し、点を更に移動させます。
- Surface From Pointsコンポーネントで移動させた点からサーフェイスを生成します。u方向のポイント数は、101になるので101を接続します。
- 最初にSine波で変形させ、更にPerlin noiseでx方向に細かく変形させています。今回、x座標の値を用いてノイズを生成したので、x方向が同じ点は同じ変形量になります。y座標を使用すれば、y方向に波打つようになるかと思います。
端部の変形を抑える①

- 端部の変形を抑えていきます。まずは、端部の点がリストのどこにあるかを取得したいので、端部の点のインデックス番号を取得します。
- Rectangleコンポーネントでグリッドの外形と同サイズの正方形を生成します。
- Point in Curveコンポーネントで最初に取得した10210点が生成した正方形の内側 / 外側 / カーブ上なのかを判別していき、カーブ上の点を取得していきます。
- Point in Curveコンポーネントは点がカーブ上にあるとき、1を返すので、Member Indexコンポーネントで1の値のインデックス番号を取得します。これで、端部の点のインデックス番号が取得できました。
端部の変形を抑える②

- Construct Pointコンポーネントにanemoneで取得したz座標をそのままつないでいましたが、端部の変形を抑える処理を間にかまします。
- anemoneで取得したz座標をBoundsコンポーネントとDeconstruct Domainコンポーネントで最小値と最大値を求め、Averageコンポーネントで2つの値の平均値を取得します。
- Replace Itemsコンポーネントで先ほどMemberIndexコンポーネントで取得したインデックス番号の点を、Averageコンポーネントで求めた平均値に値を置き換えます。
- これをz座標に接続すれば、端部の変形を抑えることができます。
別パターン実装

- Anemone内の値を変化させて数パタン実装してみたものが上画像になります。
- 色々変化させて自分なりに試してみて下さい。
以上になります。しっかり理解すればいろんなことに応用がきくかと思います。是非理解して使いこなしてみてください。