Houdini Engine for Maya : デバッグの仕方


今回はAndrew Wong 氏によるHoudini Engineでのデバッグの仕方の説明です。

 

今回のサンプルファイルです。
debugging.zip

 

前回のHoudini Engineの記事で簡単なブーリアンのアセットを作成しました。このアセットはHoudiniのブーリアンを使っているので非常に強力で、MayaのUV EditorでUVを確認してみるとUVも正しくブーリアンの結果になっているのが分かります。

 

インプットジオメトリがUVを持っていた場合は、何の問題も無かったようにブーリアンされたUVが作られています。今回のブログでは、何故こうなるのか、MayaとHoudini Engineでどの様にジオメトリデータがやりとりされているか、を見ていきます。これを理解することでより複雑で便利なアセットを作ることができます。

皆さんもお分かりだと思いますが、Maya 内で作業をしている場合は、Maya のシーン内で作業をしている訳です。ここに全てのジオメトリ、パラメータ、ノードが保存されています。同様に Houdini 内で作業をしている場合は Houdini シーンの中で作業をしているわけです。もし Houdini Engine を Maya で読み込んでアセットを使った場合はどうでしょうか?Houdini Engine プラグインを読み込むと、見えないHoudiniシーンが Maya のシーンの裏で作られています。このプラグインを使ってこの見えない Houdini シーンを詳しく調べる事もできます。

 

 

「View Assets in Houdini」メニューは見えないHoudiniシーンを取り出し、外部のHoudini GUIで開きます。この機能はHoudini Engine内で使われているアセットのトラブルシュートやデバッグに非常に有効です。このHoudini Engine記事ではHoudini Engine内で何が起きているのかを調べるためにこの機能を頻繁に使用していきます。

My_boolean アセットをMayaに読み込むと、Maya内で HoudiniAsset ノードが作成されるのが分かります。そしてその裏側で Maya は my_boolean ノードが入った実際のHoudiniシーンを作成します。ある意味、Maya 内の HoudiniAsset ノードは Houdini 内の my_boolean ノードのプロキシの様なものと言えます。「View Assets in Houdini」メニューを使うことで実際にそのプロキシをHoudiniシーン内で確認することが出来ます。

 

この時点で My_boolean アセットはインプットジオメトリが無く、アウトプットジオメトリもありません。実際の my_boolean アセットは Houdini シーン内にあるのに、どの様にして Maya 内のインプットジオメトリにアクセスできるのでしょうか?インプットジオメトリが Maya 内の houdiniAsset ノードに繋げられると、Houdini Engine プラグインは Maya ジオメトリを Houdini のフォーマットに変換します。プラグインは変換されたジオメトリを Houdini のネイティブオブジェクトとして Houdini シーン内に保存し、この Houdini オブジェクトを my_boolean ノードのインプットに繋ぎます。これにより、my_boolean ノードや他のHoudiniのノードが Maya のインプットジオメトリを Houdini のネイティブジオメトリのようにアクセスすることが出来ます。それでは実際に Houdini シーンを見てみましょう。

 

オブジェクトレベルで2つのインプットがネイティブのHoudiniオブジェクトとして作られているのが分かります。このインプットオブジェクトの中にはNull SOPがあり、Mayaジオメトリを変換したデータが保存されています。


 

Node Infoから、このジオメトリが様々なアトリビュートを持っているのか分かります。ジオメトリやアトリビュートは Maya のネイティブジオメトリから変換されています。これにより Houdini ノードや関数はこのインプットジオメトリを Houdini のネイティブジオメトリのようにアクセスできます。

My_boolean アセットはMayaから変換されたジオメトリを含む2つのインプットがあります。

 

My_boolean は必要のインプットジオメトリが揃ったので、このアセットはブーリアンの処理を行い、ジオメトリを出力することが出来ます。さらにこのアセットは Mayaで作られたUVにもアクセスすることが出来るので、正しいUVを生成することができます。インプットジオメトリと同様にアウトプットジオメトリも Houdini シーン内にのみ存在します。Houdini Engine プラグインが my_boolean アセットから出力ジオメトリを取り出し、Mayaフォーマットに変換、そして Maya 内の houdiniAsset ノードから出力されます。

言い換えると、Maya内で Houdini Engine を使う時、Maya シーンと Houdini シーンの両方を同時に作っているという事です。この Maya シーンと Houdini シーンの2つを同期させることがHoudini Engine プラグイン の役割なのです。

それでは my_boolean アセットをデバッグしてみましょう。最初に説明した通り、このアセットはブーリアン後のUVを生成し、Houdini Engine プラグインはマテリアルのアサイン情報もサポートしています。しかし、もしインプットジオメトリがオブジェクトレベルでマテリアルのアサインがされている場合、my_boolean アセットは正しくマテリアルのアサインができません。試しに Torus を作成してチェッカーのテクスチャを使ったマテリアルを割り当ててみましょう。同様に Sphere を作り、ノイズのマテリアルをアサインします。そしてこの2つのジオメトリを my_boolean に繋ぐと出力されるジオメトリにはマテリアルがアサインされていません。

 

何がおこっているのでしょうか?「View Assets in Houdini」メニューから何が起きているのかを見てみましょう。インプットジオメトリの Node Info を見てみるとジオメトリに幾つものアトリビュートがあるのが分かり、その中に maya_shading_group というアトリビュートがあります。この String アトリビュートは Maya の blinn1SG 等のシェーディンググループの名前を表しています。もしMayaでマテリアルのアサインがオブジェクトレベルで行われると、Houdini 内でDetail の String アトリビュートになり、Faceレベルでマテリアルのアサインが行われると、Primitive の String アトリビュートになります。もし my_boolean アセットの出力に maya_shading_group アトリビュートがあると、Mayaのシーン上で Houdini Engine プラグインがマテリアルを正しく割り当ててくれます。もし maya_shading_group アトリビュートが存在しなければデフォルトのマテリアルがアサインされます。Boolean SOP の Node Info を見てみると下のようになっています。

 

ここで問題なのが maya_shading_group アトリビュートが無くなっている事です。なぜならば Boolean SOP は Detail アトリビュートを無視してしまう為、全ての Detail アトリビュートは消失しています。(DetailアトリビュートはPrimitiveアトリビュートと異なり、ジオメトリ全体に対して1つ与えられるアトリビュートなので、複数の異なるジオメトリを合成するとDetailアトリビュートをうまく処理できないので無視してしまう。)出力されるジオメトリは2つのインプットジオメトリを組み合わせた物なので、Maya 内でマテリアルのアサインは Face レベルでされるべきです。すなわち、maya_shading_group アトリビュートは Primitive アトリビュートであるべきです。もし Maya 内で Face レベルでマテリアルがアサインされていれば、この様な問題に直面することはありません。

原因が分かってしまえば解決するのは簡単で、Boolean SOP にジオメトリを渡す前に Detail のmaya_shading_group アトリビュートを Primitive アトリビュートに変換すれば良いのです。これにより Boolean SOP が maya_shading_group アトリビュートを正しく処理し、出力されたジオメトリは Face レベルでマテリアルが割り当てられます。Primitive アトリビュートに変換するにはBoolean SOP のそれぞれのインプットに Attribute Promote SOP を使い、Detail アトリビュートを Primitive アトリビュートに変換します。ここで Boolean SOP の Node Info を見てみると下のようになります。

 

Boolean SOP は Primitive アトリビュートとして maya_shading_group を 出力しているのがわかります。my_boolean アセットを保存し、Maya 内でアセットをリロードしてジオメトリを繋ぎ直すと、アセットは Face レベルで正しくマテリアルがアサインされたジオメトリを出力します。

 

Houdini Engine for Maya プラグインは Houdini と Maya のブリッジの様な役割をします。殆どの場合、どの様に実装されているかはアーティストには見えなくなっています。しかし、上で書いたように、ある問題を解決するには Maya シーンと Houdini シーンでデータがどの様に流れているかを理解する必要があります。このプラグインはマテリアルの割り当て以外の他のジオメトリプロパティも扱います。詳しくは Houdini Engine for Maya の ドキュメントに他のプロパティに関する説明があります。データフローを理解し、内部の Houdini シーンを調査することは、デバッグ、そしてより複雑なアセットを作るのに有用です。