マンガじゃない Houdini チュートリアル ーーParmTemplateーーーマンガ Houdini チュートリアル ーーエミッター補間ーー

November 25, 2016

Houdini検証 インスタンス&コピー 

Houdiniにはインスタンスの方法がいくつか存在するのでそれぞれの長所短所を検証していこうと思います。

久々に漫画にするよ予定でしたが、悔しくも自分の満足するスマートなやり方が見つからなかったので検証です。
一通り頭に入れておくと時と場合によって使い分けれると思います。

Instance
https://drive.google.com/file/d/0B8GmDmE-WRSTb1k0Zkg4Q2pVU2M/view?usp=sharing

Copy
https://drive.google.com/file/d/0B8GmDmE-WRSTNFRRcXJUaV93Yk0/view?usp=sharing

まずは普通のGeo Instance. fast Point Instance
instanceと言う名オブジェクトパス名のアトリビュートを元に各ポイントインスタンス化する。
早い! インスタンスソースのオブジェクトはオブジェクト毎に分かれてなければいけないので
大量にあるとめんどい。もしくはそのためのスクリプトなどが必要。
instance01


Instance SOP
Instance Attributeに指定したアトリビュートをインスタンス化する。
こちらはオブジェクトパスではなくファイルパス。
オブジェクトパスにしたい場合はop:をパスの前に追加。
早い! こちらもインスタンスソースが複数必要な場合はファイルを大量に用意する必要あり。
アニメーションキャッシュから時間差で読み込む等に有効。
instance02

*インスタンスの参照先が外部キャッシュで、そのキャッシュにシーンからマテリアルが割りふられている場合。
MantraでDeclare MaterialsをSave All Shopsにしないとマテリアルが読み込まれない。
もしくはシーン内のレンダーされるオブジェクトのどれかが同じSHOPを参照してればよい。
instance03

Instance & Delayed Load
インスタンスポイントにMaterial Override でDelayed Loadを突っ込む方法。
Full Point Instanceにしないといけない。
ポイントが増えると遅い!
instance04

Instance & Alembic
Instance & Delayed Loadとほぼ同じファイルパスではなくAlembicファイル内のオブジェクトパスを変更。
遅い! Alembicファイル一つ用意すればいいので管理は楽。
instance05


Instance & Alembic Archive
Alembic ArchiveのBuild or Update Hirerchyボタンを押してパス毎にオブジェクトを展開してそれを参照する。
instance06
悔しいが大量オブジェクトを使用する際の早さvs効率で言うとこれが総合的に最も良い。
更新の度にボタンを押さなければいけないのとシーンに大量のジオメトリが出来てしまうので
なるべくプロシージャルに作業したい人にとっては気持ち悪い。。。
instance06

------------------------------------------------------------
------------------------------------------------------------
次にHoudiniの最も基礎的なノードでありながら、その遅さから上級者ほど仕様を最小限に抑える傾向に
ある悪名高きStampingにチェックを入れたCopySopノードの検証。

Packは複数のインスタンスオブジェクトのメモリーを効率化する強力な方法だがそれを分散するコピーの
方法がやや軟弱だと思う。多くのチュートリアルが一つのPackオブジェクトをコピーして
こんなに楽ちんだよ〜って言うのをアピールしているが、実際の仕事現場に置いては複数のオブジェクト
を分散させる事が多い。そのためにStampingが必要だが、チェックを入れると異常に速度が遅くなる。

まずはソースはFor Eachによってこんな風に0から199までの200個のPackオブジェクトを用意する。
それぞれにはnameのprimアトリビュートに"number99"のような固有の名前が入っている。
copy01
それをこんな感じのポイントに割り当てる。ポイントにはnameアトリビュートが入っていて対応するオブジェクト
が割り当てられるようにする。
copy02
そしてこんな感じにするわけです。
copy08


Stamp Blastによる分離ディストリビュート
nameアトリビュートをstamp化してblastで抽出しながらコピーするよく知られた手法。
Cache Stamping Geometryにチェックを入れると結構早くなる。
copy04



Source Group Stamping
Source Groupに@name=`@nameと入れて各ポイントに選択オブジェクトを入れるやり方。
くそ遅い。自分は最近までこれのほうがBlastにstampを入れるより早いと思い込んでいた。
だってBlast介してstampで不要なオブジェクトを消しながらコピーとか気持ち悪いでしょう?
copy03

For Eachによって各オブジェクト毎にコピー
Stampを使わずに各オブジェクト毎にFor Eachで回してCopy。
残念ながらこれが一番早い。。。オブジェクトの数によって速度の減少があるかも知れないが1000個くらいの
個別オブジェクトコピーでもこれが一番早かった。
copy05

No Time Dependency Copy with Wrangle
もしポイント数が変わってないならこの手を使おう。偉い人はみんなやってる!
ポイントはTimeShiftによって1フレーム固定でコピーを行う。
回転、スケールがあればマトリックスでtransform primintrinsicを
setattrib(0, "primintrinsic", "transform", @primnum, -1, 3@opinput1_mat, "set");
というふうに更新します。
ポジションに関してはWrangleによって上書きする。ポイント数が変わらないならぶっちぎりでこれが早い!
copy06

Pythonによるコピー
オブジェクトのコピーだけであればこんな感じでポイントのnameアトリビュートを読みながらコピー
を行えます。別に早いわけではありませんが何か必要な時があるかもしれません。
ここで位置情報も更新したい所だがPythonは遅いので位置は無視。
Wrangleによって下流で更新します。
copy07


と言う感じです。この辺は内部的に早く出来る部分だと思うのでSideFXの今後の更新に期待。Wrangleで指定オブジェクトを全所持情報込みでコピーなんかが出きるだけでもかなりのスピードは出せそうですし。
と言うか自分が今務めてる会社にはCache Stamping Geometryにチェックが入ったCopyより倍以上早い
インハウスツールがあるのでかなり重宝しまくってます。(作った人はもういない。。。)
あとはAlembicの内部にアクセスしつつのインスタンス効率化とか自分でももっと勉強してみたいと思います。



fujitarium at 16:58│Comments(0)TrackBack(0) CG | Houdiniチュートリアル

トラックバックURL

コメントする

名前
 
  絵文字
 
 
マンガじゃない Houdini チュートリアル ーーParmTemplateーーーマンガ Houdini チュートリアル ーーエミッター補間ーー