第十六回
本日の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系のオペレーターはそんなに早くないのと、どういう処理をしているかの見通しが悪くなるので個人的にはあまり使いません…