今回は、上画像の様にサーフェイスを 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 内の値を変化させて数パタン実装してみたものが上画像になります。
- 色々変化させて自分なりに試してみて下さい。
以上になります。しっかり理解すればいろんなことに応用がきくかと思います。是非理解して使いこなしてみてください。