まずはRHINOCEROSで作成したモデルをHoudiniに読み込んで、マテリアル別のFBXファイルに分けることを考えました。
そのままFBXファイルとしてRHINOCEROSからUnityにもっていくと、単一のマテリアルしかつかない気がするので、
マテリアル別のオブジェクトに分けてあげる作業が必要だという事で、今回はそこからやります。
参考としては、ボードゲームしかできない家で、使ったやり方をそのまま使おうと思っています。
まずはHoudiniを立ち上げるので、セットアップから行い、マテリアル別に分けるまでにやった事をまとめておきます。
Houdiniファイルのセットアップ(初期設定)
Create Projects from SideFX Houdini on Vimeo.
上の動画は、Houdiniのセットアップの仕方を説明してあります。(英語)
内容をある程度解読したので、かいつまんで要点を書いておきます。
Houdiniは基本的にそのままどこにでもファイルをセーブして良いのですが、体系的に関連ファイルを管理したい場合には、
File>New Projectから任意の名前でディレクトリ作成ができます。
これがどこに保存されるかというと、ホームフォルダ内のHoudiniProjectsフォルダ内に格納されるようです。
この任意の名前の(newProjectと書いてある部分)フォルダに、$JOB/を押すと飛ぶようになります。
そして、その中にHipファイルをセーブするようになっているようです。
他のフォルダを$JOB/で参照したい場合(プロジェクトをスイッチする時など)は、File>Set Project...で参照したいフォルダを選ぶと、
そこが$JOB/先になるようです。
$JOB/を使うメリットとしては、$JOB/を使ってパスを指定した場合、セットされているプロジェクトのフォルダ内のリソースにリンクされるので、
最終的に、成果物をテクスチャ含めて渡したい時などには、$JOB/を使ったPCに依存しないパスで作られている方がリンク切れを防げます。
例えば今回のライノから吐き出したobjオブジェクトをFileノードから参照する場合には、予めnewProjectで作成したgeoフォルダにobjを放り込んでおき、
$JOB/のパスを使用してgeoフォルダのobjにアクセスするようにします。
このようにして、フォルダ内に全てのリソースを管理していくと安全という事ですね。
例えばこの状態で、Set Projectで他のフォルダを参照してみましょう。
すると、下のようにリンク切れが、起こります。
これは$JOB/geo以下にそのファイルが無いので、ファイルの読み込みがされなかったという事になります。
これはもう一度該当フォルダにセットし直せば、もちろん回復します。
また、$JOB/を使ったパス指定がされているかどうかを確認するには、Render>Pre-Flight Sceneを選び、
出てきたウィンドウで、$JOB指定するを選びます。
すると、下のような樹形図が出てきて$JOB/を利用したパスを指定しているかどうか確かめる事が出来ます。
赤く表示されている部分は$JOB/を使用していないので、プロジェクトフォルダをまとめて人にあげたりすると、
パスが崩れてエラーのもとになるという事です。(下図の場合Requiredにチェックが入ってないのでファイルの必要がそもそもないのでOK)
よってその場合は、例えば$homeを使用している場合であれば$以下をJob経由に書き換えてあげる事で、
プロジェクトフォルダごと圧縮して、別PCで解凍して見てもパスが崩れることがないという状態にできます。
このように、プロジェクトのリソースを全てワンフォルダ内に整理して置く仕組みが最初から実装されているあたり、Houdiniらしいですね。
何やら難しそうに一見見えますが、使ってみるととても便利なので是非有効利用したいと思います。
次に、初期設定ができたので、objオブジェクトを読み込みに入ります。
obj オブジェクトの参照とマテリアル別分解スクリプトの使い方
やはり先人の知恵というのは強いものですね。
上の動画ではCinema4Dでマテリアルをつけたものを、Houdiniでobjを通して読み込む方法を解説しています。(英語)
解読してみたので、今回のプロジェクトに応用し、かいつまんで説明します。
ライノ側から上のようなモデルをobj出力しHoudiniで読み込むとします。
このモデルにはVrayマテリアルをつけてあるので、マテリアル情報がRHINOCEROS上ではありますが、
Houdiniでobjとして読み込むとマテリアルが一見追従していないように見えます。
単位系統が違うので0.001倍して同じ大きさに揃え、見てみると、UVは張られていますが、全部くっついているように見えます。
ノードを右クリックしてiボタンから、インフォメーションを確認、分析してみると、
下記のように、1万6000ポリゴン程度の一つのオブジェクトになっていそうです。
よく読むと1つのPrimitiveAttributeとして「shop_Materialpath」というのが56種類string(文字列)で定義されているのが分かります。
という事は、マテリアルをつけた情報というのがどこに格納されているかというと、
GeometrySpreadsheetのPrimitiveモードのアトリビュートとして格納されていました。
この場合Primitiveに対してついているshop_materialpathという名前のアトリビュートの名前毎にグループ化してあげればよいという事になります。
shop_materialpathという名前のアトリビュートの下が56種類存在しているという事になりそうです。
実際にスライダーでスライドしてみるといくつもあるという事が確認できます。
Groupノードを使ってそのうちの一つを取り出してみます。
@shop_materialpath==/mat/wire_227153153
BaseGroupにアトリビュート名==マテリアル名と入れます。
そうすると、そのマテリアル名だけのもののグループがwireというグループ名になりました。
それを用いてBlastノードで他のメッシュを吹き飛ばします。
すると残ったのは、モデル内のカフェのキッチントースター(?)の足の部分でした。
これでNullノードを置いてあげると、後でそのノード名から参照をできるようになるので、
これを56回繰り返せばとりあえずはマテリアル毎に分解はできるということになります。
例えば別のマテリアルも欲しいよとなった場合には同様にマテリアル名だけ変えてあげたブランチを作って、
BaseGroupのマテリアル名だけ差し替えるという事になります。
一方でこのNULLを参照して別オブジェクトにするには、オブジェクトレベルに一旦戻り、
Geometryを作成してダイブインして、ObjectMergeノードを出し、Object1の右側の2つ目のアイコンをクリックして、
ネットワークからwireを選びます。これでNullに入っているオブジェクトを参照することができます。
実践的な使い方は下の動画(英語)で覚えたのでご参考まで。
ObjectMergeの使い方(11:56あたりから)
Cupcake Project | Part 3 | Icing from SideFX Houdini on Vimeo.
これで、最終的に2つのマテリアルを別々に抽出することが出来ました。
おわりに
じゃぁこれを56回やるのかと言うと、確かに微かな自動化欲求がおこりますが。
そこを追求していくと多分記事がとんでもない量になりそうなので、第一日目としてはこれにて一件落着とします。
今後自動で拾えるようにできる機能がある気がするので、発見次第、別記事で紹介できたら良いなと思います。
残り19日頑張ろうと思います!
ではでは。