今回はSOP Solverを使ってみます。
SOP Solverのドキュメントはこちら(英語)。
簡単なテストを試してみます。
Geometry内に、Attribute Wrangleを作成します。
ここでポイントを作成してみます。
Run Overは、detail(Only Once)を指定します。何度もイテレーションを行い、シーンに複数のポイントが必要な場合はPointのままでよいのですが、今回は開始時に1回だけ実行され、1つのポイントだけが欲しいのでこちらに変更します。
Attribute Wrangleでaddpoint Vex関数を使用するとポイントを追加することができます。
マニュアルをみると下記のように記載があります。
int addpoint(int geohandle, vector pos)
Creates a new point with the given position.
任意の位置にポイントを作成するにはgeohandleと位置情報を与える必要があるようです。
geohandleは、Attribute Wrangleの入力ポイントを指します。
0とすると最初の入力を示すことになります。
vector posはポイントを作成する位置をベクトルで入力します。もし、ワールドの原点に作成したいのであれば0,0,0とすることで原点に作成することができます。
addpoint(0,{0,0,0});
実行すると、原点に1つのポイントができています。
Point Numberを表示し、タイムスライダを動かして、常に原点に1つだけポイントが生成されていることがわかります。
1つのAttribute Wrangleで、ポイントを1つ作成することができたので、更にAttribute Wrangleを追加します。
2つ目のAttribute Wrangleでは方向を定義します。
v@direction = {1,0,0};
と定義することでVector型の変数として宣言し、その値に(1,0,0)を設定しました。
これをポイントのポジションに追加します。
2つ目のAttribute Wrangleを表示すると、ポイントが指定された方向に移動していることがわかります。
フレームによりランダムに方向が変化するようにrand関数と@Frameを追加します。
directionアトリビュートをGeometry Spreadsheetで確認することもできますが・・
visualizeノードを使用してdirectionをビューポートで確認できるようにします。
進む方向はフレームに基づいた乱数です。
フレームを変化させた場合、ポイントは再度計算されますが、前フレームのデータを引き継ぐことができません。
例えばパーティクルであれば、前フレームの値を引きついで、次のフレームで計算されますが、単純なSOPでは毎フレームで1つのポイントが移動するのみとなります。
そこでSop Solverを使用し、ジオメトリノードも前フレームの値を引き継ぎ、次のフレームで展開できるようにします。
ここまで作成したものを選択し、Ctrl+cでコピーし、その後削除します。
Solverノードを作成してください。
ダブルクリックして、solver内に入り、Ctrl+vで先ほどコピーしたノードをペーストします。
Solver内にあるPrev_Frameをペーストした1つ目のAttribute Wrangleに接続します。
Solverに戻り、フレームを再生してみます。
フレームで原点にポイントが作成され、移動、次のフレームで新しいポイントが作成されます。それがトレイルのように続き、移動方向は0-1でランダムに変化していることがわかります。