どうも篠島です。前回はSolverノードの簡単な使い方をしました。Solverノードは名前の通り毎フレーム処理されることからソルバーを作るのに利用されます。ここで今回はものすごく簡単な物理シミュレーションをSolverノードで実装してみます。
今回のサンプルファイルです。
Solver2.zip
まずはポイントを一つ作ります。そしてSolverノードを繋げ、中でWrangleノードで物理シミュレーションを書きます。物理シミュレーションと書くと凄いことをしてそうに聞こえますが、実際は全然大したことはしてません。ただ重力に従ってポイントを下に移動させているだけです。今回の例では、ポイントの位置が 0 以下になった時にVelocityの向きを反転させることによって、地面でバウンスさせています。
以下のコードが毎フレーム重力をVelocityに追加しています。重力は毎秒 9.8m かかります。1フレームでいきなり 9.8 の重力はとんでもない力なので、@Timeincを掛けています。@Timeincはグローバル変数でシーンの設定によりかわります。24 FPS だと @Timeinc の値は 1 / 24 という事です。
@v += {0, -9.8, 0} * @Timeinc;
そして以下のコードが地面でバウンスさせるものです。ポイントの値が0以下になると落下するVelocityがいきなり上昇するVelocityになるのでバウンスしているように見えます。
if(@P.y < 0)
@v.y = -@v.y;
そして現在の位置にVelocityを追加して新しい位置を求めます。
@P += @v * @Timeinc;
そして再生してみるとポイントが重力に従って落下し、地面でバウンスするのが確認できます。
これをポイントではなく別のジオメトリに適用してみると下のようになります。全てのポイントが同様に重力にしたがって落下しバウンスしています。
たった数行のコードで色々と面白いことができるSolverノードの強力さを分かって頂けたら幸いです。