第16回: パーティクルの高度なレンダリング
本日のtoeファイル ← ダウンロードしておいてください
パーティクルをレンダリングする
先週できなかった所からの続きです!
SOP to CHOP おさらい

SOP to CHOP では SOP のアトリビュート (ポイントに関連づけられた値) を自由にCHOPのチャンネルとして抜き出すことができます。
SOPにどういうアトリビュートが含まれているかは、SOPを真ん中クリックして出てくるインフォメーションウィンドウで見ることができます。また、 SOP to DAT を使ってもどういうアトリビュートがあるか確認できます。

SOP to CHOP では、主に Attribute Scope と Rename Scope を使ってどのアトリビュートを、どのチャンネルに出力するか を指定します。
Attribute Scope に変換したい SOP のアトリビュートを指定して、Rename Scope に CHOP のどのチャンネルに出力したいかを指定します。その時に、SOPアトリビュートの持つ要素数とCHOPチャンネルの数が一致していないとエラーになります。
たとえば、SOP to DAT で確認すると P アトリビュートは P(0) P(1) P(2) の項目があるので3要素です。なので、出力するCHOPチャンネルも tx ty tz のように3つ用意しないといけません。同じように vアトリビュートも、 v(0) v(1) v(2) の3要素なので、vx vy vz のように3チャンネル分指定します。
移動方向に向く動き
/project1/AIMMING を参照
先週 Particle SOP の使い方を紹介してきましたが、次はパーティクルのレンダリングについてです。
今までの例だとキューブをパーティクルの位置にインスタンシングでコピーしていただけだったので、もうすこしおもしろい効果のレンダリングにチャレンジしてみましょう。

Geometry COMP の Instance 2 タブの Rotate to Vector [XYZ] にベクトルを指定するとコピーをすると同時にその方向を向くようになります。向き方向のベクトルは Particle SOP の vアトリビュート (速度) が使用できます。SOP to CHOP で v をCHOPに立ち上げて Rotate to Vector [XYZ] に指定します。
せっかく進行方向を向くようになったので、インスタンスのソース側のジオメトリもすこし長くするとよりおもしろい見た目になります。
大きさ / 透明度を調整して自然な見た目にする
/project1/LIFE_TO_SCALE を参照

さらに自然な見た目にするため、パーティクルの出際と消え際の処理をしましょう。Particle SOP の life アトリビュートをつかって寿命の期間を 0 ~ 1 の間にマップします。それを Pattern CHOP で生成した半分の周期のサインカーブと Lookup CHOP を使ってなめらからな出現 → 消失のカーブにマップします。
大きさや透明度に変化をつけて出現、消失時に違和感がないようにすると映像的に綺麗にまとまって見えます。要素の出捌けの処理をきちんとするとクオリティのレベルが一段上がって見えるのでとてもオススメです。また、Lookup CHOP に入力するサインカーブのほうをいじることで動きのニュアンスを調整するのもおもしろいです。
SOP と CHOP を組み合わせる
/project1/TWEAK_WITH_CHOP1 を参照

これまで Particle SOP を使ってパーティクルのシミュレーションをしてきましたが、実際には SOP to CHOP でCHOPに変換した後、Noise CHOP などを使ってシミュレーションした結果にさらにCHOP側で動きのニュアンスをつけることが多いです。
CHOPでアニメーションをつける理由は、単純に SOP より CHOP のほうが高速なのと、Particle SOP の Turbulance 機能を使うよりも Noise CHOP のほうが単純に表現力が高いためです。
Noise CHOP の Input 0 にCHOPを入力すると、先頭の最大3つのチャンネルをサンプリングポイントとして使用してノイズを生成します。出力されたノイズをもとのCHOPに Math CHOP を使って加算すると Particle SOP のシミュレーション結果と Noise CHOP のアニメーションを合成できます。
ですが、このままでは Particle SOP の v アトリビュートを使って向きを決めていたチャンネルと関係のない所で位置を動かしたことになるので、Rotate to Vector [XYZ] で指定した回転方向が実際の位置とズレてしまいます。次のセクションでこの問題を解決します
速度を再計算する
/project1/TWEAK_WITH_CHOP2 を参照

v アトリビュート相当の値を計算するには、1フレーム前の座標と現在の座標を引くと速度のベクトルが求められます Feedback CHOP は1フレーム分前のCHOPの状態を返してくれるので、その値と現在の値を Math CHOP で引くことで速度ベクトルの結果が得られます。あとはそのチャンネルを Rotate to Vector [XYZ] としてアサインすればOKです。
これで、SOP と CHOP の計算を両方使いつつ、表現的にも満足いく結果が得られました。
パーティクルの数をコントロールする
/project1/CHANGE_EMIT_COUNT を参照

Partcile SOP の Particles タブ > Birth パラメーターを変更すると生成されるパーティクルの数が変更できるのでした。なので、音のボリュームに応じてパーティクルの数をコントロールしてみましょう。
Birth パラメーターの値は 1秒間に生成されるパーティクルの数 だったので、Math CHOP を使って me.time.rate をかけてあげます。そうすることで、1フレームに生成されるパーティクルの数に変更できます。
オーディオのボリュームは Analyse CHOP で Function に Maximum を入れると取得できますが、それをそのまま使うとパーティクルの数にメリハリがなく、出っぱなしの状態になってしまいます。
なので、Function CHOP を追加して、Function > pow(x) Input ^ Exponent を指定して、Exponent Value を適当に 5-10 ぐらいに設定します。これによって、ボリュームの高いアクセント的な部分だけに反応するようになります。
最終的なパーティクルの数は、math2 で決定しています。
CHOPアニメーションとの連携
/project1/CHOP_LEVEL_ANIMATION1、/project1/CHOP_LEVEL_ANIMATION2 を参照
ではCHOPレベルでのアニメーションをもうちょっとやってみましょう。今度は 第八回 で紹介した CHOP to SOP でCHOPをSOPに変換して、それをパーティクルの発生源にしてみます。
Partcile SOP の発生源にはSOPを入れる必要があったので、これまでは動きのないSOPを入力していましたが、CHOP to SOP などを使うとパーティクルの発生源も動かすことができます。
さらに、Copy SOP を使ってCHOP to SOP で作ったジオメトリに対して他のジオメトリをコピーし、それをパーティクルの発生源とするとパーティクルの密度感も自由に変更できます。
このあたりまでくるともはや発想の問題です。CHOP、SOPをくみあわせて、どういうおもしろい表現ができるかを考えてみてください
Script CHOP
/project1/SCRIPT_CHOP を参照
これは授業中では紹介しないでおこうかな… と思いますが、Script CHOP を使うとPythonを使ってCHOPの値を変更、生成できます。
Script系のオペレーターはそんなに早くないのと、どういう処理をしているかの見通しが悪くなるので個人的にはあまり使いません…