前回はコリジョンの説明をしたので、今回はコリジョンが起きた時にパーティクルをスプリットさせてみます。パーティクルをスプリットするときにはPOP Replicateノードを使うのですが、ちょっと分かりにくいので詳しく説明してみたいと思います。
今回のサンプルファイルです。
split.zip
結論から言うとネットワークは下のように組みます。POP Solver内でコリジョンを有効にし、Collide Groupで衝突したパーティクルのグループを作ります。
そしてPOP Replicateノードのインプット2にPOP Locationの出力を繋ぎます。POP ReplicateのGroupでPOP Solverで作ったグループを指定してやります。すると、衝突したパーティクルのみがPOP Replicateによってパーティクルが複製されます。
Birthタブでどのくらいパーティクルを発生させるのかを指定します。これはソースパーティクル1つに対しての設定です。なので、Inpulse Countを1(毎フレームにパーティクル1つだけ発生) に設定しても、ソースパーティクルが2つあれば、合計で2つのパーティクルが発生します。
Shapeタブのところでソースパーティクルに対してどの位置にパーティクルを作るかを設定できるので、ここではPointを指定します。Pointにすると複製されたパーティクルはソースパーティクルと同じ位置に作られます。そしてAttributesタブの中でAdd to inherited velocityにして速度をランダムに追加しています。
すると、パーティクルがスプリットされているのが分かりますが、衝突するたびにスプリットしてしまうのであまり良くありません。
そこでPOP Groupによって最初に衝突したパーティクルだけをグループ化し、それに対してPOP Replicateを使うことで、何回もスプリットされるのを防ぎます。
Geometry Spreadsheetを見ると、衝突した時はhitnumが1になるのが分かります。そして衝突するたびにhittotalが増加していきます。要はhittotalが1になった時だけにパーティクルをスプリットさせるのです。
POP Groupでは下のようなコードを書きます。これが意味するところはhittotalアトリビュートとhitnumアトリビュートが1の場合にのみにパーティクルをグループに追加するという事です。
ここではhogeグループを作っています。POP ReplicateでGroupのところで新しく作ったhogeグループを指定するのを忘れないように。
if(@hittotal == 1 && @hitnum == 1)
ingroup = 1;
これで最初の衝突の時だけスプリットされるようになりました。