Interactive Houdini

Houdini Advent Calendar 2016 18日目に投稿させていただいた記事です


■はじめに

Houdiniには外部デバイスからインタラクティブにデータを入力する機能があります。

今回は、その機能を利用して外部に接続した各種フィジカルデバイスの操作から、Houdiniへデータを入力する方法を色々と書いてみたいと思います。

手頃に試せそうな例として、ここでは以下のデバイスからの入力を試してみます。

・マウス
・ペンタブレット

・キーボード
・MIDIコントローラ


■環境

・Windows10 64bit
・Houdini Indie 15.5.673


■まずは今回取り上げるCHOPに共通する予備知識

今回取り上げるCHOPは以下の通りです

Mouse CHOP
Keyboard CHOP
MIDI In CHOP

・CHOPデータの在り処について

CHOPのデータは、「CHOPチャンネル」が持っています。
CHOPチャンネルのデータへアクセスする際は、CHOPノードだけではなく、CHOPノード内にあるCHOPチャンネル名まで指定する必要があります。

・CHOPデータの詳細確認

CHOPノードを中ボタンでクリックするとCHOP内のチャンネル数や、開始/終了フレーム、サンプルレートなどの詳細情報が表示されます。

赤く囲んだ部分には、このCHOPに含まれるチャンネル名と値が表示されています。
この例の場合、ステレオのオーディオファイルを読み込んでいるので、このCHOPには左右2チャンネルの波形データが含まれていることがわかります。
そして、チャンネル名は左右でそれぞれ chan0 chan1 が割り当てられています。

・CHOPチャンネルへのパス

CHOPチャンネルへのパスは、CHOPノードへのパス+CHOPチャンネル名で指定します

~/chop_name/channel_name

上記の例で言うと、WAV_FILE(File CHOP) の chan0 チャンネルへのフルパスは以下のようになります

/obj/driver_chopnet/WAV_FILE/chan0

・CHOPチャンネルへのアクセス

CHOPチャンネルの各情報は、chop系エクスプレッション関数を使って取得します。
これらの詳細はマニュアルを参照してください。

  • chop : 現在時間でCHOPチャンネルの値を取得
  • chope : CHOPチャンネルの終了インデクスを取得
  • chopf : 指定フレームでCHOPチャンネルの値を取得
  • chopi : 指定サンプルポイントでCHOPチャンネルの値を取得
  • chopl : CHOPチャンネルの長さをサンプル数で取得
  • chopn : CHOP内のチャンネル数を取得
  • chopr : CHOPのサンプルレートを取得
  • chops : CHOPチャンネルの開始インデクスを取得
  • chopt : 指定した時間でのCHOPチャンネルの値を取得
  • chopcf : 指定フレーム、指定チャンネルインデクスでCHOPチャンネルの値を取得
  • chopci : 指定サンプルポイント、指定チャンネルインデクスでCHOPチャンネルの値を取得
  • chopct : 指定時間、指定チャンネルインデクスでCHOPチャンネルの値を取得
  • chopstr : 現在時間でのCHOPチャンネルの文字列データを取得

先の例で登場したCHOPチャンネルが持つ現在時間のデータが欲しい場合は、データを呼び込むパラメータボックス内で以下のエクスプレッションを使用します。

chop( “/obj/driver_chopnet/WAV_FILE/chan0” )

・CHOPチャンネルの波形データを確認する

CHOPの波形データは、CHOPノードの右端にある[Graphフラグ]をオンにすることで、Motion FX Viewに表示されます。

Motion FX View

・CHOPデータのサンプルレート

CHOPでは様々な波形データを扱うことができます。
波形データは自由に再生時のサンプルレート(一秒あたりのデータ数)を指定できるようになっています。

サンプルレートの高いオーディオデータを30fps設定のシーンでアニメーションカーブとして使う場合、サンプルレートを30にリサンプルしてから使用するのが負荷軽減につながって良いのではないかと思います。

サンプルレートは、File CHOPのChannelタブ内またはResample CHOPにあるSample Rateパラメータで指定します。

・上で読み込んだWAVデータの波形を30fps化したところ

・外部から入力されたデータのレコーディング

外部から入力されたデータを記録しておき、再生することができます。
MIDIデータを外部から入力するMIDI In CHOPなどは、入力されたMIDIデータを自分自身に記録する事ができるようになっていますが、Record CHOPを下流に接続してそちらで記録するほうがデータの取り回しの面で良いと思います。

レコーディングは、データ入力CHOPの下流に Record CHOPを接続し、Record パラメータをオンにした状態で行います。


■というわけで、早速やってみよう

CHOP入力→レコーディング→再生の流れは、今回紹介するどのCHOPでも変わらないので、まずはMouse CHOPの簡単なチュートリアルで作業の流れを掴んでみます。


■Mouse CHOPチュートリアル

1・CHOPコンテキストにCHOP Networkを作成します

2・CHOP Network の中に Mouse CHOPを作ります

3・Mouse CHOPのGraphフラグをオンにしたあと、Motion FX Viewを表示します

4・Mouse CHOPの下にRecord CHOPを接続します

5・Record CHOPのRecordパラメータをOnにし、シーンを再生します

この時、シーンのリアルタイム再生モードをオンにしておくと実際のフレームレートでレコーディングできます。

また、再生モードを Play Onceにしておくことでリピート再生をオフにし、うっかり開始フレーム付近を書き換えてしまうのを防げます。

6・マウスカーソルを自由に動かし、グラフが描かれていくのを確認します


各カーブの上には、対応するカラーでチャンネル名が表示されています。(geo1:txgeo1:ty

7・記録できたら、Record CHOPのRecordをOffにします

8・/obj/に新たにBoxオブジェクトを作ります

9・boxオブジェクトのTranslateX/Yにエクスプレッションを設定します

・TranslateX
chop(“../../ch/ch1/record1/geo1:tx”)

・TranslateY
chop(“../../ch/ch1/record1/geo1:ty”)

10・シーンを再生して結果を確認します

boxオブジェクトが、マウスが動いたとおりに移動するのが確認できます。

11・ペンタブレットをお持ちの場合

Mouse CHOPのUse Tabletをオンにして、同様の操作をすることで、筆圧やペンの傾きなどを検知し、記録できる事がわかると思います。
Pressure CHOPチャンネルを boxオブジェクトのUniform Scaleパラメータにアサインすると楽しいかもしれません。


■データ入力手順のまとめ

これが外部入力系のCHOPを使うワークフローの基本的な手順です。
手順をまとめると以下のようになります。

1・外部入力を受け付けるCHOPを作成
2・CHOPにデータの窓口となるCHOPチャンネルを作成
3・任意のパラメータからchop関連のエクスプレッション関数でCHOPチャンネルのデータを参照する

これはその他のデータ入力CHOPを使った場合も同様です。
これだけ理解できれば、あとは応用して色々できるはず。


■Keyboard CHOPチュートリアル

Mouse CHOPに続いて、Keyboard CHOPチュートリアルです

1・CHOPコンテキストにCHOP Networkを作成します

2・CHOP Network内にKeyboard CHOPを作成します

3・Keyboard CHOPの設定をします

Name 1

どんな名前でもいいのですが、ここでは [key_a] と記入します。

Type 1

そのままにします。

Type 1の右側にあるプルダウンメニュー

 [A] を選択します。

同様に、Name 2~Name 4まで、それぞれ同様に s,d,w キーを割り当てます。


4・Interceptモードをオンにします

キーボード上にあるScroll Lockキーを押し、Interceptモードをオンにします。

現在時間がオレンジ色になります。

5・キーを押して反応を確かめます

 a,d,wを同時押しした様子

あとは、Mouse CHOPのチュートリアルと同じ方法で、下流にRecord CHOPを繋いでレコーディングできます。

Interceptモードではキーボード入力が無視されるのでマウスでシーンの再生ボタンを押してください。

chopエクスプレッション関数による値の取得も同様に行えます。


■MIDI In CHOPチュートリアル

最後に、MIDI In CHOPを使用してMIDIコントローラから入力するチュートリアルです

1・CHOPコンテキストにCHOP Networkを作成します
2・CHOP Network内にMIDI In CHOPを作成します

3・MIDI In CHOPの設定をします

・Sourceタブ

MIDI Source : MIDIIN2 (Launchpad Pro)
MIDI Channels : 1

※MIDI Sourceは、各々がお持ちのMIDIデバイス名を選択してください。

・Noteタブ

Note Scope : 0-127
Aftertouch Name : af

4・鍵盤を叩き、反応を確かめます

・ch1n60 (音階で言うとど真ん中の[ド])を押したところ

今回使用したLaunchpad Proはアフタータッチ対応のMIDIコントローラなので、打鍵後に鍵盤を更に押しこむ事でafチャンネルを変化させることができます。

あとは、Mouse CHOPのチュートリアルと同じ方法で、下流にRecord CHOPを繋いでレコーディングできます。

chopエクスプレッション関数による値の取得も同様に行えます。


■おわりに

今回ご紹介したテクニックを使うことで、直感的なデータ入力ができるようになります。

例えば、特定のキーを押したタイミングでパーティクルを発生させたり、ジオメトリの頂点カラーを変化させたり、キーボードを叩くたびに乱数のSeed値を変化させて、次々と予想だにしないビジュアルを作り出すこともできるでしょう。

また、キーを押す強さが強いほどパーティクルの発生量を多くしたり、色を濃くしたりと言った、複雑な表現もできるようになります。

Joy To Keyのようなツールを併用することで、手に馴染んだゲームコントローラを操作してHoudiniへのデータ入力を行うことも簡単にできます。

また、今回はNetwork CHOP や Pipe In CHOPは使用しませんでしたが、これらも使いこなせばなかなかに楽しいことができそうなCHOPなので、いずれ折を見て記事にしたいと考えています。

ここまで読んでいただき、ありがとうございました。
何か不明点や間違いがあれば、記事へのコメントやTwitterなどで質問、ツッコミください。


■おまけ

以降は、今回使用したCHOPのマニュアルみたいなものです。


■マウスからの入力 : Mouse CHOP

マウスのカーソル位置を取得することができます。
タブレットを使用している場合は、筆圧やペンの傾きなども取得できます。

・PositionX/Y

ここで指定した文字列が、それぞれに対応するCHOPチャンネル名になります。
画面左下から右上に向かって値が増えていきます。
Xの範囲は-1~1、Yの範囲は-0.8~0.8

・Use Tablet

オンにするとPressureやAngleなど、タブレット向けパラメータが有効になります。
PositionX/Yと同様、ここで入力した各文字列が、それぞれに対応するCHOPチャンネル名になります。


■キーボードからの入力 : Keyboard CHOP

指定したキーが押されたとき、Typeで指定した方法で値を入力します。

このノードを動作させるためには Interceptモード をオンにする必要があります。
Interceptモードをオンにするには、Scroll Lockキーを押しScroll Lockを有効化します。

Interceptモードが有効になると現在フレームがオレンジ色に着色されます。
この状態でキーイベントを取得するよう設定したキーを押すことで、値が入力されます。

・Modifier Keys

使用する修飾キーを指定します。

上記画像の例では、[A]を押している間だけCHOPチャンネル[a1]の値が1になります。

・Name

対応するキーが押されたときにオンになるCHOPチャンネル名を指定します。

・Type

キーを押したときの動作

Momentaly:押しているときだけ1を送出
Toggle:押すたびに0と1を切り替え
Count:押すたびに1ずつ値が増える
Pulse:押した瞬間だけ1を送出
Time:シーン再生中にキーが押され続けた時間

・Key

このチャンネルに値を入力するキーを選択


■MIDIデバイスからの入力:MIDI In CHOP

MIDIキーボードやフェーダーコントローラなどを使用して、Houdiniに外部から直接MIDIデータを入力することができます。
また、MIDIファイルを直接読み込む事もできます。

・Sourceタブ

MIDI Source

MIDI信号の入力ソースを指定します。
MIDIファイルやMIDIデバイスを選択できます。
インタラクティブな入力を行いたいなら、接続済みのMIDIデバイス名を選択します。
すでに作られた楽曲などを入力したいならMIDI Fileを選択します。

MIDI Channels

入力するMIDIチャンネルの番号を指定します。

入力するMIDIチャンネル数が多いと入力データの転送に時間がかかります。
例えば、使用するノート番号の範囲が0-127の場合、使用するMIDIチャンネル1つごとに128個のデータを解釈することになります。
そこでアフタータッチをポリフォニックモードで解釈させるとなると、さらに128倍の負荷がかかります。
そのため、インタラクティブに操作したい場合は入力するMIDIチャンネルを一つに絞ったほうがいいと思います。
複数のMIDIチャンネルを入力するのは、MIDIファイルを入力する時のみで良いでしょう。

入力を許可するMIDIチャンネル番号は以下のように指定できます

・スペース区切り(個別指定)

1 2 10 11

・ハイフンでつなぐ(範囲指定)

1-10

Channel Prefix

入力するMIDIチャンネル番号を識別するために付加される接頭辞を指定します。
ここで指定した文字列のあと、入力されたMIDIチャンネル番号が付加されます。
この値が[ch]の時、CHOPチャンネル名は以下のような書式になります。

ch1
ch2

Echo Messages to Textport

オンにすると、受信したMIDIメッセージの内容がHoudini Consoleに表示されます。
デバッグに便利なので必要に応じてオンにします。

・Recordタブ

レコーディングには、MIDI In CHOPの下流に接続するRecord CHOPを使用するので、ここでは何も変更しません。

・Noteタブ

主にMIDIコントローラの鍵盤部分とピッチベンドコントローラからの入力信号の解釈方法を決定するタブです。

・チャンネル名パラメータ

チャンネル名パラメータは、対応するMIDI信号を受けとるCHOPチャンネルを作成します。

Note Name : ノートナンバー
Velocity Name : ノートのベロシティ
Aftertouch Name : ポリフォニックキープレッシャー
Pressure Name : チャンネルプレッシャー
Pitch Wheel Name : ピッチベンド

ここで指定した文字列が、MIDIチャンネルを示す文字列のあとに続きます。
例えば、Note Nameの値が[n]なら、MIDIチャンネル1のノート番号60の値を受け取るCHOPチャンネル名は以下になります。

ch1n60

これらのCHOPチャンネル名パラメータに何か文字列が入力されると、その時点でCHOPチャンネルが作成され、データの入力待ちが開始されます。
使用しないMIDI信号の入力については負荷軽減のため何も入力しないのがベターです。

Note Scope

入力を受け付けるMIDIノートナンバーの範囲を指定します。
0-127の範囲が使えます。
Sourceタブの MIDI Channels と同様の書式で指定できます。

Note Output

・One Multiplexed Channel

ノート信号を番号ごとに分けず、一つのチャンネル内で押されたノート信号をすべてまとめて使用します。

この時、CHOPチャンネル名にノート番号は付かず、以下のような名前になります。

ch1n : チャンネル1のノートすべて

・Separate Channels

ノート信号をノート番号ごとに個別のチャンネルとして入力します。
この時、CHOPチャンネル名は以下のようになります。

ch1n60 : チャンネル1のノート番号60番
ch1n127 : チャンネル1のノート番号127番

Velocity

MIDI Note信号のVelocityをどのように受け取るか指定します。

・Off

Velocityを入力しません
ノートを入力するCHOPチャンネルの値はオンオフの2値になります。

・Note Amplitude

ノートを入力するCHOPチャンネルの値が、Velocityの値になります。

・Separate Channels

Note信号の値はオンオフの2値になります。
同時に、Velocityは次のVelocity Nameで指定された接頭辞とノート番号で表されるCHOPチャンネルの値として取得されます。

Normalize

入力されるVelocityデータの値の範囲を指定します。

・None

値は 0-127 の範囲で入力されます。

・0-1

値が 0-127 を 0-1 にマッピングした状態で入力されます。

・Controlタブ

MIDI CCメッセージに関する解釈方法を決定するタブです。
MIDIキーボードにスライダやツマミが付属している場合がありますが、そのような鍵盤以外のコントロールから送信されるデータに関する入力設定です。

・チャンネル名パラメータ

チャンネル名パラメータは、対応するMIDI信号を受けとるCHOPチャンネルを作成します。

Controller Name : CCメッセージ
Program Change : プログラムチェンジメッセージ

Controller Type

一般的なMIDI音源やDAWなどで共通してMIDI CCメッセージへ割り振られているコントロールを、わかりやすくプルダウンメニューから指定できます。

Controller Index

取り扱うMIDI CCメッセージのコントロールナンバーを直接指定します。
0-127の範囲が使えます。
Sourceタブの MIDI Channels と同様の書式で指定できます。

Controller Format

・7 bit Controllers

扱うCCメッセージがLSB/MSBに対応していない場合はこちらを選択します。

・14 bit Controllers

扱うCCメッセージがLSB/MSBに対応している場合はこちらを選択します。

Normalize

入力された値の範囲をリマップします。

・None

リマップしません

・0 to 1

0~1にリマップします

・-1 to 1

-1~1にリマップします

・On / Off

ブール値化します

Unwrap

これはちょっとよくわかりませんでした。
ラベルから察するに、ターンテーブルのような値をインクリメント/デクリメントするコントローラ向けに、値が0-127の範囲外にセットされたときに値をループさせるか否かを決めるオプションのような気がします。

 ・Sysタブ

MIDIクロックメッセージやシステムメッセージに関する解釈方法を決定するタブです。
今回は、手元で検証できる環境がないので端折りますが、この辺をちゃんと設定すれば外部のDAWとHoudiniの間で内部時間や、再生操作や停止操作などを同期できるはず。

Houdiniセミナーおさらい – サンプルhiplcファイルあり

先日、「Houdini プロシージャルモデリングテクニカルセミナー」が開催されました。

セミナー中に、CG World 2016年09月号のHOUDINI Cook Bookで掲載された作品「Spine」がどのように作られたかを、著者の秋元氏が自ら解説するという貴重なセッションがありました。

そこで感銘を受け、自分なりの解釈も踏まえつつ真似してみたくなり、早速作ってみました。
記事と解説をすべてトレースするのではなく、VOPで処理されていた場所をVEXで処理するなど、ちょっとだけアレンジしています。
シェーダーまでは手を付けられなかったので、簡易モデルと動きのみです。

今回は実験的に、Houdini Indie 15.5.523 で作成した hiplcファイルを公開してみます。
ファイルには、簡単なモデルと本体モデルとシリンダーの挙動を組み込んであります。
時間経過に伴いウネウネ動く仕込みもしてあるので、再生してみると楽しいかもしれません。

■ダウンロード(One Drive)
MYAM_imitation_spine_hiplc

Houdiniのforループを理解する

■ループの種類と用途

  1. forループ
    入力したジオメトリデータ全体を対象に、複数回の処理を繰り返し行う

    (例)
    Copy SOPで複製されたジオメトリ全体を対象に、Mountain SOPの処理を累積的に10回行う。

  2. for-eachループ
    入力したジオメトリ内の個別のピースに対し、同一の処理を行う

    (例)
    複数のグループを複数含むジオメトリデータから、特定のルールにマッチするグループを1つずつ個別に取得し、個別にバウンディングボックスに置き換える。

  3. Fetch FeedbackとFetch Pieceの組み合わせ
    ループに入力されたジオメトリに対し、別の入力されたジオメトリのピースを使って反復的かつ累積的に処理を行う事ができる。

    (例)
    穴あきチーズ
    複数の気泡オブジェクトを入力し、気泡オブジェクトのピースごとに、チーズの本体に累積的に繰り返し削り取る。


■forループ

Tab -> For loop

オレンジ色に囲まれた部分がforループのブロック

MountainSOPを挿入しHeightを0.1に変更
Block EndのIterationパラメータを変化させると、各ボックスが累積的に変形することが確認できる。

※同じ設定のMountainSOPで同一の処理を累積的に10回繰り返すことと同じなので、CopySOPの下流にMountainSOPを10個作って直列で繋げても同じ結果が得られます。


■for-eachループ

Tab -> For-Each loop

ピース単位の処理。
ピースは、ピースを表現するアトリビュート(通例では@name)の値の同一性により表現される。

For-Each loopを作成した直後は、上流に@pieceや@nameがないためにエラーが出る場合がある。このような場合は、自分でアトリビュートを作成する。

Voronoi Fracture SOPなど、自動的に@nameを作るSOPもある。
Voronoi Fracture SOPのデフォルト設定では、破片ごとにPrimitiveクラスの@nameを作成し、piece+番号の命名規則で各Primitiveが所属するピースを表現する。

@name以外のアトリビュートを使用してピースを表現したい場合は、Block End SOPのPiece Attributeを変更し、任意のアトリビュート名を指定する。

CopySOPで複製したBoxをVoronoi Fracture SOPで分割

For-Each loopにより、各破片のピースをバウンディングボックスに置き換え


■Block Begin SOP

・Methodパラメータ

  1. Fetch Feedback
    累積的に処理を行う場合に選択。
    ループが行われる度、前回のループで出力された結果を現在の処理対象としてフィードバックし、再Fetchする。
  2. Fetch Piece
    入力されたジオメトリ内のピースごとに処理を行う場合に選択。
    ループ毎に、認識されているピースの中から新たなピースがFetchされる。
  3. Fetch Metadata
    現在のループに関する情報をDetailsアトリビュートに持つジオメトリを作成する。
    detail関数を使ってこれらの値へアクセスし、ループ内で使用することができる。

・Block Pathパラメータ

このループの終点を示すBlock End SOPへのパス

・Create Meta Import Node

Metaデータを持つBlock Begin SOPを作成する。
この実態は、ModeがFetch Metadataに設定され、Block Pathが現在のループの終点にセットされているBlock Begin SOP。


■Block End SOP

・Gather Method

  1. Fetch Each Iteration
    ループが終わるたびに結果を再Fetchする
    ループのBlock Begin SOPでMethodがFetch Feedbackの場合に使用する。
  2. Merge Each Iteration
    ループ毎にジオメトリを記録し、最後に結合する。
    ループのBlock Begin SOPでMethodがFetch Pieceの場合に使用する。
    ピースは個別に処理され最後に結合され、結果として出力される。

・Iterations/StartValue/Increment

ループ回数の指定
一般的なforループで使用する変数

・Python風に書くならこんな感じ
for i in range(startValue , iterations , increment):


■Block Begin SOP – Fetch Feedback と Fetch Pieceの組み合わせ

あるジオメトリに対し、別のジオメトリを使って複数回の処理を累積的に行う事ができる。
Block BeginのヘルプにあるSwiss Cheeseサンプルでは、チーズ本体のVDBオブジェクトを一つと、気泡のVDBオブジェクトを複数入力し、チーズ本体オブジェクトを気泡オブジェクトごとに削り取る処理を行う。

  1. チーズ本体のジオメトリを作成
  2. 気泡ジオメトリを作成
    SphereSOPをPolygonなどではなくPrimitiveモードで作成。
  3. Scatter SOP + Copy SOPでチーズ表面に気泡をばらまく
  4. For loopを作成
  5. チーズ本体を受け取るBlock Begin SOPの設定を確認
    Methodパラメータ:Fetch Feedback
    Block Pathパラメータ : Block Endへのパス
  6. 気泡を受け取るBlock Begin SOPを追加
    Block Begin SOPを作成後、以下のパラメータをセット。
    Methodパラメータ : Fetch Piece
    Block Pathパラメータ : 1で作ったBlock Endへのパスをセット
  7. Block End SOPを確認
    Iteration Method:By Pieces(またはAuto Detect from Inputs)
    Gather Method:Feedback Each Iteration
    Piece Elements:Primitive
    Piece Name:オフ
    Default Block Path/Piece Block Path:Block Begin

 


■Block Begin SOP – Fetch Metadataの使い方

  1. Block Begin SOPを作成
    Method:Fetch Metadata
    Block Path:末端のBlock End SOPへのパス

・Detailsアトリビュート

  • numiterations
    最大のループ回数
  • iteration
    現在のループ回数
  • value
    Pieceループ時、現在ループ中のピースを識別するためのアトリビュート値。
  • ivalue
    valueの整数版。
    valueがfloatの精度範囲を超える場合などに使う。
    特別な理由がなければ普段はこっちを使うのがよさそう

・Metadataを取得する

ループ内でdetailエクスプレッション関数を使う。

  1. detailエクスプレッション関数を使う
    detail(“../foreach_begin1_metadata”, “iteration”, 0)
  2. detail VEX関数を使う
  3. Import detail attribute VOPを使う
  4. Pythonで取得する
    node(“../foreach_begin1_metadata”).geometry().attribValue(“iteration”)

■ループの停止条件

Block End SOP の Stop Condition を1にセットすると強制的にループを終了できる。


■デバッグとテストループ

・Feedbackループの場合

Block End SOP の Max Iterationsパラメータで最大ループ数を設定できる。
数回のループだけである程度結果が判断できる場合は、このパラメータを有効化することでループ処理を制限し、素早く調整が行えるので便利。

・Pieceループの場合

Block End SOP の Single Passパラメータでピース番号を指定して、ピースごとの処理結果を確認できる。


■グループからピースを作成する

グループパラメータを使ってピースを作成したい場合は、Name SOPを使用して@nameを作成し、グループ名をセットしておく。


何か間違いがあれば突っ込んでいただけると嬉しいです

Fabric Engine 2 プラグインをMayaへ導入する

ふと気が付くとFabric Engine 2.0 がリリースされていたので、導入方法をメモしておきます。
やり方はほとんどバージョン1.15.3と変わらず。ライセンス入力あたりだけが大きく違います。

説明が急ぎ足なので、後で加筆修正するかも。


■Fabric Engine サイト

http://fabricengine.com/


■ダウンロードリンク

以前のようにEvaluation Lisenceのダウンロードリンクはありません。
ライセンスは後から取得し入力します。

FabricEngine-2.0.0-Windows-x86_64.zip
約500MB程度。ダウンロードを待ち、完了させます。


■解凍とコピー

ダウンロードが完了したら、zipファイルを解凍します。
解凍してできたフォルダ「FabricEngine-2.0.0-Windows-x86_64」は、C:\Program Filesの直下に置きました。


■ライセンスの取得

再びダウンロードページに戻り、ページ下部にある評価ライセンス請求フォームへ記入し、送信します。


送信が完了すると、ライセンスコードが表示されます。

このライセンスコードを保存しておき、あとでFabric Engineのライセンス登録フォームに記入します。


■Maya.envの編集

・以下を追加
MAYA_MODULE_PATH=C:\Program Files\FabricEngine-2.0.0-Windows-x86_64\DCCIntegrations\FabricMaya2014;


■Maya起動とプラグインのロード

ロードが完了すると、メニューに「Fabric」が追加されます。


■ライセンスの入力

ちょっと曖昧ですが、初回のプラグインロード時か初回のグラフ作成時にライセンス入力を求められるので、以前の手順で入手していたライセンスコードをコピーペーストして認証を完了させます。


 

■グラフを作ってみる

Fabricメニュ- → Create Graph

今バージョンから、メインで使用するノードタイプがcanvasNodeに変更されたようです。

Open Canvas ボタンを押します。

その他のノードベースツールで定番の操作、TABキーを押し、ノード名の一部を入力することでインテリセンスを使用して任意のノードを簡単に作成できます。

また、左右端のスライドバーをドラッグすると、ノード一覧が表示されます。
サブカテゴリを開き、キャンバス内にドラッグしてノードを追加できます。

ポートの追加は、左右の入出力ポードリストを右クリックし、Create Portを選択して行えます。

Houdini – PBRの基本

Phisically Based Renderingの準備

・Mantraノードを作成

Properties -> Renderタブ -> Redering Engine パラメータを PBR系のものに指定。

ただのPBRはレイトレースを使用するPBR。
Samplingの値など、Micro PolygonのPBRとは、値の扱い方が変わるので注意。

・カメラを作成

レンダリングのため、カメラを作成する。

・ライトを作成

PBRシェーダ

見たところ、Material Paletteに標準で登録されているマテリアルは、ほとんどがMaterial Shader Builderにより作られている。
また、マテリアル内部ではSurface Modelを使用していることが多いので、だいたいPBRにそのまま使用できるようだ。

試しにGlassなどを球体にアサインしてレンダリングすると、それだけでもそこそこにリアルだったりする。

20140518_02_0

部分レンダー

Render Viewで、部分的にレンダリングしたい範囲をShift+ドラッグ

Inspect individual pixel values

Render View内でIキーを押すと、ピクセル解析ツールの有効をオン・オフできる。

20140518_02_1

ValPixel values in 0-1 form.

Raw

Raw pixel values, as they are stored (0-255 for 8 bit values, 0-65535 for 16 bit values, and so on).

HSL

Hue, saturation, and luminance of the pixel.

Pix

Pixel coordinates of the mouse pointer.

uv

UV (0-1) coordinates of the mouse pointer.

LUT

Only displayed if the Inspect LUT option on the Correction tab of the display options window is on. Shows a reverse mapping of the value through the LUT. This is useful for Cineon LUTs, to see the original Cineon numbers.

SpecularとRefrection

見たところ、Houdiniの物理ベースシェーダのパラメータは、ゲーム業界で読んでいるパラメータとは違う名前を使用している場合があるようだ。

・RefrectionとSpeculer

Refrectは反射全般をくくる言葉。この中に、表面の滑らかさや反射率などを決めるSpecularパラメータを含んでいる。

・Specular Intensity

素材そのものの反射の強さ。
メタル系の素材は非常に高く、それ以外は非常に低い値。

・Specular Angle

材質表面の粗さ。
表面が滑らかであるほど低く、ザラザラしているほど高い。

・Specular Anisotropy

異方性反射の方向。
Specular Angleによってぼやける反射光が跳ね返りやすい方向を決める。

PBRでは、これらの質感の特性を現実世界の物体に合わせ、正確な特性値(反射の強さやもともとオブジェクトが持っている色(アルベドカラー、表面の目に見えないレベルの細かな凹凸など)を使用し、現実世界のものの見え方をシミュレートする。

そのためには、シェーダーだけでなく、ライト(カラーや強さを表すルーメン)やカメラの絞り、露光など、レンダリングに関わる全ての要素をPBR向けに最適な設定で使用する必要がある。

明るすぎるピクセルの補正

レンダリングすると集光現象などの結果、非常に高い輝度値を持つピクセルが生成されることがある。

20140518_02_3

これを補正するためには、Color Limitパラメータを使用して各ピクセル内の値の上限値を決める。

20140518_02_2

※やり方が悪いのか、効果が出ない・・・バージョン違いによる差が本当に厄介。チュートリアルで示されたオプションが無かったり、手動で追加しなければいけないはずなのにすでに追加されていたりする。

ノード名もかなり変わっているし、結構辛い。

Houdini – ZDepth Passes

ZDepthパスの作成

・Image Planeを作成

MantraノードにてZDepthパス用のimage Planeを作成。

Mantraノード -> Propertiesタブ -> Outputタブ -> Extra Image Planes

+ボタンでイメージプレーンを追加し、VEX VariableパラメータでPzを指定。
Quantizeは最も高精度な32bit Floatにしておくのがいい。

以降のレンダリングで、同時にZDepthパスがレンダリングされるようになる。

20140510_01_1

ZDepthパスの確認

MPlayやRender Viewで、表示するパスを切り替える。

20140510_01_2
Render View

20140510_01_3
MPlay

20140510_01_4

ZDepthパスの最適化

アンチエイリアスがかかった画像に対するZDepthパスイメージは、カラーパスイメージと同様にアンチエイリアスがかかっているため、正しくない深度情報になっている。

また、Depthパスのアンチエイリアス処理は、コンポジットの段階で処理するのが最も柔軟に扱えるので、ZDepthパスだけアンチエイリアスをオフにしてレンダリングする。

・Image Planeの設定

Sample Filter=Closest Surface
Pixel Filter=Closest Sample Filtering

この設定でアンチエイリアスがオフになるはずだが、ならない・・・とりあえずこのまま進める。

ZDepthパスをimgコンテキストで利用

・大枠のimgコンテキストでの作業フロー

fileノードを使用してファイルを読み込み、必要に応じて各種ノードを接続し、画像合成を進める。

使用するビューは Composite View

Composite Viewも、Render ViewやMPlayと同様の操作で表示チャンネルの切り替えなどが行える。

・imgコンテキストのノード

imgコンテキストのノードは、上に入力コネクタ、下に出力コネクタ、左にマスク入力コネクタを持つ

マスクはその他のコンポジットソフトのように、エフェクトの強さを操作するといった場合に使える。

・ZDepthパスの使用準備

画像読み込み
20140510_01_5

深度情報を使用する処理を行う際は、まずDepth of Field(DOF)ノードを作成し、以降の処理で使うマスク画像を生成する。

20140510_01_6

マスク画像はチャンネル名[M]になる。

20140510_01_7

このマスク画像は、DOFノードを有効化し、Mチャンネルを表示して確認できる。
Mチャンネルを表示しながら焦点の設定を行うと作業しやすい。

・Focus Distance パラメータ

焦点距離

カメラからの各サンプリングポイントへの距離は、そのままZDepthパスのピクセルに焼きこまれる。

焦点をあわせるポイントのおおよその距離を知りたいときは、Pzチャンネル表示中にIキーを押して各ピクセルの情報を見られるようにし、焦点を合わせたいピクセルの深度を調べる。

20140510_01_8

この例では、8.2239がそのピクセルが持つ深度の値。

・Depth Adjust

焦点の合う幅。

・Distance Adjustment

焦点距離と焦点のドロップオフを調整できる。(挙動を見る限り、焦点距離がわかりにくくなりそうなので、極力使いたくない)

・Default Mask Value

ZDepth情報を持たないピクセルが持つ値を指定。

Fake DOF

Depth Of Fieldから出力されるマスク画像を、DefocusノードのMaskに入力することでDOFエフェクトをかけられる。

その際、DefocusノードのMaskタブで、マスクに使用するチャンネルをMに指定して、入力されたMaskチャンネルを有効化する。

・Defocus

ぼかしの強さ

・Defocus Shape

シャッター形状

・Per-Pixel Defocus

どう動作しているか不明だけど、これがオンになっていないと、画像にかかるブラーがただのブラーになっており、レンズボケというよりは画像をにじませただけの状態になる。

↓Per-Pixel Defocus オフ
20140510_01_10

↓Per-Pixel Defocus オン
20140510_01_9

Fog

Defocusと同様にFogノードを使用してフォグを追加できる。

Houdini – Mantra Micropolygon Rendering

公式のレンダリング解説

http://sidefx.jp/doc/rendering/

Mantraノードリファレンス

http://sidefx.jp/doc/props/mantra.html

マイクロポリゴンレンダリングの流れ

書籍「Advanced Renderman」6 Photorealistic Rendermanの項が詳しい解説を行っている。

マイクロポリゴンの良い解説があった
http://www.ousam.com/blog/2010/05/03/617

SideFXの解説
http://sidefx.jp/doc/rendering/understanding.html

レンダリング時の流れは以下のとおり

・Split Process

Bucketと呼ばれるサイズにオブジェクトを分割。
デフォルトでは、16×16ピクセルのグリッドで分割が行われる。

・Dice Process

Split後、各Bucketが画面に含まれるか判定後、各ポリゴンを1ピクセルに収まるサイズまで再分割する。
どのようなタイプのGeometryからでも、最終的に1ピクセルに収まる4頂点のポリゴンが生成される。

・Displacement Shader

頂点移動

・Surface Shader

シェーディングが行われピクセルカラーが決定する

サンプリングコントロール

Mantraは、3つのサンプリングコントロールをもつ

・Pixel Sample(Mantraノード内)

1ピクセルに含まれる各マイクロポリゴンの数。
要はアンチエイリアスのサンプル数と捉えて良さそう。
多くすると、よりスムースな結果が得られる。

↓サンプリング数 1 1
20140510_02_0

↓サンプリング数 3 3
20140510_02_1

・Dicing(Geometryノード内)

Geometryノード -> Renderタブ ー> Dicingタブ -> Shading Quality
ピクセルに含めるマイクロポリゴン数。オブジェクトごとに設定できる二次的なサンプリングコントロール。
オーバーサンプリングのための設定と言えそう。
本質的には、1ピクセルに含まれるマイクロポリゴンに対して呼ばれるシェーダ処理の回数。

・Ray Sampling(Mantraノード内)

リフレクション計算のサンプリング数

Houdini – CHOP

https://vimeo.com/7488503

時間差キーフレーム

このチュートリアルでは、カーブが持つポイントに対し元のオブジェクトが持つキーフレームを時間差で写しこむ。

ベースになるキーフレームを作る

動きのテンプレートとなるキーウを作成する。
適当なオブジェクトを一つ作り、通常通りキーを打つ

20140510_03_5

配置先を作る

カーブでもパーティクルでもいいので、Copyでオブジェクトを散布できるようにしておく

20140510_03_6

素のモーションを受け取るAttributeを作成する

キーフレームを時間差コピーする先のオブジェクト内に、Attrib Createでモーションを直接ch関数を使って受け取るAttributeを作っておく。

この例では、以下の様なAttributeを作った

20140510_03_4

Value
ch( “/obj/base_object/tx” )
ch( “/obj/base_object/ty” )
ch( “/obj/base_object/tz” )

Pointノードを作る

直後にPointノードを作成しコネクト。
このポイントのデフォルト値に対して、ベースになるキーフレームをchコマンドを使って足し合わせる。
値を加算しないと、あくまでもキーフレームはローカルの値でしかないため、原点で動くことになる。

20140510_03_7

Position
$TX + ch( “/obj/base_object/tx” )
$TX + ch( “/obj/base_object/ty” )
$TX + ch( “/obj/base_object/tz” )

CHOPに移動値を出力するためのnullを作成

20140510_03_3

TO_CHOPから出力を行う

CHOP Networkを作成

20140510_03_9

20140510_03_8

CHOP Network内でGeometryノードを作成

CHOP Network内に Geometryを作成。
設定は以下のように行う

SOPでキーフレームを含むノードパスを指定
MethodはAnimatedにする(動いているので)
Attribute ScopeでおやAttribute名を入れる?
Rename Scopeで子Attribute名を入れる?

正しくキーフレームが読み込めれば、ノード中ボタンクリックなどで見られる情報ポップアップウインドウで、tx0,tx1…という形式で表示され、各アトリビュートの値が配列で取得できた事がわかる。

20140510_03_0

※ここでの表示数は制限があるので、すべてのキーフレームが表示されるわけではない。

Reorderノードを作成

MethodをNumeric Suffix Sortにする

情報ポップアップウインドウを見ると、Attributeの並びが変わったことがわかる。

20140510_03_1

Motion View

キーフレームなどを設定するためではなく、ただモーショングラフを見て解析するためのビューのようだ

20140510_03_2

Shiftノードを作成する

Shiftノードは、入力されているモーションのチャンネル全体のタイミングをそのままずらす事ができる。

・Scroll Offset

Expressionを仕込むことで、チャンネルごとにずらすことができる。
チャンネルを表すローカル変数は $C

floor( $C / 3 ) * 0.1

3は、1組のチャンネル数

Delayノード

Delayノードは、アニメーションのタイミングを遅延させる。
このチュートリアルで登場したけど最終的には使わなかった。

Channel ノードをGeometry内に作る

CHOPに、さっき作ったCHOP Network内のCHOP_OUTノードへのパスを入力。

・Method

Animatedにする

・Channel Scope

t[xyz] という書式で入力

・Attribute Scope

P

20140510_03_11

各Channelのタイミングをランダマイズする

CHOP_OUTの前にStretchノードを挿入

・Length Scale

rand関数を使ったExpressionを仕込む

rand( $C )

20140510_03_10

Houdini – Shading & Lighting

https://vimeo.com/7612942 – Houdini10以前対応

よく見たら、上記チュートリアルのリンクはHoudini10以前バージョン対応らしい。なので、流し見程度にしておき、Houdini11以降用のチュートリアルで改めて学習する。

https://vimeo.com/14092187 – Houdini11以降対応

シェーダープログラミングは経験したことがない。
そもそも、レンダリングの仕組み自体中途半端にしか理解していない。

HoudiniではVOPでシェーダを一から組み立てられるので一からシェーダ言語を学習するより簡単なはず。

ちょうどいい機会だし、Houdiniとともにかなり基本的なところから勉強してみようとおもう。

VOPノードの操作について

20140506_01_16

左から順に、Debug/ByPass/Display Mode
マニュアル

  • Debug
    Debug Modeをオンにして、出力プラグ上でAlt+右クリックすると、以下のポップアップメニューが表示され、Execute/PopeThrough/Constantが選べる。Execute:通常通り処理させる
    Pipethrough:入力値をそのまま次のノードに渡す
    Constant:指定した値を定数として次のノードに渡す。20140506_01_17

    Execute以外を選ぶと、どのような値を出力するか指定するためのダイアログが開く。
    20140506_01_18

    このダイアログの中では、任意の値を入力できる。
    また、どの入力値をスルーして出力に回すか指定することもできる。

  • ByPass
    入力値をそのままスルーして次のノードに渡す。
    ただし、すべての入出力の型が一致するわけではないため、Debugモードと同じようにAlt+右クリックで出力される値の方などを設定する必要がある。
  • Display Mode
    押すたびに表示するパラメータの数を変更できる。

・インプットコネクタのCollapse

各コネクタを中ボタンクリックし、Collapse Input Connectorを選択すると、コネクタリスト最下部のMoreの中に集約することができる。

・インプットコネクションのHide

コネクタ中クリックから Hide Input Nodesを選択すると、インプットコネクションをまとめて非表示にできる。

20140506_01_19

マテリアルとシェーダ

・マテリアル

シェーダネットワークの入れ物。
広義ではマテリアルもシェーダと呼ばれたりする。

・シェーダ

物体の見た目を決めるための計算方法を定義するもの。
シェーダにはいくつかの種類がある

  • 頂点シェーダ
    レンダリングされるオブジェクトの形状(頂点の位置)を決定するためのシェーダ。
    多分、VOP上では直接触らないものだと思う。
  • サーフェスシェーダ
    ライトに絡む計算を行うシェーダ
    Lighting ModelやSurface Modelノードがこれを担当
    ピクセルシェーダ処理で使われる。
  • ピクセルシェーダ
    レンダリングの最後に、各ピクセルを生成するためのシェーダ。

マテリアルの作成

・Network View

TABキーからマテリアルノードを作成

・Material Palette

Material Paletteで、作成したいマテリアルを左のツリービューから、右のマテリアルリストへドラッグして作成する。

かなりザックリとレンダリングパイプライン

  1. 頂点シェーダ
    3Dオブジェクトを構成する拡張点を、レンダリング画像のどこに配置するかを決定する。
  2. ラスタライズ
    頂点シェーダによって平面に落とし込まれた3Dオブジェクトを各ピクセルに割り当てる。
  3. ピクセルシェーダ
    ラスタライズされた各ピクセルに対し、持たせるColorやAlpha、Depthなどの各チャンネル情報を計算する。

Global Variables VOP

20140506_01_0

※画像はチュートリアルから拝借、問題あれば消します

それぞれのパラメータは、各ピクセルに割り当てられたオブジェクト表面などの位置毎にサンプリングされる。

I:カメラからの視線ベクトル
L:ライトからの光線ベクトル
N:法線ベクトル
P:面上のパラメータ位置
dPds:面上のs方向のある一点?
dPdt:面上のt方向のある一点

Global Variablesノードは、VEXで処理を行うためのすべての入力値を持っている。
この入力値は、内部で設定するContext Typeにより変化する。

Global Variablesノードは、ひとつのマテリアル中にいくつでも含めることができる。

Surface TypeのGlobal VariablesノードのAttribute

Input Attributes

・Context Type

このシェーダノードが行う処理対象(コンテキスト)を指定する。Surface/Fog/Light/Displacement。

・Output a Single Variable / Variable Name

指定された変数のみを出力する。
複数のコンテキストから、必要な変数のみを入力して処理したい場合、不要な変数の表示は視認性を損なうので、このオプションを使うとよい。

Variavle Nameプルダウンメニューは、表示したいAttributeを選択するのに使う。

Output Attributes

よくわからない変数は未訳
※画像はRender Viewのキャプチャ。カラーのレンジはAdaptして見やすくしてある。
20140506_01_25

・Cf

サンプリングされた場所のカラー値

・Of

サンプリングされた場所の不透明度

・Af

サンプリングされた場所のアルファ値

・P

サンプリングされた場所のポジション。

20140506_01_2

↑PパラメータをSurface Colorにアサインしてレンダリング

・Pz

サーフェスのポイントが持つZ深度

20140506_01_3

↑PzパラメータをSurface Colorにアサインしてレンダリング

・I

カメラからの視線ベクトル

20140506_01_4

↑IパラメータをSurface Colorにアサインしてレンダリング

・dPds/dPdt

現時点ではよくわからないパラメータ。要調査

20140506_01_5
↑dPdsパラメータをSurface Colorにアサインしてレンダリング

20140506_01_6
↑dPdtパラメータをSurface Colorにアサインしてレンダリング

・N

カメラの視線ベクトルに対する各サンプリング点上の法線の法線ベクトル

20140506_01_7
↑NパラメータをSurface Colorにアサインしてレンダリング

・Ng

各面が持っている、ジオメトリ上の法線。
この法線はカメラに左右されない。

20140506_01_8
↑NgパラメータをSurface Colorにアサインしてレンダリング

・Eye

カメラの位置

・s/t

各フェース上のパラメータ空間座標。
20140506_01_1
↑sパラメータをSurface Colorにアサインしてレンダリング

20140506_01_12
↑tパラメータをSurface Colorにアサインしてレンダリング

・Time

Shading Time.
まだよくわからない、要調査

20140506_01_9
↑TimeパラメータをSurface Colorにアサインしてレンダリング

・dPdz

Change in Position with depth.
まだよくわからない。要調査

・SID

Sample Identifier. A sample id to be used with the nextsample() VEX function to generate consistent random samples that don’t change when re-rendering or between frames.
まだよくわからない。要調査

Output Variables and Parameters

Global Variablesノードが入力ノードであるのに対し、このノードは処理結果の出力を行う。

Global VariablesもOutput Variables and ParametersもContext Type属性を持っており、受け取りたい変数のタイプや、計算したい内容のタイプに応じてそれぞれセットする。

Textureの作成

・Textureノードを作成

とりあえず、Mandril.picがデフォルトでアサインされてるのでそのまま使う。

Materialをオブジェクトへアサインする

・Materialのパスを指定する

GeometryノードのMaterialタブから任意のマテリアルパスをセットする。

・シェーダをオブジェクトに直接ドラッグ

マテリアルノードをビュー内オブジェクトに直接ドラッグ

UVを有効にする

Textureノードをそのまま接続しただけでは、そのテクスチャを持つMaterialをアサインするオブジェクトがUV作成済みだったとしても、各面が持つP(s,t)を基準にテクスチャが貼られてしまう。

20140506_01_10
↑正しくUVが有効になっていない場合、各面にフィットするようにテクスチャが貼られる

正しくUVを有効にするために、UV Coordsノードを作成し、テクスチャノードのs,tにコネクトする。

20140506_01_11
↑PolerでプロジェクションしたあとでUV Coordを接続し、UVを有効化した

各パラメータ

・uv

uvwをまとめたベクトル

・u

定義済みのUVがあれば、マッピング時に参照する。
UVがなければ各面のsパラメータが使われる。

・v

定義済みのUVがあれば、マッピング時に参照する。
UVがなければ各面のtパラメータが使われる。

Mantra Surface マテリアル

Mantraでレンダリングする場合の標準マテリアル。
実態は、Material Surface Builderノードで、基本的なネットワークが構築済み。

テクスチャを貼る場合は、各マップの項目で、Use○○Mapをオンにしてテクスチャファイルパスを指定。

・Displacementタブ

  • True Displacement
    実際にオブジェクトを変形する。
・Refraction
屈折はオブジェクトの法線方向を間違えると正しく計算されない。法線に対向する方向から見る必要がある。・Caustics
Causticsは、Opacityタブから使用できる。

Environment Light

HDRイメージなどを使用して環境ライトを作成する際に使う

・Renderingタブ Rendering Mode

ライトのサンプリング方法を指定する。

  • Direct Lighting
    背景ライトオブジェクトは、実際のライトとして動作する。
    20140506_01_13
  • Ambient Occlusion
    20140506_01_14
  • Ray Tracing Background
    背景ライトオブジェクトは実際のライトとしてではなく、光を放出するオブジェクトとして扱われる。
    20140506_01_15

Surface Modelノード

以前は、表面の反射などをLighting modelノードで行っていたらしい。
このノードはそれを置き換えるために作られた高機能な万能シェーダらしい。

ライティングへの影響を含む物理的な性質をシミュレートすることができる。

物理ベースのレンダリングを行いたい場合は必須になると思う。

Output Collectノード

マテリアル内に作成された各種シェーダ情報を集約し、出力を行う。

プロシージャルテクスチャ

ノード作成メニューのPatternから、各種プロシージャルテクスチャノードが作成できる。

Promoteされたパラメータをまとめると便利

Promoteされたパラメータは、グループを作って管理したくなるので、Edit Parameter Interfaceを使って任意の位置にフォルダ(タブ)を作成し、まとめておくと管理しやすくなる。

20140506_01_20

レンダリング時に自動でSubdivideする

各Geometryノード内の以下のオプションを有効にする

20140506_01_21

Emissiveなオブジェクト

自ら光を放つオブジェクトはEmissiveなオブジェクトである。

・Emissionを有効にする

Mantra Surface マテリアル設定で、Emissionをオンにする。
同時に、Emission IntensityやEmission Colorなども調整する。

20140506_01_22

Light Linker View

Light Linkerを使えば、ライトとオブジェクトの関係性を定義できる。例えば、特定のオブジェクトのみ照らしたり、特定のオブジェクトのみ影を落とすなど。

20140506_01_23

操作できるのは以下の項目

20140506_01_24

左のペーンでライトを選び、右のペーンで関係をもたせるアイテムのみハイライトする。

・Light Mask
そのライトが照らすオブジェクトを指定する

・Shadow Mask
そのライトを受けて影を落とすオブジェクトを指定する

・Refrection Mask
あるオブジェクトが別のあるオブジェクトにリフレクション要素として映り込むかを指定する。

カスタムシェーダ作成の概要

Material Shader Builderの作成から始めると良い。

必要に応じて Global VariablesOutput Variables and Parametersノードを作成し、必要な出力を作るためのノードネットワークを形成する。

Houdini Surface Shader – VOP Basic

シェーダはSHOPコンテキスト内で操作する

20140505_01_2

シェーダの作成

・Material Palette

20140505_01_0

左側のプリセットを右側のブロックにドラッグして簡単作成

・Network View

TABキーからシェーダーノード名を指定。
Houdiniのバージョンアップに伴い、デフォルトのシェーダ名が変更されているケースが散見される。
最も基本的なシェーダは Material Shader Builder で良さそう。

VOPの基本

20140505_01_1

シェーダアイコンをダブルクリックするとシェーダーを定義しているノードネットワークに入れる。

VOPノード

VOP内のノード表示はこんな感じ

20140505_01_3

ノードの左右端にはノードのコネクト用プラグが並ぶ。

・パラメータ名

フルネームが表示したければPreferenceのNetwork Editorオプションから設定

20140505_01_4

・Nodeコネクション

プラグクリックでコネクタを伸ばし始め、コネクト先プラグをクリックで接続
肩は色分けされているので、ひと目で分かる。

違う型のAttributeを接続する場合は間に「Float To Vector」などの変換ノードを挟む。

基本的な使い方

各種ノードを作成し、それぞれの出力をAdd VOPなどのオペレーターを使用して計算し、最終的にoutputノードへ接続して結果を出力する。

ノードの自動作成

各種入力プラグを中ボタンでクリックすると、よく使うノード(場合によっては小さなノードネットワーク)を自動作成できるようだ。

20140505_01_8

特徴的なのはPromote Parameterで、Parameterノードが接続されたパラメータは、親のShaderノード内にExposeされ、VOPネットワークに入らなくても触れるようになる。

各種ノード

・Parameter

外から値を入力する窓口となるノード。
Parameterノードを作ると、親ノードの中にParameterノードと同じ設定のパラメータが作成される。
親ノード側のパラメータを操作することで、VEX内のノードに与えるパラメータを直接操作できるようになる。

ExportをAlwaysに設定すると、他のコンテキストからこのパラメータを参照できるようになる。
また、こうすることで、VEXネットワーク内で入力パラメータも持つようになる。

・Constant

定数ノード。Typeを指定して様々な型の定数を出力できる。

任意のプラグを中クリックし、ポップアップメニューからConstantを選択することで、そのプラグに接続された状態でConstantノードが作成できる。

・Add/Sub/Multiply/Divideなど

一般的な計算ノード

型の違うパラメータ同士を計算する際は、入力の順番に気をつける必要がある。

20140505_01_5

multiply1はvector型を先に受け取ったので、出力もVector型(ベクトル積)
multiply2はfloat型を先に受け取ったので、出力はfloat型(スカラー積)

※実際に値を表示する方法がわからないのでどのような計算結果が返るかは現時点では不明

・Random

名前の通りの動作。
入出力のタイプをノード内で決定できる。

20140505_01_6

※VOPノードはこのように、ノード内で入出力タイプを切り替えられる場合が多いようだ。

・Lighting Model

シェーダへのライトの影響タイプを定義するノード。Lanbertian/Blinn/Phongなど、古典的なLighting Modelを選択できる。

Lighting ModelパラメータでVEX Specularを選択することで、独自の光沢を作成することができる。

VEXのデータ型

Constantで作れるデータ型は以下のような感じ

20140505_01_7

3Floats/Vector/Colorや、int/toggleなどのように、似ているデータ型が複数存在する。
カッコの中に型名が記載されているので、この型が合っているプラグ同士であれば接続できる。