HoudiniのTOPsからMayaを操作する

# 概要
HoudiniからMayaを操作する手順を調べたのでメモとして残します。

仕組みとしては、TOPsからmelかPythonでMayaへコマンドを送ることでMayaを操作していきます。
Houdiniのインストールフォルダ内にサンプルデータがあるのですが、それを参考にしつつ、よりシンプルな内容にしたものが今回の記事になるので、そちらのサンプルデータも参考にしてみてください。
＞＞＞ インストールフォルダ内/houdini/pdg/examples/top_mayapipeline

今回Mayaに行わせる処理は、キューブを作成して指定したフォルダにmaファイルとして保存する、というシンプルなものになります。この部分は、melによる処理となり、下記の手順を踏めばあとはMayaのスクリプト次第でいかようにもなる部分になります。

# ネットワーク全体
こちらが今回作成するTOPsのネットワークです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314518/aa9cd7f4-9f56-63b3-a6a5-4083ac7f616f.png)

TOPsのネットワークになるので、Houdiniを起動したらTabメニューから TOP Network ノードを作成しその中でノードを作成していきます。
各ノードについて順に解説していきます。

# ワークアイテムの作成
TOPsで処理を動作させるためには、ワークアイテムを作成する必要がありますが、今回は元となるデータは必要なく、mayaを操作するだけの空のワークアイテムがあればよいので、Generic Generator ノードで作成します。

このノードは指定した数のワークアイテムを作成することができるノードになります。
あまり意味はないですが、勉強もかねて3つのワークアイテムを作成してみます。
Item Count パラメータ欄に3を入力することで3つのワークアイテムが作成され、これによって最終的な結果として3つのMayaファイルが作成されることになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314518/f6ed0a43-b684-f9ca-a7b2-99c8aa86900a.png)



# Mayaファイルの保存パスの設定
続けてAttribute Create ノードを作成し、Mayaファイルの保存先をアトリビュートとして準備します。

Attributesグループ欄のStringsパラメータの右にある「+」ボタンをクリックしてString型のアトリビュートを作成（下図①）。
任意のアトリビュート名（下図②）と、保存するファイル名をフォルダパスも含めて記述（下図③）します。

Mayaファイルは3つ作成されるため、ファイル名が被らないよう通し番号などを付加してユニークなものにする必要があります。ここでは通し番号を、アトリビュートである @pdg_index から借りてくることにします。
@pdg_index は、各ワークアイテムごとにユニークに割り振られる番号になります。
③のファイルパスの途中に　\` \` で囲んで @pdg_index を記載することで、その部分に各ワークアイテムごとの@pdg_indexの番号が割り当てられます。
例えば、@pdg_index が 0 の場合、このアトリビュートは「D:/Work/maya/cube_0.ma」という情報としてやり取りされることになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314518/2b1bd2b9-933b-6d41-b8cd-c836847adaae.png)

# mayapy.exe のパスを指定
次にmayapy.exeのパスを環境設定として指定します。

Environment Edit ノードの Variable Name パラメータ欄に任意の環境変数名、ここでは「PDG_MAYAPY」を記述し、Value パラメータ欄にアプリケーションのパスを記述します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314518/161d6869-86e8-8953-9008-229da57ea9f3.png)
このパスを指定することで命令を処理するアプリケーションがどこにあるかを設定します。
melしか使わない場合も設定しないとエラーになるようです。
この環境変数名は、次に作成する Maya Server Begin ノードで使われますが、そのデフォルト値に記載されているテキストをそのまま設定しています。

# mayaに命令を送るコマンドブロックの作成
ここから実際にmayaに命令を送る処理を作成していきます。

タブメニューから、Maya Command Chain を選択。
Maya Server Begin TOP と Command Server End TOP のノードのセットが作成されるので、このノードの間に実際にMayaで動作させる処理を追加していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314518/09bb8d55-c279-1809-e2d8-e795550da963.png)

Maya Server Begin TOP の Maya　Python Executable 欄に命令を処理するアプリケーションパスを記述しますが、デフォルトで「\$PDG_MAYAPY」と入力されており、これは環境変数として先ほど設定してあるので、このままにしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314518/c0282a6d-3bfe-ed92-18e8-0d07c9c14992.png)


# mel !!
実際にMayaに送る命令は、Command Send ノードの中に、pythonかmelで記述します。
今回は、以下の通り、キューブを作成する命令と、maファイルを保存する命令をそれぞれ別のノードにmelで記述します。

ちなみにここにmelを記述する場合、1行目は「//mel」とする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314518/cd9382b4-0cd0-dc2d-8ee5-f771ff6912a5.png)

``` 
//mel
polyCube -w 1 -h 1 -d 1 -sx 1 -sy 1 -sz 1 -ax 0 1 0 -cuv 4 -ch 1;
``` 

以下は、maファイルを保存する命令になりますが、ここで、先ほど作成した @mapath を指定しています。
内容は前述の通り、\` \`で囲んで記述します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314518/e07c5d63-8fcc-e838-30b9-b215023da623.png)

``` 
//mel
file -rename "`@mapath`";
file -force -save -type "mayaAscii";
``` 

# 実行してみる
以上で準備ができたので、いよいよ実行してみましょう。
ここまで説明したノードがあれば、処理はされますが、サンプルデータにならって、最後に Weignt for All をつなぎ全体の処理が終わったのが分かるようにしておきます。
このWeight for All を右クリックしてメニューから、Dirty and Cook This Node を選択。
（Cook Selected Node でもオッケーです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314518/c95bdc26-6c02-3511-5929-e2a01960d8cc.png)

しばらく待ってノードの左にチェックマークがつくと処理が完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314518/c2f56d1b-5424-900e-8151-4e362acb0068.png)

Attributes Create ノードで指定したパスを確認すると、3つのmaファイルができているかと思います。
ファイルを開くと中にcubeがあるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314518/58eb486f-e152-c1bc-c13e-df1c595ad12c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314518/563df806-6216-84ed-2ec3-627109861dba.png)


# まとめ
HoudiniからMayaを操作する場合、TOPコンテキストのタブメニューから Maya Command Chain を使用。
必ず必要な情報としては、mayapy.exe のパスになります。
TOPネットワークの中に組み込むことで、部分的にMayaを使っての処理を一連の命令に組み込むことができるようになります。


今回使用したアプリケーションは
Windows10
Houdini indie 18.0.499
Maya2018 SP6