Houdini to Blenderのtips
#Houdini #Blender #tips
HoudiniからBlenderに何かを持っていきたいときが普通に生きているとあると思います。
その時に使えるtipsをいくつか。
結構適当言っていることがあるので、内部的な処理についての話は流してもOK。
0.前提として
HoudiniからBlenderへ何か持っていくとき使える使えないの判断の決定的な材料になるのは
・Cd(point attribute)
・uv(vertex attribute)
・N(vertex attribute)
・primitive group
以外をBlenderで読む必要があるか否かである。
一応ハック的に、別のalembicの位置情報にattributeをremapしてやるという方法も存在する(https://youtu.be/1h15stU-TaE?si=1QGFZ24I76Q_3IMC Exporting Alembics For Blender: A Few Hacks/Entagma)
それ以外の情報が必要ならalembicに焼くのではなくusdとして焼く必要がある。カスタムマスクなどが必要な場合は問答無用でusd。
ファイルサイズに関しては貴賤をつけがたい同じものを出してもどちらが小さくなるか大きくなるかはまちまちである。
1.Blenderのusdの仕様について
https://docs.blender.org/manual/en/latest/files/import_export/usd.html
Blenderはusd layerを読む機能がそもそもなく、それぞれの領域において内部的な変換を経てジオメトリならメッシュとして、lightならlightとしてインポートがされる。変数もSolaris等と違い、あくまでBlenderローカルの変数に読み替えているにすぎない。シーン構造としての解釈ではない、いわばfbxとかalembicと同等の変換用フォーマットになり下がっているのが現状。
usdを名乗らないでほしい
primvarの読み取りにも制限があり、Houdiniのgroup(一応boolは読めるらしいが変換が必要)やstring型のattributeは持っていけない。そこでfloatもしくはintegerを中心にデータをBlenderでread出来る形式にコンバートしてやる必要がある。これが相当面倒くさい。
例えばマテリアルのグループをHoudiniで分けた時それを持っていくのにはmaterial groupをもとにそれぞれをattributeとして焼きこむ、それをBlenderのgeonodesで読み、set materialする工程が必要になる。blenderは現状メッシュシーケンスをローカルのものにunpackする機能がないため、こういう処理はgeonodesを挟むのが前提となってしまう。相当手数が増える。
またここで注意なのがBlenderのmaterial indexの仕様について。
Blenderのmaterial indexはマテリアルスロットにおける順番を指すものであり、geonodesにおけるset materialを使ってしまうと、処理がおかしくなる。(内部的にはスロットとして処理されているっぽく、ただのinteger attributeとして計算に使うと、スロットの処理が挟まることでバグる)なので、デフォルトのi@material_indexとしてusdを書き込むときに渡してしまうとマテリアルのバインドが上手くいかない。
2.mesh sequence cache modifierについて
これは多少usdとも共通するがBlenderにおけるメッシュシーケンスの読み方は灰汁が強く、シーンのfps依存でシーケンスを読み取る。なので、例えばhoudiniで30fpsで作ったシーケンスをBlenderで読むとき、24frame分読まれ、その後の6frame分は飛ぶ。
これはバグかもしれないが、シーンのFPSが共通でもたまに1フレームだけレンダリング時に落ちることがある(ビューポートでは正常でも)これは原因が本当に不明。alembicの制約カモ。
https://devtalk.blender.org/t/alembic-override-frame-linked-to-cache-fps/10510
なので、override frameという項目をうまく使い、秒数ではなくフレーム数から参照するようにしてやる必要がある。
Blenderでは環境変数として# frameをつかうとその時のフレーム数を取得できる。これに演算を加えていこうという感じ。
+すればその分オフセットされるし、ループしたシーケンスに%を使えばしっかりループさせられる。
多分これ以外に正確に読む方法がない。
3.Blender4.5でのusd
Blender4.5からusdの読み込みにアプデが入り、非多様体メッシュが存在する場合うまく読んでくれなくなった。
これはだいぶ致命的な問題で、時間経過によってポイントの数が大きく変動するアニメーションだと読み込みの際にバグが起きる。
なので非多様体メッシュをHoudini側で消してやる必要がある。(これをきれいにするorそのまま読めるようにしておくべきだと思う)cleanSOPを使って、面積が0の面を消してやるだけ。