前回軽く触れた、シミュレーションをパーティクルに流しこむ方法を、少し詳しめに解説します。
この方法は、最近の僕の流行りで、これでもかって言うほど使ってます。
バカの一つ覚えってやつです。
普通にパーティクルを放出するのに少し飽きてしまったっていうのもありますし、フルイドを使ってみたいって言うのもあります。
僕的には非常にナイスなハイブリッド手法と言えるわけです。
とりあえず、何かしらの動画がないと始まらないと思ったので、簡単なものを作ってみました。
全然わからないです・・・すみません。
下手にカメラ動かしたので、余計に分かりづらいですね。
さらには、カメラワークのヘタさを露呈してしまっているという二重苦です。
そこはそっとしておいてくださいw
サイドから見ると少しはフルイドシミュレーションの面影があるんですが・・・。
まぁなにはともあれ、こんな感じで、演算結果を転送できますよってことです。
ポイントは、シミュレーション時に、Velocityを抽出するということです。
今回はSmoke Solverを使用しています。
その時に、Smoke Object > Guides > VisualizationからVelocityにチェックします。

そうすることで、Velocityを同時に表示することが出来ます。
その時に大切な点は、Velocityタブの"Use Barbs on Vectors"と"Use Streamers"チェックを外すことです。

これによって、計算されるVelocityのベクトルは2点構成になって、のちのち変換する時に使用できます。
実際、この時点ではVelocityを可視化しているに過ぎず、アトリビュートとしてVelocityを持っていません。このただのラインをその2点を利用してベクトルをVelocityに変換してあげます。
そもそもUse Barbs on Vectors"って一体…それは、先っちょにカエシを付けますよ〜ってことです。
それによって、方向を明らかにするためです。

"Use Streamers"にいたっては、利用出来る気がしませんね。いわゆる流れを可視化していて、風洞実験的な雰囲気を醸し出したい時に使えます。これは断面になっていて、オフセットもかけられます。
画は面白いので、抽象的なアートとして再利用できそうですねw
抽出したVisualizationをDOP ImportでSOPに引っ張ってきます。
Visualizationにチェックをすることで、Geometry Data Pathでインポート出来ます。

インポートしたデータを始点と終点に切り分けます。
Delete SOP のDelete by Rangeなどを利用すればすぐですね。幸い、ポイント番号はきっちり並んでいます。
万が一(ないけど)並んでない場合は、Sort SOPでBy vertex orderで並び替えてあげればOKなハズです。
イレギュラーな方法では、Carve SOPも使えます。
とまぁ、こんな感じで切り分けたら、終点から始点の座標を引き算してあげます。
これは簡単なベクトルの計算です。そうすることで、Visualizationしたライン上にベクトルを計算してあげることが出来ます。それをVelocityに流しこんであげればいいわけです。

これでVelocityの変換は完了です。
次は流し込みの作業に入ります。
と言っても、とても簡単で、AttribTransfer POPを使用すれば一発です。
一個だけ気をつけなくてはいけないのが、Distance Thresholdの値です。
これは、影響範囲をどうするかという項目ですが、この範囲を間違えるとせっかくのシミュレーションの意味がありません。
では、どのような値を流し込むか説明します。
Smoke Objectのコンテナのサイズとレゾリューションを利用します。
これによって、Visualizationした時のVelocityのグリッドの最小距離を導き出せます。
今回はサイズの最大が20で分割が80ですので、
20 / 80 = 0.25
ということで、Distance Threshold = 0.25ということになります。
さて、これでほぼ解説は終了です。
この方法はいろいろな場面で利用出来ると思います。
もちろん、もっと最適な方法もあると思います。発見次第報告したいと思います。
このレシピのデータです。

今後もこんな感じでデータを配布していければと思うんですが、さすがにシミュレーションのキャッシュまでは無理なので、そこは各々でやっていただければと思います。
また、これは非常に重要ですが、僕のやり方でJOBという変数を使ってプロジェクト管理をしています。方法は幾つもありますが、僕はこの方法を使っています。
JOBという環境変数を設定します。
メニューのEdit > Aliases and Variables > Variablesから、
JOBのValueをプロジェクトが置いてある場所のパスを指定してあげます。
現状だと、僕の環境がそのまま入っています。
これで、絶対パスを常に入力する必要がなくなり、相対パスで管理できます。
$HIPなどを使えば、勝手にhipがある場所を持ってこれますが、僕はhipのディレクトリが別に欲しいので、$JOBで管理しています。データの中身は、ディレクトリ構造を保ったままのからディレクトリが存在しますが、そのままで勝手に吐出されるようになっています。
もちろん、各自好きな方法に設定しなおしてもらって結構です。
おまけで、簡単なブレイクダウンです。
何か不明な点があればコメントください!