この記事はHoudini Advent Calendar 2017 の14日目の記事です。
さて、今年はHoudiniEngineについて書くと予定していましたが
正確にはHoudini Engine本体ではなく
http://www.sidefx.com/docs/hengine/
そのプラグインとして提供されているHoudini Engine for Mayaについて書こうと思います。
http://www.sidefx.com/docs/maya/index.html
Houdini Engine for Maya自体は数年前からありますが
自分が触り始めたのはかなり最近なので、備忘録も兼ねて
同じようにこれからHoudini Engine For Mayaを触ろうと思っている人の助けになればと思います。
(この記事では使用するデータはこちらにあります。バージョン: Houdini16.5.268 / Maya2017)
インストール場所
Houdini Engine For MayaはHoudiniのインストール時にチェックを入れていると
$HFS/engine/maya/maya<version>/houdiniEngine-maya<version>
に配置されます。
こんな感じでpluginとScriptがおいてあります
Scriptの中身はmelがほとんどで
HoudiniEngineForMayaでは色々な処理でこのmelを使っています。
なので挙動を知りたいときはこの中を読むのが良さそうです。
AETemplateもここに置いてあります。
http://www.sidefx.com/docs/maya/_maya__install.html
使えるコマンド
また、Plug-in ManagerでPlugin Infoを見てみると
Plug-in Featuresに houdiniEngineとhoudiniAssetというコマンドが含まれているのが分かります。
(コマンドの他にも、houdiniAssetや、houdiniInputGeometryといった独自のノードタイプが定義されているのがわかります)
helpコマンドで引数が確認できます。
pythonで操作する
先ほどのコマンドはMayaのPython(maya.cmds)でも使えるので
試しにPythonで読み込みをしてみます。
こんな感じに書きます
import maya.cmds as cmds
cmds.houdiniAsset(loadAsset=["hdaファイルのパス","ノードの定義名"])
ノードの定義名と日本語で書いてみましたが要するにこの名前です
なので例えば以下のような感じで書けば
cmds.houdiniAsset(loadAsset=[r"C:\Program Files\Side Effects Software\Houdini 16.5.268\houdini\otls\OPlibPlaceholder.hda","Sop/testgeometry_pighead"])
もし、よく使いたいHDAがあればこんな感じのスクリプトをShelfにしておけば良さそうです。
HDAの読み込み&編集にはライセンスが必要ですが、作られるMeshノードはMaya標準のものなので
ブタ君のジオメトリだけ欲しい場合、こんな感じで分離してあげればそのまま保存しても問題ないです。
import maya.cmds as cmds
hdaNode = cmds.houdiniAsset(loadAsset=[r"C:\Program Files\Side Effects Software\Houdini 16.5.268\houdini\otls\OPlibPlaceholder.hda","Sop/testgeometry_pighead"])
pigNode = hdaNode+"|testgeometry_pighead"
cmds.parent(pigNode,world=True)
cmds.delete(hdaNode)
Houdini Engine For Mayaのデータ構造について
ブタ君は読めましたが様子がおかしいので
Maya内部でHoudiniのノードはどう定義されているか理解を深めたいと思います。
実は、先ほど読み込んだHDAはHoudiniで使う事を前提に作られているので
HoudiniEngineForMayaで使いたいHDAはMaya用に最適化しておく必要があります。
これがまた面倒で知識が必要なので、少しだけ解説していこうと思います。
##HoudiniのデータがMayaでどう扱われるか [Houdini >> Maya]
解説と言いつつ、基本は公式ドキュメントに書いてあるので
読んで頂くのが一番早いと思いますが
http://www.sidefx.com/docs/maya/_maya__outputs.html
よく使いそうなMeshとParticle、Volumeがどうなるか
簡単なデータを作って見てみたいと思います。
また、ExpressionやVariablesもどうなるか気になるので検証してみます。
ObjectとSOPについて
まず、基本的な所ですがHoudiniEngineForMayaでは
HDA内部でDisplayになっているノードだけ作られます(オプションで切り替えることも出来ます)
複数表示させたい場合は、SOPではMergeをつかうと入力分ノードを作成してくれます
ObjectであればDisplayされているSOP(とその中身)の数だけ作成されます
また、HDAの中でGroupを作っておくと、MayaのSetに変換されるので
破壊FXでシェーダーをFaceにアサインしたい場合などに使えそうです。
Volume
volumeは
・名前がdensity, temperature, fuel, vel[xyz], Cd[xyz]
・各Volumeのresolutionが同じ
という条件を満たしていれば、MayaFluidShapeとして作られます。
実際にこんなVolumeをHoudiniで作って
HoudiniEngineForMayaで読み込んでみるとこんな感じに見えます。レンダリングも出来ました。
試してませんが、Pyroとかもデータを整理して渡せばMayaの中でも使えるかもしれません。
個人的にHoudiniはVolumeの扱いが強みだと思っているので、Mayaでその機能が使えるととても嬉しいのですが
VDBは対応していないのと、MayaFluid自体が重いので実用性があるかはわかりません・・。
Particle
PartilceはnParticleとして読み込まれるようです。
Attributeに関しては公式ドキュメントに対応が書かれています
ためしにPOPでこんなParticleを発生させてみたところ
Mayaでもそのまま再生されました。(上がHoudini 下がMaya)
Expression
実は↑のParticleで球体の回転に
fit($FF,$FSTART,$FEND,0,360)
というExpressionnを入れておいたのですが問題なく動きました。
FSTARTやFENDも、ちゃんとMayaの開始フレームと終了フレームを取ってきてくれます。
また、今回UI周りの説明を省略したまま書いてますが
StringTypeのParameterであればExpressionが使えます
FloatやIntegerのParameterにはExpressionは使えません(というか入力できません)
例えばこんな風にFontSOPとそれを複製するHDAを作ってExpressionがどうなるか見てみます。
Maya内部ではこんな感じにUIが変換されて複数行の文字列でExpressionを書くことも出来ます。
ただ、回数を指定するほうには文字が打てないので、実質Expressionを使う事が出来ません。
*MayaのExpressionは使えます。
ちなみに、$HIPでMayaシーンのパスが取れるかと思いましたがダメでした。
全部は検証してませんが、使えないものもありそうです。
#MayaのノードをHDAに渡すとどうなるか [ Maya >> Houdini ]
HoudiniのノードがMayaでどう扱われるかは何となくわかったので逆も調べてみます。
MayaのノードをHDAに渡す場合は、HDAにInputがあればMayaで次のようなUIが表示されます
またはObjectMergeなどで指定する場合も同様のUIになります。
試しに、MountaionSOPを使ってこんなHDAを作って
Mayaにもってきてsphereをインプットしてみます。
お馴染みのMountainSopがMayaでも使えました。
このHDA、MountainDeformerと紛らわしい名前を付けましたが
Inputされたオブジェクトに変更を加えるのではなく、別のオブジェクトが作成されます
これはHoudiniEngineForMayaの仕様上、というかhoudiniAssetノードの仕様上仕方なさそうです。
例えばNodeGraphを見てみると
InputされたGeometryは一旦houdiniInnputGeometryにつながって
その後houdiniAsset(mountainDeformer)に渡ってるのがわかります。
Deformerっぽく扱いたければInMeshとoutMeshを使えば良さそうですが
元ジオメトリ → houInputGeometry → houdiniAsset → 元ジオメトリ と繋ぐのはループになってしまう為
どうしてもやりたければ
元ジオメトリ(複製) → houInputGeometry → houdiniAsset → 元ジオメトリ と繋ぐしかなさそうです
微妙ですね。もし良い方法をご存知の方が居たら教えてください・・
しかし、実はなんとか繋いだとしても回避できない大きな問題があります。
それは、HoudiniEngineForMayaでは
複数のオブジェクトをインプットしてもHDA内部では1つのオブジェクトとして扱われる
という仕様になっている為。入力と出力で数が一致しません。
こんな感じです。
公式ドキュメントだと、Mayaの機能でSeparateして使ってみたいなことが書いてありますが、それも微妙かなと・・
Groupで分けてSetにしても扱いづらいですし
一応、Split Geos by Groupというオプションもありますが。今後どうなるのかよくわかりません。
このあたりのデータの流れをどうしたらいいか、開発者に相談してみたいですが
houdiniAssetノードではなく、自分で新しいノードタイプを作ったほうがいいのかもしれません
そのうち試してみたいなとは思います・・
http://www.sidefx.com/docs/hengine/index.html
内部アトリビュートについて知る
MayaからHDAへのデータの受け渡しについてもっと掘り下げてみます。
具体的にはAttributeどうなってるかですが
これは公式ドキュメントに見当たらないので・・デバッグモードを使ってみます。
デバッグモードではMayaのジオメトリがどういうアトリビュートをもっているか調べることができます。
使い方は多喜さんのブログに詳しく書かれているので、リンクを貼らせて頂きます。
http://ikatnek.blogspot.jp/p/houdini-engine-maya-debugging-menu.html
ただ、リンク先の画像に出ているAttributeと、自分の環境で出てくるAttribute名が少し違っていたので
まだ仕様が変わるかもしれません。実際に自分が使ってるバージョンで調べたほうが良さそうです。
オブジェクトの名前がnameに格納されているとか、使えそうな情報が入ってます。
このnameを使ってGroupを作るとか・・
Mayaのノード名はDAGパスで表記されているのを利用してpathに変換して使えそうですね。
pathに変換する場合は、"|"を"/"にしたいのでwrangleでこんな感じにしとくのが良さそうです。
他にもuvや頂点番号、シェーダー名などもAttributeに格納されるので
ツール開発をする際はこんな感じで調べたり確認したりするのが良さそうです。
以上。
##最後に
今回あまり面白い作例は用意できなかったんですが、仕事で使う機会も少しずつ出てきたので
ノウハウをためて、面白いツールができたらorboltあたりにでも出そうかと思います。
そして、Houdini Engine for Mayaには、まだ色々機能があるんですが、解説しきれなかったので
残りの部分は、追記するか別記事にまとめるかしたいと思います。
Houdini Engine for Unityについても、そのうち書きたいと思っています。
##参考資料
Maya ドキュメント http://www.sidefx.com/docs/maya16.0/index.html
SideFXフォーラム https://www.sidefx.com/forum/46/
*SideFXのAndrew Wongさんがフォーラムでいつも答えてくれています。
日本に居た時にもっと話しておけばよかった・・。応援しています!