パーティクルを用いたドミノ倒し
https://www.youtube.com/watch?v=kVjhDeckaLw
今回はパーティクルを用いてドミノ倒しを表現してみます。
ドミノ倒しはダイナミクスを使って表現することもできますが、今回はよりお手軽にパーティクルとフォールオフプローブという機能を利用し、サンプルのような完成シーンを作っていきます。この表現方法については日本語解説ビデオ「リプリケータ内の個々のアイテムをトランスフォームさせるには」と基本的な設定方法は同じですので、そちらをご覧いただいても良いかと思います。
サンプルとなるシーンには、ブロックがひとつ用意されています。このブロックをドミノ倒しができるように、リプリケータで複製しようと思います。ブロックを複製する位置、つまりリプリケータのポイントソースを作成するのに、パーティクルジェネレータを使います。セットアップツールバーからパーティクルのタブに切り替えると、パーティクルモディファイヤの中にジェネレータがあります。これは配列状にパーティクル、つまりポイントソースを生成してくれるものになりますので、こちらをクリックします。生成されたパーティクルはそのままでは確認できませんので、リプリケータを作ってブロックを複製させます。
アイテムリストのアイテム追加 > パーティクル > リプリケータを追加し、原型となるアイテムにブロックを、ポイントソースにパーティクルジェネレータを追加します。ドミノ倒しができるぐらいに、パーティクルジェネレータの配列の値を調整します。これで配置はOKそうですが、ドミノ倒しを行うには、リプリケータで複製する個々のブロックが回転を行う必要があります。
ポイントソースとなるパーティクルがそれぞれに回転を行うには、パーティクルジェネレータをポイントソースとするのではなく、パーティクルジェネレータをもとに、パーティクルシミュレーションでパーティクルを発生させる必要があります。パーティクルジェネレータを基にするために、ジェネレータを選択した状態で、ソースエミッターをクリックします。アイテムリストを見ると、パーティクルシミュレーションが生成されているのがわかります。リプリケータのポイントソースをジェネレータから、このパーティクルシミュレーションへと変更しておきます。
シミュレーションさせてみると、ブロックがばらばらと発生しています。一度にブロックを発生させるためには、ソースエミッターの放射モードをパルスへと変更します。さらに放射レートで一度に放射するパーティクルの数を設定させますが、このパーティクルの数はジェネレータで発生させる数と一致させておく必要があります。手動でジェネレータのカウントで指定した数を指定しても良いのですが、あとからトライアンドエラーが何度でもできるように、スケマティックでこの数を連動させるようにします。
スケマティックビューを開き、パーティクルジェネレータとソースエミッターを追加します。ジェネレータのカウントXとZを追加し、この二つの値を演算ノードで掛け合わせ、ソースエミッターの放射レートへと接続します。こうすることで、ジェネレータで発生したポイントソース分、パーティクルが発生するようになります。この発生するパーティクルはぴたっと静止していてほしいので、ソースエミッターの初期速度と速度の広がりを0にしておきます。
シミュレーションすると、静止状態でブロックが複製されているのがわかります。この状態だと、わざわざソースエミッターでパーティクルを発生させる必要もないように思われますが、パーティクルシミュレーションにより個々のパーティクルに対する回転を設定することができるようになります。
パーティクルシミュレーションの個々のパーティクルの属性を取得したり、設定したりするためにはパーティクルオペレータが必要になります。パーティクルシミュレーションを選択したら、パーティクルタブからパーティクルオペレータを追加します。シミュレーションとオペレータをスケマティックビューへと追加し、オペレータのノードを右クリックすると、パーティクル特性の追加というカテゴリがあり、その中に取得もしくは設定可能なパーティクルの属性が用意されているのが確認できます。今回、ドミノ倒しのようにブロックを倒すにはフォールオフを使い、フォールオフと個々のパーティクルの位置により、影響を受けるフォールオフの強さとパーティクルの回転を連動させるようにします。ですので、パーティクル特性の追加から、個々のパーティクルの位置情報を取得する位置(Read Only)を追加しておきます。
さらにブロックが回転する箇所のパーティクルを指定するためのフォールオフが必要ですので、まずはラディアルフォールオフを追加しておきます。このフォールオフとパーティクルの位置関係による影響の値を算出するために必要となるのが、フォールオフプローブです。追加 > チャンネルモディファイヤ > プローブ > Falloff Probeを追加します。Fallof Probeのフォールオフには、先ほど追加したRadial Falloffを接続しておきます。このフォールオフプローブにはパーティクルの位置を接続したいので、フォールオフプローブのノードを右クリックし、チャンネルの追加から位置XYZと出力を追加したら、パーティクルオペレータの位置を接続しておきます。フォールオフプローブの出力値、つまりフォールオフの影響の強さを個々のパーティクルの回転値としたいので、パーティクルオペレータのノードを右クリックし、パーティクル特性の追加 > 回転を追加します。この設定する回転値のタイプは行列ですので、ベクトル値を行列へと変換するノードを追加 > 行列 > Matrix From Eulerで追加します。今回の場合、ブロックはX軸を中心に回転したいので、フォールオフプローブの出力値を入力Xへ、ワールド回転をオペレータの回転へと接続します。フォールオフプローブの出力値の範囲は0~1までですので、X軸の回転値として適切となるよう、乗算ノードを追加し、適切な値で掛け合わせます。あとはフォールオフの大きさを調整し、位置を移動させるアニメーションを設定したら、シミュレーションをキャッシュし確認してみます。
フォールオフの影響具合がソフトすぎるようであれば、フォールオフのソリッドコアの値を調整します。ラディアルフォールオフだけの状態だと、フォールオフが通過すると影響が及ぼされなくなるため、ブロックは元の状態へと戻ってしまいます。これを防ぐため、ラディアルフォールオフと同時にリニアフォールオフの影響も受けるようにしてみましょう。
リニアフォールオフを追加したら、ラディアルフォールオフと同じように移動してほしいので、ラディアルフォールオフの子供へと設定します。リニアフォールオフを選択し、ラディアルフォールオフを選択したら、Ctrlボタンを押しながらPのキーを押します。そうすると簡単に親子関係を設定することができます。リニアフォールオフとラディアルフォールオフ、二つのフォールオフを組み合わせた値をフォールオフプローブへと接続したいので、フォールオフを組み合わせるためのモディファイヤを追加します。追加 > メッシュオペレーション > ツールパイプ > フォールオフ > Blend Falloffを追加します。このBlend Falloffはフォールオフの効果を組み合わせたフォールオフを生成します。二つのフォールオフをBlend Fallffへと接続し、Blend Falloffのプロパティでクランプをオンにしたら、このBlend Falloffをフォールオフプローブへと接続しなおします。そうするとフォールオフの動きや影響範囲に従って、ドミノ倒しが表現できるようになります。