Houdiniと環境変数の魔導書 〜補助魔法導入で失敗しないために〜


# イントロ

みなさん、Houdiniをご存知でしょうか。
とりあえずググってみると、世紀の魔術師[**Harry Houdini**](https://ja.wikipedia.org/wiki/ハリー・フーディーニ)がヒットします。
Potter家の魔術師ではないHarryです。ムキムキですね。
![HarryHoudini-1899.jpg](https://qiita-image-store.s3.amazonaws.com/0/51857/5ea61325-8a84-1000-509a-74034ac94ae8.jpeg)

さて、CG業界には、デジタルコンテンツクリエイション(DCC)ツールの一つとして、彼の名前を借りたツールが存在します。
それが、[SideFX社が提供する**Houdini**](https://www.sidefx.com)というアプリケーションです。

![houdini.png](https://qiita-image-store.s3.amazonaws.com/0/51857/b32d5e03-018c-28f9-8acf-e8546eec8613.png)

Houdiniが利用された映像作品は以下のリンクから確認できます。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">The 2018 Houdini reel is ALIVE! A HUGE thank you to the studios who supplied the work for this reel - and even HUGERER kudos to the talented artists who worked on these amazing shots. We LOVE seeing the work you bring to life with the help of Houdini! <a href="https://t.co/sX5WfqrATL">https://t.co/sX5WfqrATL</a> <a href="https://t.co/UUWRC5FG65">pic.twitter.com/UUWRC5FG65</a></p>&mdash; SideFX (@sidefx) <a href="https://twitter.com/sidefx/status/1025441493765550083?ref_src=twsrc%5Etfw">2018年8月3日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

こっちはゲーム系。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">New reel! The 2018 Houdini Games Reel highlights some of the amazing <a href="https://twitter.com/hashtag/gamedev?src=hash&amp;ref_src=twsrc%5Etfw">#gamedev</a> work our crazy-talented customers create with the help of Houdini <a href="https://t.co/pWk06qxk0o">https://t.co/pWk06qxk0o</a></p>&mdash; SideFX (@sidefx) <a href="https://twitter.com/sidefx/status/974383905427030016?ref_src=twsrc%5Etfw">2018年3月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


プロシージャルなコンテンツ作成を基本とした、ノードベースでのCG作成が行えます。
Houdini Apprenticeという、まさに「見習い」向けにほぼフル機能を無料で試せますので、興味がある方はぜひダウンロードして触ってみてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/51857/d5bc3ebf-5517-51eb-9445-d11542812e22.png)




Houdiniは、Pythonスクリプトや、独自のアセット機能Houdini Digital Asset(HDA)といった機構をもち、それをアーティストやゲーム開発者などに補助機能として提供する事が出来ます。その時に設定するのが、このHoudiniが持つ**環境変数の設定**です。

今回は、その**Houdiniの環境変数の設定**にまつわるお話です。




# そもそもなぜ環境変数を設定するか

理由はいくつかあります。

* サードパーティのプラグインインストーラーが、そのプラグイン管理のために独自のパスの先に配置していくため、その場所をHoudiniに知らせる必要がある。
* 社内で同じプラグインのバージョンを同プロジェクト内ユーザーに使ってもらいたいため、ネットワーク上に配置し、それを一律で読みに行くようにしてもらう。
* プラグインのバージョン違いをサクサクっと検証できるように、バージョン区分けのディレクトリに保存しておくため、Houdiniに知らせるそれぞれのバージョンのプラグインのパスを切り替えられるようにしておく。
* コードを編集するための外部エディタを任意のものに指定する。

などです。

環境変数設定がないDCCツールは、こういった設定が柔軟にできず、地味にDCCツールサポートの苦労を強いられます。
全DCCツールはカスタムの環境変数設定に対応してほしいものです…。




# 環境変数の設定の仕方

環境変数の設定の仕方はいくつかあります。

* houdini.envに書き込む。
* packagesコンフィグファイルを活用する。
    * 参考: [SideFX Labs Toolの新規のインストール方法、Package機能に関して検証してみる](https://qiita.com/takavfx/items/d1698b89df6fb1b86f9c)
* 起動batやshファイルに書き込む。
* ツールランチャーの機能を使って起動時に一緒に設定してもらう。
    * 例えば、Pythonの`subprocess.run('houdini', env=envs)`でセットして行く感じです。

などです。




### houdini.env

```houdini.env
#
# Houdini Environment Settings
#
# The contents of this file are read into the environment
# at startup.  They will override any existing entries in
# the environment.
#
# The syntax is one entry per line as follows:
#    VAR = VALUE
#
# Values may be quoted
#    VAR = "VALUE"
#
# Values may be empty
#    VAR = 
#

# Example:
#
# HOUDINI_NO_SPLASH = 1


HOUDINI_PATH=C:\tools\houdini\USD\2018.11.10;&
```

### batファイル

```launch_houdini.bat
@echo off

set HOUDINI_VERSION=17.0.395
set HOUDINI_EXE=C:\Program Files\Side Effects Software\Houdini %HOUDINI_VERSION%\bin\houdinifx.exe

set HOUDINI_PATH=C:\tools\houdini\USD\2018.11.10;&

%HOUDINI_EXE%
```




# まず最初の闇、それはhoudini.env

「プラグインが読めてない！」という問題が起こり、ユーザーからトラブルの対応相談が来ることがあります。その場合、まず疑いに行くといいのが`houdini.env`ファイルです。
　

このhoudini.envファイル、Windowsだと、

```
C:\Users\<username>\Documents\houdini<version> (例： C:\Users\takanori\Documents\houdini17.0)
```
の直下に保存されています。

ここに環境変数を登録していくことによって、Houdiniが起動時にスクリプトやHDAファイルを認識できるようにしてくれます。

しかしながら、このファイル、人も触ることもあれば、プラグインのインストーラーが勝手に触ることもあり闇を生みがちです。

よくあるのが、
一つのプラグインをインストールしておいて、
二個目のプラグインをインストーラーを使ってインストールすると、
一個目のプラグインが動作しなくなることがあります。

これは二個目のインストーラーが以下のように書き込み、前の環境変数を上書いてしまうためです。

```houdini.env
# 一個目 <- 二個目に上書きされてしまうパス。「記述されてるのに、読み込めてない」、みたいなことになる。
HOUDINI_PATH=C:\tools\Houdini\GameDevTool\1.72;&

# 二個目 <- こっちが最終的な設定として認識される
HOUIDNI_PATH=C:\Program Data\Redshift\Plugin\Houdini 17.0.532;&
```

ちなみに、bat起動などで環境変数をあらかじめ設定したうえでHoudiniを起動しようとしても、**Houdiniの環境変数設定の順序は一番最後にhoudini.envのものを読み込んでくる**ため、頑張ってbat起動時に環境変数を設定しても、houdini.envでセットされた環境変数が上書いてきて邪魔する事があります。

一番の解決方法としては、**houdini.env**には書かずに、社内でこういった環境変数を一括管理し、いっぺんにプロジェクトデフォルトの環境変数をセットしてくれるDCCツールランチャーを開発・購入して、それを経由してHoudiniを立ち上げる事です。
そうでない場合は、プロジェクト固有の起動Bat等を作っておく事が良いでしょう。



# 環境変数の呪文

Houdiniの環境変数は17.0.395のバージョンの時点でざっと311コくらいです。

確認方法は、HoudiniのCommand Line Toolsを使い、`hconfig -a >> houdini_envs.txt` とでも出してみると分かります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/51857/e769ae9c-e8f7-ae83-8d5e-84587499eb1f.png)

書き出した環境変数リストはこんな感じ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/51857/fe9b6304-3470-2fbf-307b-f0e03cab2616.png)

その中でも、チームで共有するのによく使うのは、

* **HOUDINI_PATH**
    * Houdiniが定めるフォルダ階層に従って適切なディレクトリ・ファイルを配置していくことで、Houdiniがそれらを起動時に自動認識します。
* **HOUDINI_MENU_PATH**
    * Houdiniのメインメニューを定めるファイルが配置されているパスです。
* **HOUDINI_TOOLBAR_PATH**
    * シェルフツールという、Houdiniの便利スクリプトを並べたカスタムのツールバーを設定したファイルを見に行くパスです。
* **HOUDINI_PYTHON_PANEL_PATH**
    * Pythonパネルという、Houdiniに組み込めるPySide/PySide2ベースのカスタムGUIパネルの設定ファイルを見に行くパスです。
* **HOUDINI_OTLSCAN_PATH**
    * Houdini Digital Assetを配置するパスです。
* **HOUDINI_DSO_PATH**
    * ライブラリ等のビルドされたバイナリファイル等を配置するパスです。


などで、他に個人の自由で使用するものとしては、

* **EDITOR**
    * 「外部のコードエディターで編集する」機能を使う際に、これにセットされているexe等が実行されます。
* **HOUDINI_EXTERNAL_HELP_BROWSER**
    * Houdiniからヘルプを開く時のデフォルトブラウザを指定します。
* **HOUDINI_DSO_ERROR**
    * DSO関連のエラーをどれだけ表示するかを指定します。

などがあります。

また、ここには載ってないですが、Pythonではおなじみの**PYTHONPATH**環境変数もHoudiniにPythonモジュールを知らせるものとしてよく使います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/51857/9db00871-4d80-32b8-dd27-92fe03b29148.png)




### HOUDINI_PATH以外のパスを設定するということ

基本的には**HOUDINI_PATH**がほぼすべてを握っています。
マスター級とでも認識してもらえればいいです。
この**HOUDINI_PATH**に設定されていると、例えば以下のような階層の場合、

* root(HOUDINI_PATHに設定されているところ)
    * config(フォルダ)
    * otls(フォルダ)
    * python_panels(フォルダ)
    * sciprts(フォルダ)

これらの**決まったディレクトリ**や、**決まったファイル**は、Houdiniが起動時に自動で認識してくれます。

では、すべて **HOUDIN_PATH** で設定すればいいのか？と思うと思いますが、必ずしもそうとも限りません。
スクリプトやHoudini Digital Assetを開発して検証する際には、問題範囲を限りなく絞って開発したいため、**そのディレクトリだけ**読んでほしいケースがままあります。

また、そもそも全部が全部 **HOUDINI_PATH** で設定していると、総パスがとんでもない長さになるので、何を読んでいるのか追うのが大変になっていきます。

基本的には、インハウスツールの開発・検証・運用のフルセットでのスピードを重視したい場合、最初からこの**HOUDINI_PATHではない固有パス**を設定するのが良いです。



### 開いているシーンで、どういったパスが設定してあるかを確かめる

Houdiniのシーンを開いている状態で、そのシーンが現在どの環境変数をカスタムで持っているかを確認する事が出来ます。

Main Menu -> Windows -> ShellでShellウィンドウを開き、`hconfig`コマンドを利用します。
![2018-12-07_04-05-31.png](https://qiita-image-store.s3.amazonaws.com/0/51857/cbe3c805-d765-8384-9ff7-345e75898760.png)




# それぞれの設定呪文

## HOUDINI_PATH

*以下、基本的にはbatとかへの書き方は同じなので、houdini.envへの書き方を前提にサンプルを提示*


**HOUDINI_PATH**を設定する場合にはこうやります。

```
HOUDINI_PATH=C:\tools\houdini\USD\2018.11.10;&
```

そう。 `&` というものが要るのです。
これがないと、どうなるかというと…

![image.png](https://qiita-image-store.s3.amazonaws.com/0/51857/b1e3c270-b5dd-af35-e974-2e2d7e460ae3.png)

なんと、立ち上がりすらせずにHoudiniがクラッシュします。恐怖ですね。
環境によっては立ち上がることもありますが、UIやシェルフツールなどいろんなものが吹っ飛ぶので、結局まともに使えません。
忘れずに `&` を追記しましよう。



## HOUDINI_MENU_PATHの場合

Houdiniにはメインメニューがこんな感じになっています。

![2018-12-01_18-44-04.png](https://qiita-image-store.s3.amazonaws.com/0/51857/53aa8a5d-97be-ee26-691a-153b2eab0f3a.png)


Houdiniのメインメニューにカスタムの、例えば、チームの名前を入れたチームのためのツールを追加していきたい場合、**HOUDINI_MENU_PATH**に設定されたファイル`MainMenuCommon.xml`を読みに行きます。
その場合はこうやります。

```
HOUDINI_MENU_PATH=C:\tools\houdini\team\ta;@
```

**！！？**
ここでは、`@`が必要になってくるのです。

これがないと…、エラー警告を出しながら、もともとのメニューが吹っ飛びます。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/51857/bf776f99-2ff1-2e95-348b-3bd6a30e7862.png)




## HOUDINI_TOOLBAR_PATHの場合

Houdiniのシェルフツールはこういうものです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/51857/88bf1952-1fdf-6e46-0ac0-fb31eec11806.png)

ここにカスタムのツールバーを追加したい場合は、**HOUDINI_TOOLBAR_PATH**が必要になります。
その場合こうやります。

```
HOUDINI_TOOLBAR_PATH=C:\tools\houdini\Bento\v5.0.2\toolbar;@/^
```

**！？**
なんと記号が増えました。
`@/^`が要ります。呪文味あります。

これがないと、一応該当場所にエラーメッセージは出ますが、コンソールエラーは出さずに、シェルフツールがふっとびます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/51857/4446414d-0d01-515d-381b-24727d8eb6ee.png)


## HOUDINI_DSO_PATHの場合

dsoというのは、プラグインをビルドしたバイナリファイルの行き場所です。
対象ディレクトリにはdllファイルやisoファイルが配置されます。

```
HOUDINI_DSO_PATH=C:\tools\houdini\USD\2018.11.10\dso;@/dso_^;@/dso
```

**！！！？？**
今度は、 `@/dso_^;@/dso` が必要になります。
短いはずなのに、奇妙さを覚えさせる呪文です。

これがないと、Houdiniがインストール時に持っているデフォルトのバイナリファイルが読めなくなります。
様々なノードの機能がdllファイルに格納されてたりするので、かなりの機能が使えなくなってしまいます。



## どうやって調べるか

さて、こういうのを闇雲に追っていくのはさすがに骨が折れます。
こういった環境変数、どうやって知ればいいか。
方法があります。
**Command Line Toolsという名の魔導書へ呪文を唱える**のです。

```
hconfig -ap
```

この呪文を使うと以下のように、それぞれの環境変数に対する解説と、デフォルトで入れるべき環境変数が帰ってくるので、それを読み解きつつ、環境変数をセットする場合に忘れずにセットします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/51857/5c4898b3-6736-7b3c-4e5e-e5909dc4f24d.png)




# 最後に

Houdiniの用意する環境変数がたくさんあります。正直覚えられないです。
なので、補助ツールや自動化ツールの追加など、カスタム対応を行おうとして環境変数の罠を踏んでしまったら、**魔導書(Command Line Tools)**でもって、`hconfig -ap`コマンドで対処しましょう。

![toy.png](https://qiita-image-store.s3.amazonaws.com/0/51857/e14a4b85-9896-2ee9-aed9-0902a0f58909.png)