Houdiniでは、HScript
、Python
、VEX
、C++(HDK)
の4つのプログラミング環境が使えますが、HDKはその中でも一番Houdiniのコアに近い所にある環境で、C++で記述して各種ノードのプラグインを作るものです。
この記事ではHDKを使ってプラグインをビルドするまでの導入部分を紹介したいと思います。HDK自体の解説についてはまた別の機会に、、、
HDKの発見
僕が一番最初にHDKについて興味を持ったのは↓の動画を見たのがきっかけでした。
Maya as Houdini Modeling tool :)
この動画では、Houdiniでメッシュの操作をするのがしんどいと思ったユーザーさんがMayaでモデリングをしてそのジオメトリのデータをHoudiniにリアルタイムで持っていけたぜ!的な所の紹介をされています。
そういうの自分もやりたい!と思い立ち、PythonベースでopenFrameworksからジオメトリキャッシュを書き出し → Houdiniで読み込みというのをやってみたのですが、なかなかパフォーマンスが出ず。どうやったらもっと早くなるんだろうか、、、というリサーチを初めたのがそもそもになります。
その後はPython側でボトルネックになっていそうな所をCythonに書き直したりしたのですが、色々やった結果HDKを使うのが一番早いのでは?という結論に落ち着きました。
それらの試行錯誤の結果は、この動画の1:30あたりから、HoudiniからUnreal Engine 4にジオメトリを転送してリアルタイムレンダリングさせている部分に活用されています。
開発環境のセットアップ
さて、実際に動かす環境づくりの説明です。
注意点として、Houdini15.5からsidefxで公開されているHoudiniのビルド環境が変わりまして、15.5以前だとVC2012だったのが、以降だとVS2015でビルドされるようになりました。
それに伴ってHDKを使ったプラグインをビルドする環境も使用するHoudiniのバージョンにあわせる必要があります。
Houdini15.5以前で使われていたVS2012では、Houdiniが要求する64bitバイナリのビルドが無料で提供されているVisual Studio Express 2012
だとできなくて、商用版のVisual Studio Professional 2012
を用意する必要があります。
一方、VS2015の無料版、Visuao Studio Community 2015
だと64bitバイナリも問題なくビルドできるので、Houdini 15.5以降 + Visual Studio Community 2015環境を使うのがオススメの構成です。
Visual Studio Community 2015 のダウンロード&インストールは → こちらから
インストーラーを起動してOKを押していれば特に問題なくインストールが完了します。(インストールが終わったら念のため再起動をしてください)
HDKのサンプルを試してみる
まずsidefxが提供しているサンプルのビルドを試してみます。
ちょっと手順は違いますが、HDKのドキュメントの、Creating Custom Plugins、Building a Plugin: SOP_Star.C Example
を順を追ってやってみよう という感じです。
HDKのサンプルファイルは、C:\Program Files\Side Effects Software\Houdini 15.5.XXX\toolkit\samples
あたりに入っているので、適当な所にコピーしてそれをいじるようにします。今回の場合、C:\temp\samples
にまるごとコピーすることにしました。
コンパイラにパスが通っているかの確認
Visual Studio 用開発者コマンド プロンプトを開いて、念のため cl
やnmake
などのVisual C++コンパイラのツール郡にパスが通っているかを確認します。
> cl
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
usage: cl [ option... ] filename... [ /link linkoption... ]
などと表示されればOKです。
Houdiniのツールにパスを通す
Houdiniにはhcustom
というHDKプラグインをクロスプラットフォームでビルドしてくれるツールが付属しています。まずはこれを使えるようにしてみましょう。
Visual Studio 用開発者コマンド プロンプトを開いた状態だとhcustom
のあるディレクトリにはパスが通っていないので手動でこれを通します。
> set PATH=%PATH%;"C:\Program Files\Side Effects Software\Houdini 15.5.XXX\bin"
↑は環境変数のPATH
にhcustom
が入っているパスを末尾に追加するというコマンドです。(XXXの所は実行環境にあわせて適時置き換えてください)
> echo %PATH%
C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow;
(...中略...);"C:\Program Files\Side Effects Software\Houdini 15.5.606\bin"
echo %PATH%
を実行して、↑のように末尾にさきほど指定した文字列が追加されていればOKです。
パスが通っていればhcustom
と実行した時に↓のようなメッセージが出力されるはずです。
> hcustom
Usage: hcustom [OPTION]... { [FILE]... | -c | -m }
This program will make custom plug-ins (DSO's) for Houdini.
Options:
-d Display CFLAGS environment variable passed to hcompile
-g Create debug version of the DSO
(...略...)
SOP_Star.C
をビルドする
では、さきほど適当な所にコピーしたsamples
の下のSOP
フォルダに移動してSOP_Star
をビルドしてみましょう。cd
とdir
コマンドを使います
> cd C:\temp\samples\SOP\
> dir
Volume in drive C is Windows
Volume Serial Number is 4878-70BC
Directory of C:\temp\samples\SOP
12/11/2016 09:40 PM <DIR> .
12/11/2016 09:40 PM <DIR> ..
(...中略...)
09/21/2016 02:50 PM 8,409 SOP_Star.C
09/21/2016 02:50 PM 3,635 SOP_Star.h
(...中略...)
57 File(s) 316,989 bytes
2 Dir(s) 740,684,898,304 bytes free
SOP_Star.C
が確認できました。
続けてhcustom
コマンドでプラグインを作っていきます。単純にhcustom
に続けてビルドしたいCファイルを入れればOKです。
> hcustom SOP_Star.C
Making 'SOP_Star.o' and 'c:/Users/satoruhiga//houdini15.5/dso\SOP_Star.dll' from 'SOP_Star.C'
SOP_Star.C
Creating library SOP_Star.lib and object SOP_Star.exp
通常に終了すると自分のホームディレクトリの中、$HOME\houdini15.5\dso
の中にSOP_Star.dll
ができているはずです!
さらにHoudiniを立ち上げて/obj
に入りタブを押したノードリストの中にstar
が追加されていると思います。
HDKのサンプルの中にはStarの他にも色々なものがあります。興味がある方は色々とビルドして試してみてください!
こちらの環境ではビルド時にhcustom
がクラッシュしました。。。が、デバッグしますか的なダイアログに続けて開いたVisual StudioのウィンドウからBrake → Continueを選ぶと普通にビルドできて.dllもできていました。。謎。。。
まとめ - なぜHDKを使うのか
HDKのプラグインをビルドする所までを紹介てきたのですが、こんだけ色々やって星が出るだけじゃん… と思われた人もいるかもしれません。。ですが、HDKを使ってできる事、おそらくもっとあると思います。
例えば、
-
C/C++
の大量のライブラリ郡を使える - 単純な速度比較でも
Python
とC++
を比較すると圧倒的にC++が早い → 数倍~数百倍のオーダー - 最初の例であったような、MayaなどのDCCツール、openFrameworksなどのリアルタイム系のツールなど、外部アプリケーションとの連携が高速にできる → Pythonでもできるけど、ボトルネックになりがち
あたりが挙げられると思います。
Houdiniはそれ自体がプログラミング環境かというぐらいにパワフルで自由度に富んでいますが、あと一歩の所で**自分の欲しかったものないじゃん、、**という経験をした事があるのではないでしょうか。
そういう時は大抵ノードの組合せでとんち的にごまかすか、Pythonなどを使って力技で解決すると思うのですが、そういった時にこそHoudiniが保持しているデータにフルアクセスできるHDK/C++
の出番なのではないかと思います。
ものすごいめんどくさい事をする時に、簡単な処理なんだけどとにかく数がヤバいなどの時に、何かややこしい事があった時に、Houdiniをもっと自由に使いたい時の最後の砦として覚えておくときっと役に立つはずです!
おまけ: VSのプロジェクトを自分で作ってサンプルをビルドする
おまけとして、hcustom
を使うのではなくVisual StudioのIDEを使ってHDKプラグインを開発する方法をのせておきます。(僕は普段こっちのほうを使っています)
IDEを使う利点としては、
- いい感じに補完が入る
- 一回設定してしまえばコマンドラインをいじる必要がない
- Build & Runの手間が減る
あたりがあります。例として、さきほど紹介したものと同じSOP_Star.C
をビルドするプロジェクトを作ってみましょう。
(申し訳ないのですがVisual Studio英語版での紹介になります。。。)
プロジェクトの作成、ソースコードの追加
File > New > Project から新規プロジェクトを作成する
左側からTemplates > Visual C++ > Win32
を選択して、真ん中のWin32 Project
を選択、名前とパスを適当に設定してOK
ウィザードが立ち挙がるので↑の画像のようにしてFinish
新しいプロジェクトができるのでターゲットを Release
, x64
に設定する
プロジェクト以下にsrc
フォルダを作り、ビルドしたいファイルをここにコピーしてくる。
その時に.C
ファイルを.cpp
ファイルにリネームしておく
さきほど作成したsrc
フォルダをプロジェクトにドラッグ&ドロップで追加する
ここで一応ビルドを試してみると SOP/SOP_Node.h
が足りないというエラーが出ると思います。HDKのファイル郡にパスが通っていないためです
プロパティシートの導入
HDKのビルドを簡単にするためのプロパティシートを作ったのでそれを追加します。
まず↑をプロジェクトのディレクトリにダウンロードしてきて HDK.props
の名前で配置します
Property Manager
を表示します。画面上に見付からない場合はView > Other Windows > Property Manager
で表示してください。
Property Manager
に表示されたプロジェクトを右クリックして、Add Existing Property Sheet
を選択して、さきほど保存したHDK.props
を指定します。
Release | x64
のドロップダウンの下にHDKという項目が追加されているはずなので、そちらをダブルクリックしてプロパティページを開きます。
続けて、User Macros
の中のHOUDINI_VERSION_BUILD
の数字を自分の環境のものと合わせてOK
を押してください。
!!! プロパティシートの内容を変更した場合、プロパティ名(この場合HDK
)を右クリックして出るSave HDK
を実行しないと変更した値が失われるので注意 !!!
この状態でひとまずプラグインのビルドが状態になるとおもいますが、dllが書き出されるのがプロジェクトディレクトリの中のx64\Release
の中になっているので手動で$HOME\houdini15.5\dso
にコピーしないといけず効率が悪いです。。。続けてIDE上でBuild & Runできる設定をしましょう!
実行環境の整備
Solusiton Explorer
のを開いて、プロジェクト名を右クリック > Property
を表示します。続けて、General > Output Directory
に$(HOUDINI_USER_PREF_DIR)\dso
を指定します。
これで、ビルドした.dll
が$HOME\houdini15.5\dso
に配置されることになります。(ちなみにHOUDINI_USER_PREF_DIR
は、さきほど追加したHDK.props
のUser Macros
の中で定義されています)
さらにIDE上でBuild & Runできるように、Debugging
の中のCommand
に$(H)\bin\happrentice.exe
を、Command Arguments
とWorking Directry
に任意のファイル名とディレクトリを指定します。
たとえばWorking Directory
に$(ProjectDir)
を、Command Arguments
にuntitled.hipnc
を指定すると現在のプロジェクトディレクトリにあるuntitled.hipnc
を実行するという事になります。
ここまで設定できたら晴れてVisual StudioでF5を押したら立ち上がるといういつもの感じになります。おつかれさまでした!
現状の問題点として、.dll
をRelease
ではなくてDebug
でビルドして立ち上げた場合になんだかよくわからないけどエラーが出て起動しないというのがあります。。ここはちょっと追えてないのですが、このままだとまともにブレークポイントも設定できないのでどうにかしたい所。。。
おまけの方が有用な感じになってしまった感がありますが、これにて!