popの小技

さて
----
今回は（といっても当方の記事に”前回”は存在しないのですが）popの小技を紹介します。どんな小技かと言うと、カメラ内の特定の領域のパーティクルを存在しなかったことにする、というものです。
（『カメラ内の特定の領域』の指定方法は手動なので、スクリーンスペースで選択する方法が知りたい人はここ以下の文章を読んでも時間の無駄です。そういうのはフラストラムでも使ってください。ここでは使ってません。）
特定のフレームでいきなりパーティクルが消えるとエラーにしか見えないので、いきなり消えるのではなく発生しなかったことにする、というものです。

ここ以下につらつらと微妙に長い文章が続いていますが、「御託はいいからからさっさと何ができんのか教えろよ」という人はいると思います。
そういう人は下の方にスクロールするとジフがあるのでそれを見て使えるかどうか判断してください。

で、これは割と地味な技（小技ですので）なので、これをおぼえたからと行って新しい表現が可能になるということはないと思います。
なのでフーディニに入門して間もない方、つまり学校に通っているなど仕事をするに至っていない方にはとてもつまらないものだと思いますのでブラウザの左上あたりにある戻るボタンを押して別の方の記事を読むといいです。

しかし一方で仕事をしている方には割と役に立つ技だと思います。
例えば火の粉が飛びまくっているシーンでキャラの顔にガンガンかかっていたりすると、顔にかからないようにしてくれ、というオーダーが返ってくることは割と頻繁にあります。
あるいは、超イイ水しぶきが出来てもカメラ付近に結構かかってきてて大きめの粒が目立つ場合はもちろんリテイクが来ます。
対処法としてキャッシュをちょっと動かすだけで済む場合もありますが無理っぽい場合は結構あります。
あるいは１フレームずつ追いかけて排除するというのも手ですがそれは微妙にめんどくさい。
シミュレーションし直すのもありですがゴールに近い状態でそれをやるのは事故の元です。それが原因でうっかり２徹、みたいなケースは珍しくないのではないでしょうか。
そうならないために当方が今から紹介する技を用いれば比較的簡単に対処することが出来ます。

（といってもそんなに難しいものではありませんし、ちょっと考えれば普通に思いつくものだと思うのですでに知っている方やもっといい方法を知っている方は多いと思います。なんといっても当方が紹介するのは”小技”ですから。）

具体的な手法は単純で、一行くらいで説明できます。つまり、

要らないパーティクルを時間を止めた上で特定し、attribCopyを使ってid経由で選別消去

というものです。今述べたこの文を自分で読んでもよくわからなかったのでフーディニ的な説明をすると以下のようになります。

１　問題のあるフレームを探してtimeshiftで時間を止める
２　そのフレーム内の、どうにかしたいパーティクルをgroupで選択する
３　選択したパーティクル以外を消す
４　残ったパーティクルにwrangleで"i@delete_ = 1;"とか書いてアトリビュートを作成する
５　attribcopyを作成し、時間を止める前のパーティクルと手順４でつくったパーティクルをつなげる
６　attribcopyの”attrib to match"に"id"、"attrib name"に"delete_"と打つ。（ほかはいじらない）
７　i@delete_==1のパーティクルを消す

これは要らないパーティクルを消す場合の手順ですが、消す代わりに移動したり歪めたりも出来ます。その場合は手順７のノードを替えればいいだけです。

具体的にはこちらのファイルを見てください。

サンプルファイル：
https://www.dropbox.com/s/hv2naot9ye6t757/vol_post_manip2.hipnc?dl=0

--------

添付されたファイルのbasisというのを開くと以下のようになっています。

<img width="609" alt="screenshotForQiita2.png" src="https://qiita-image-store.s3.amazonaws.com/0/316376/4a9c9b42-21ed-3b9b-c2df-8dc1416196bc.png">


具体的にはファイルを開けばわかると思うので詳しくは書かず、簡単に説明します。
左上の緑のエリアでパーティクルを作り、そのすぐ右の青いエリアで該当パーティクルを選択するためのオブジェクトが作られてます。この２つを使ってパーティクルを消してます。

ノードを見る前にまずカメラビューに切り替えてください。
この手法はカメラからどう見えるか、ということが念頭にあるのでパースビューで見てもあまり意味がありません。


-------------

まず元のパーティクルはこうなっていますが
![1_1.gif](https://qiita-image-store.s3.amazonaws.com/0/316376/7bf424b4-c620-fdb4-b8b1-22d31ebab0cc.gif)

この黒い部分を消したいので
![1_2.gif](https://qiita-image-store.s3.amazonaws.com/0/316376/9d3b38bc-9569-f450-31cb-a3c128fc503f.gif)

このように消してます。
![1_3.gif](https://qiita-image-store.s3.amazonaws.com/0/316376/f2bc20c1-f137-7532-07b5-baffd0efdfa7.gif)

消すのではなく歪めるとかも自由です。
![1_4.gif](https://qiita-image-store.s3.amazonaws.com/0/316376/75d36545-337a-cb4d-1e50-d5c40f59f131.gif)

作例はもう一つ用意してあります。objトップノードのpracticeを開いてください。
こちらではbasisでやったものより少しだけ複雑なことをやってます。

この例ではパーティクルが尾を引いていますが、前半と後半で一部のパーティクルががっつり顔にかかっています。
![2_1.gif](https://qiita-image-store.s3.amazonaws.com/0/316376/e1a587d6-32ad-30e2-26fc-c4bf5ac9bbbb.gif)

なのでこんな感じに消しました。トレイルになっていない粒だけの部分が消去した箇所です。
![2_2.gif](https://qiita-image-store.s3.amazonaws.com/0/316376/f95d9249-2ad2-962b-7139-787f0e2d0fd1.gif)

顔にかかっている部分は完全には消してません。ある程度はかかっていたほうが自然だからと言うともっともらしいですが、実際はそんなめんどいことはやりたくないからです。

--------

このような、画面上で顔だけ器用に避けるパーティクルをシミュだけでつくるのは結構面倒だと思います。

応用として全フレームを通して消すというのをsolverを用いてやっていますが、これは寿命のあるパーティクルだとあんまりうまくいかないです。
最終フレームで一部のidが存在しなくなっているからです。

また、もう一つの応用として選択範囲をぼかしてもこの小技は使用できます。
この作例ではi@delete_ をアトリビュートとしてつくっていますが、これをフロートでつくることで選択範囲ぎりぎりの位置にあるパーティクルのための処理ができるのです。つまり、だんだん消えていくとか徐々に歪んでいくなどの表現が可能になります。

それと、どうでもいいことですがこの作例ではキャラの顔が歪んでいます。
が、これは当方が単純にこのキャラの顔が嫌いだというだけの理由に基づくものであり、技術上の必要性は全くありません。

そういえばこの記事は現れたカレンダーの１６日目の記事です。


かしこ