Help us understand the problem. What is going on with this article?

Houdini Engine For Maya を調べてみる

More than 1 year has passed since last update.

この記事は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>
に配置されます。
PluginPath.jpg

こんな感じでpluginScriptがおいてあります

Scriptの中身はmelがほとんどで
HoudiniEngineForMayaでは色々な処理でこのmelを使っています。
なので挙動を知りたいときはこの中を読むのが良さそうです。
AETemplateもここに置いてあります。
http://www.sidefx.com/docs/maya/_maya__install.html

使えるコマンド

また、Plug-in ManagerでPlugin Infoを見てみると
Plug-in Featuresに houdiniEnginehoudiniAssetというコマンドが含まれているのが分かります。
(コマンドの他にも、houdiniAssetや、houdiniInputGeometryといった独自のノードタイプが定義されているのがわかります)

Plugin_Info.jpg

helpコマンドで引数が確認できます。

maya_houdiniEngine_cmd.jpg

maya_houdiniAsset_cmd.jpg

pythonで操作する

先ほどのコマンドはMayaのPython(maya.cmds)でも使えるので
試しにPythonで読み込みをしてみます。
こんな感じに書きます

import maya.cmds as cmds
cmds.houdiniAsset(loadAsset=["hdaファイルのパス","ノードの定義名"])

ノードの定義名と日本語で書いてみましたが要するにこの名前です
load_asset_with_python_def.jpg

なので例えば以下のような感じで書けば

cmds.houdiniAsset(loadAsset=[r"C:\Program Files\Side Effects Software\Houdini 16.5.268\houdini\otls\OPlibPlaceholder.hda","Sop/testgeometry_pighead"])

お馴染みのブタ君もMayaに読み込めます。
MayaHoudiniPig.jpg

もし、よく使いたい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

よく使いそうなMeshParticleVolumeがどうなるか
簡単なデータを作って見てみたいと思います。

また、ExpressionVariablesもどうなるか気になるので検証してみます。

ObjectとSOPについて

まず、基本的な所ですがHoudiniEngineForMayaでは
HDA内部でDisplayになっているノードだけ作られます(オプションで切り替えることも出来ます)
SingleNodeHoudini.jpg

複数表示させたい場合は、SOPではMergeをつかうと入力分ノードを作成してくれます
ObjectであればDisplayされているSOP(とその中身)の数だけ作成されます
MultiNodeHoudini.jpg

MultiObjecHoudini.jpg

また、HDAの中でGroupを作っておくと、MayaのSetに変換されるので
破壊FXでシェーダーをFaceにアサインしたい場合などに使えそうです。

Volume

volumeは
・名前がdensity, temperature, fuel, vel[xyz], Cd[xyz]
・各Volumeのresolutionが同じ
という条件を満たしていれば、MayaFluidShapeとして作られます。
実際にこんなVolumeをHoudiniで作って
HDA_Volumes.jpg

HoudiniEngineForMayaで読み込んでみるとこんな感じに見えます。レンダリングも出来ました。

HDA_MayaVolumes.jpg

試してませんが、Pyroとかもデータを整理して渡せばMayaの中でも使えるかもしれません。
個人的にHoudiniはVolumeの扱いが強みだと思っているので、Mayaでその機能が使えるととても嬉しいのですが
VDBは対応していないのと、MayaFluid自体が重いので実用性があるかはわかりません・・。

Particle

PartilceはnParticleとして読み込まれるようです。
Attributeに関しては公式ドキュメントに対応が書かれています
HDA_Particle_Attributes.jpg

ためしにPOPでこんなParticleを発生させてみたところ
Mayaでもそのまま再生されました。(上がHoudini 下がMaya)
HDA_Particle.jpg

Expression

実は↑のParticleで球体の回転に
fit($FF,$FSTART,$FEND,0,360)
というExpressionnを入れておいたのですが問題なく動きました。
FSTARTやFENDも、ちゃんとMayaの開始フレームと終了フレームを取ってきてくれます。

また、今回UI周りの説明を省略したまま書いてますが
StringTypeのParameterであればExpressionが使えます
FloatやIntegerのParameterにはExpressionは使えません(というか入力できません)

例えばこんな風にFontSOPとそれを複製するHDAを作ってExpressionがどうなるか見てみます。
HDA_Expression.jpg

Maya内部ではこんな感じにUIが変換されて複数行の文字列でExpressionを書くことも出来ます。
ただ、回数を指定するほうには文字が打てないので、実質Expressionを使う事が出来ません。
*MayaのExpressionは使えます。

HDA_ExpressionWindow.jpg

ちなみに、$HIPでMayaシーンのパスが取れるかと思いましたがダメでした。
全部は検証してませんが、使えないものもありそうです。

MayaのノードをHDAに渡すとどうなるか [ Maya >> Houdini ]

HoudiniのノードがMayaでどう扱われるかは何となくわかったので逆も調べてみます。
MayaのノードをHDAに渡す場合は、HDAにInputがあればMayaで次のようなUIが表示されます
またはObjectMergeなどで指定する場合も同様のUIになります。
SetToSelection.jpg

試しに、MountaionSOPを使ってこんなHDAを作って
MountainDeformer_Houdini.jpg

Mayaにもってきてsphereをインプットしてみます。
MountainDeformer_Maya.jpg
お馴染みのMountainSopがMayaでも使えました。
このHDA、MountainDeformerと紛らわしい名前を付けましたが
Inputされたオブジェクトに変更を加えるのではなく別のオブジェクトが作成されます
これはHoudiniEngineForMayaの仕様上、というかhoudiniAssetノードの仕様上仕方なさそうです。
MountainDeformer_Maya_2.jpg

例えばNodeGraphを見てみると
InputされたGeometryは一旦houdiniInnputGeometryにつながって
その後houdiniAsset(mountainDeformer)に渡ってるのがわかります。

MountainDeformer_Maya_NodeNetwork.jpg

Deformerっぽく扱いたければInMeshとoutMeshを使えば良さそうですが

MountainDeformer_Maya_NodeNetwork_InMesh.jpg

元ジオメトリ → houInputGeometry → houdiniAsset → 元ジオメトリ と繋ぐのはループになってしまう為

MountainDeformer_Maya_NodeNetwork_copy.jpg

どうしてもやりたければ
元ジオメトリ(複製) → houInputGeometry → houdiniAsset → 元ジオメトリ と繋ぐしかなさそうです
微妙ですね。もし良い方法をご存知の方が居たら教えてください・・

しかし、実はなんとか繋いだとしても回避できない大きな問題があります。
それは、HoudiniEngineForMayaでは
複数のオブジェクトをインプットしてもHDA内部では1つのオブジェクトとして扱われる
という仕様になっている為。入力と出力で数が一致しません。
こんな感じです。
HDA_multiShape.jpg

公式ドキュメントだと、Mayaの機能でSeparateして使ってみたいなことが書いてありますが、それも微妙かなと・・
Groupで分けてSetにしても扱いづらいですし
一応、Split Geos by Groupというオプションもありますが。今後どうなるのかよくわかりません。
split_by_group.jpg

このあたりのデータの流れをどうしたらいいか、開発者に相談してみたいですが
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名が少し違っていたので
まだ仕様が変わるかもしれません。実際に自分が使ってるバージョンで調べたほうが良さそうです。

Maya_DebugAttributes.jpg

オブジェクトの名前がnameに格納されているとか、使えそうな情報が入ってます。

このnameを使ってGroupを作るとか・・
Mayaのノード名はDAGパスで表記されているのを利用してpathに変換して使えそうですね。

pathに変換する場合は、"|"を"/"にしたいのでwrangleでこんな感じにしとくのが良さそうです。

Maya_DebugAttributes_rename.jpg

他にも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さんがフォーラムでいつも答えてくれています。
日本に居た時にもっと話しておけばよかった・・。応援しています!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away