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などのように、似ているデータ型が複数存在する。
カッコの中に型名が記載されているので、この型が合っているプラグ同士であれば接続できる。

Houdini 基本を掘り下げる

ひと通り公式の基礎チュートリアルが終わったので、ヘルプ参照したり、ググりつつ基本を固めたい。

間違いを発見した時、遠慮なく突っ込んでいただけると喜びます。

用語

・コンテキスト

処理を行う状況や分野のこと。
ModelingやAnimationなど、処理を行う分野が分かれており、内部に作れるノードの種類も変わる。

20140504_01_0

・ch

信号処理を行う
主に扱うネットワークタイプは CHOP

・CHOP
Channel Operators
音声データや関数の組み合わせから波形を組み立てて、任意のパラメータに出力できる。

・obj

モデル、ライト、カメラなどシーンを構成するオブジェクトを処理する
主に扱うネットワークタイプは SOP/VOPなど

・SOP

Surface Operators
Surfaceオペレーションを行うノードのことを一括りにSOPノードなどと呼ぶようだ。(PolyExtrude SOPなどという書き方をよく見かける)
SOPに関しては、コンテキストの一種とは言い難いと思う。

・COP

Composite Operator
色調補正や画像合成を行える。

・DOP

Dynamics Operator
物理演算

・out

レンダリング画像やモデル、画像合成の結果などを出力する
主に扱うネットワークタイプは ROP

・ROP

Render Operator
レンダリング処理

・part

パーティクルの振る舞いを出力する
主に扱うネットワークタイプはPOP

・POP

Particle Operator
パーティクル処理

・shop

シェーディングに関する出力を行う
主に扱うネットワークタイプはSHOP

・SHOP

Shading Operator
カスタムシェーダの作成や3Dテクスチャの生成ができる

・vex

・VOP

VEX Operation
カスタムノード処理

ノードにコンテキスト名をつけて括る理由

例えばGroupノードは、同じ名前でSOP、DOP、VOPなど複数のネットワーク内で作成、使用できるが、所属するネットワークのコンテキストタイプに応じて全く別の働きを持つ。
そのため、どのコンテキストに属しているか明示する意味合いもあるのだろう。

パラメータに関して

Attributeとは

各コンポーネントが持つ固有の値のこと。
コンポーネントとは、Point/Vertex/Primitiveなどのオブジェクトを構成する要素のこと。

GeometryのPointが持つ[P]AttributeはPointの座標を表す。
ParticleのPointならVelocityなども持つ。

Attributeを追加する

Pointにアトリビュートを追加するには、Pointを持つノードの下流にPointノードを接続し、各種Attributeの動作を Add ATTRIBUTE_NAME に変更する。

同様に、Vertexノード、Primitiveノードを接続することで、それぞれに対応するAttributeを追加することができる。
※これらのノードを通った時に通ったデータが持っている情報から、Addした各Attributeを計算し下流で使えるように有効化するという方があってる気がする。

20140504_01_1

各コンポーネントのAttributeの値は、Details Viewで確認できる。
簡易的な内容は、ノードを中ボタンクリックで表示できるポップアップウインドウでも確認できる。

Expression

各種パラメータボックスには、直接計算式を記入することができる。
これは数値型のパラメータにかぎらず、例えばファイルパスなどを格納する文字列パラメータでも同じ。

変数

Expressionには変数名を記入することができる。
例えば、$FF(浮動小数点型のフレームナンバー)など。
この変数名は、そのまま計算に用いることができる。
$FF + 1 などとしてもよい。

どのような変数が使えるかは、Houdini Helpで調べると良い。

Global Expression Variables

Standard Variables

・Local Variables

例・xformノードのLocal Variables

いつ、どの変数が使えるのか?

Standard Variables にリストアップされている変数の中に、特定のノード内で使えるものとそうでないものがあるという、一見して不思議な動作を考察。

変数が見つからず、Expressionが正しく評価できない場合、ノードアイコンが赤い斜線で装飾される。

20140504_01_3

この状態でノード上にカーソルを置き、中ボタンを押すと以下のエラーが確認できる。(下図は別のノードで表示したものなので、パスが違うが)

20140504_01_2

調べた限り、ある変数名が任意のノード中で使えるかどうかを判断するのは、試行錯誤による判断が必要という意見がよく見つかるように思えた。

・対処法 NodeごとのLocal Variablesを使用する

確実に使える変数は、Helpで各ノードの項に記載されているLocal Variables のようだ。ただし、ここに記載されていない変数も使用できるケースが有るのでややこしい。

・対処法 Point/Vertex/Primitive SOPノードを経由させる

また、Point/Vertex/Primitive SOPノードを経由することで作成される変数は、下流で確実に使える状態になっているので、まずはこれらのノードを使用し明示的に変数を作成したあとで、下流で使用する。

・対処法 AttribCreate SOPを使用する

対処法として挙げられていたのは、下流で必要な値を取得したい場合は、予めAttribCreate SOPを使用して任意の値を明示的にAttributeの形で保持し、下流で使用する。

オペレータへ入力するデータの型について

オペレータが操作する対象の型に対し、処理対象として入力するデータの型が適合しているか明確に意識する必要がある。

例えば、Poly ExtrudeなどはPrimitive型のデータを元に処理されるので、Primitive型のデータを入力しなければ正しく処理は行われない。
※GUI上から頂点選択後にPoly Extrudeを実行したとき正しく動作しているようにみえるのは、実行時に選択されている頂点を包含するPrimithiveリストが自動的に割り出され、Poly ExtrudeノードのGroupパラメータに与えられるからである。

同様に、Poly BevelはPointに対する処理を行う。

よって、Groupノードによる下流オペレータへ渡すコンポーネントのフィルタ処理は、渡したいコンポーネントの型を元にフィルタするのが望ましい。

オペレータから出力されるデータの型について

オペレータへの入力が要件を満たしている場合は何事も無く処理後のデータが出力される。

例えば、Polygon Geometryを編集するノードからの出力は、特に出力データタイプを指定できるノードでない限り、Polygon Geometryデータが出力される。

※入力が要件を満たしておらず、ノードのステータスがWariningであれば入力されたデータは何も手を加えることなく下流のノードへ渡されるようだ。

20140504_01_4

ExpressionからAttributeを参照する

参照したいAttributeを保持するコンポーネントの型に応じて、それぞれ以下の関数を使う。

・Point

float point (string surface_node, float point_number, string attribute, float index)

・Vertex

float vertex (string surface_node, float primitive_number, float vertex_number, string attribute, float index)

・Primitive

float prim (string surface_node, float prim_num, string attrib_name, float attrib_index)

・Detail

float detail (string surface_node, string attrib_name, float attrib_index)

Numeric配列型Attribute

AttribCreateを使用すれば、複数の数値を保持する配列型のAttributeを作成することができる。

また、この配列型の値を使用する際、インデックスに応じて以下のように指定する。

  • $varName1
  • $varName2
  • $varName3
  • $varName4

Numeric配列とVector型

・Numeric型

・Vector型

Attributeの可視化

ビューポート上で任意のAttributeの状態を可視化できる。

Display OptionsのMarkersタブから下記のボタンを押してCustom Attributeを追加する。
20140504_01_5

左から順にGeneric/Text/Vector/Scene

上図のボタンを押すと、下図のようなウインドウが現れる。

20140504_01_8

おそらく、Nameはスクリプトなどから呼び出す際のオプション名

・Generic

A generic option is intended to work with primitive render hooks, created through the HDK. It passes an enable/disable value along with a single string argument to any render hook that looks for it. It can be toggled on in one display geometry context (like Display Model) but left off in another (Ghost Scene Object).

・Text

文字で値を表示する。
これは、数値も文字列として表示される。

20140504_01_7

・Vector

ベクトルを線で表示

20140504_01_6

・Scene

A scene option is intended to work with scene render hooks, created through the HDK. Scene hooks can query the enable state of any scene display option. Unlike generic display options, a scene option is global and is not affected by the geometry context.

Attributeの所属クラス変換と全要素を使用する計算

AttribPromoteノードを使用して、任意のAttributeを、別のクラスのAttributeに変換できる。

同時に、Attributeに含まれるすべての値から平均値や最小値、最大値、などいくつかの用意された条件にマッチする値を抜き出すこともできる。

20140504_01_9

・Original Name

検索したいAttribute名

・Original Class

変換元のAttributeが所属しているクラス

・New Class

変換先のクラス

・Promotion Method

Attributeの値をどのように計算して変換先に格納するかを指定

・Change New Name / New Name

変換先のAttribute名を指定し、新規作成する。

・Delete Original

変換元アトリビュートを削除するか決定する。

Attributeを別のノードにコピーする

AttribCopyノードを使って、任意のAttributeを写しこむ。
Attributeのコピーは、各コンポーネントのインデックスがマッチするもの同士で行われる。

20140504_01_10

パラメータ設定はだいたい見たとおり。

・Source/Destination Group 

未記入ならオブジェクト全体の指定クラスからコピー元となるオブジェクトセットを探す。

・Source/Destination Group Type

未記入ならオブジェクト全体の指定クラスからコピー先となるオブジェクトセットを探す。

・Match by Attribute / Attribute Match

コピー元と先に指定した名前のAttributeがある場合にアトリビュート値のコピーを行う。

・Attribute Name

コピーするAttribute名を指定

・Match P Attribute

ポイントのポジションである[P] Attributeの値も強制的にコピーするか指定

・Attribute Class

どのクラスのデータをコピーするか指定する。

・Copy Local Variable

ローカル変数名もまとめてコピーし、下流で使えるようにするか決定する。

Attributeを転送する

AttribTransferノードを使い、距離を元にAttributeを転送できる。

・Attributesタブ

20140504_01_11

一様に転送するAttributeの指定ができる。

・Conditionsタブ

20140504_01_12

距離に応じた転送が行える。

各パラメータの詳細は後日記載する

Particles I&II&III

https://vimeo.com/8447016
https://vimeo.com/8447185
https://vimeo.com/8447373

Partコンテキスト

パーティクル操作のためのコンテキスト。
これを使わなくてもobjコンテキスト内ではパーティクルが作れた。

Partコンテキストを使うことでどんな利点があるのか気になる。

Location (POP)ノード

ポイントエミッタ

基本的なパラメータはpopnet-oldなどと同じ。

・Birth Groupパラメータ

生成されるパーティクルが格納されるグループ名

・Preserve Groupパラメータ

上流で作られたグループを保持し、このノードで作られるグループをフローに追加する。

・Velocityパラメータ(Attributes)

初速方向の決定

・Varianceパラメータ(Attributes)

初速のランダムベクトル。
±入力されたベクトルの範囲でランダム化される。

Position(POP)ノード

Velocity (POP)ノード

パーティクルの速度を変更するオペレータ
Velocity TypeをVectorにし、パラメータを

vector3($VX, $VY, $VZ) * 0.9

などとすると毎評価ごとに速度が0.9倍され減速するパーティクルが作れる

Acceleration (POP)ノード

Split (POP)ノード

パーティクルからパーティクルを発生させる。
これを使用して、任意のパーティクルから速度を持たないパーティクルを発生させれば、パーティクルの軌跡が作成できる。

Follow (POP)ノード

パーティクルをパーティクルに追従させる。

Source Groupで引き付けられる側のパーティクルグループを指定
Leaderタブ、Leader Groupで引きつける側のパーティクルグループを指定

引きつけの速度などはFollowタブで設定。
Stop At Leaderをオンにしておくと、追従後にパーティクルはストップする

Collision (POP)ノード

任意ノードとパーティクルのCollisionを検知できる。

Collosion Eventパラメータには、このCollisionが有効になった際に発生するCollisionイベントの名前を記入する。

このイベント名は、後で以下の関数などで使う。

popevent( “EVENT_NAME” )

この関数に与えられた名前を持つEventが発生した時、関数はTrueを返す。なので、別のSourceノードのImpulse Activationなどに仕込めば、Collisionイベント発生時にのみパーティクルを発生させるような事が可能。

Collect (POP)ノード

パーティクル版のmergeノード

Curl-Noise(POP)ノード

パーティクルにNoiseを与える。
Noiseの影響はUpdateタブでAdvection Typeから指定。
ポジションや速度、外力として与えるなど、様々な選択ができる。

popnet-oldオペレータ

Over Samplingを上げると、Constタイプで時間に対しスムースに作成されるパーティクルの間隔がスムースになる。

パーティクルの外観

20140503_01_0

・Sprite(POP)ノード

スプライトを設定
同じように操作しているつもりだけど、何故かうまくスプライトの割り当てができない。

20140503_01_1

 

バージョン違いによる差異だろうか。

チュートリアルでは、一度popnetに対してスプライトを当ててから、別のパーティクルに当て直しているように見えるこの手順は一旦スキップする。

・Instance(POP)オペレータ

オブジェクトインスタンス

・Render(POP)オペレータ

パーティクルをそのままレンダリングする際の見た目を決定する

Color(POP)オペレータ

パーティクルのカラーや透明度を指定する

Property(POP)オペレータ

任意のタイミングで、任意のアトリビュートを操作できる。

Trails Effect Tutorial

https://vimeo.com/5891547
https://vimeo.com/5891661

ボックスから発生するトレイルエフェクトチュートリアル

1・以下の3つを作成

・motionPath_curve
エミッターとなるボックスが沿うモーションパスカーブオブジェクト

・trail_emitter
エミッターとなるボックスオブジェクト

・trail_lines
トレイルエフェクトオブジェクトが入るGeometryノード

20140502_01_0

2・モーションパスにボックスを沿わせて動かす

trail_emitterのPath ObjectにmotionPath_curveを指定
Positionにスタートフレームで0、エンドフレームで1となるようにキーを打つ。
これで時間を動かすと、カーブに沿ってボックスが動くようになる。

20140502_01_1

3・Trailノードを使ってボックスの頂点の軌跡を取り出す

※この時、trail_emitter内のboxノードに直接Trailノードをコネクトしても、trail_emitter内に存在するbox自体は、ローカルな空間内では動いていないので軌跡が作成されない。
グローバル空間での動きを元にTrailを作成する必要がある。

trail_linesの中にObject Mergeノードを作成する。
このノードは、パスを指定してどこからでもジオメトリデータを取得できる。パラメータリストの下部で呼び込みたいオブジェクトのパスを指定する。

20140502_01_3

Transform情報はbox自身の移動情報を使用するので、以下のように設定する。

20140502_01_2

そして、Object MergeにTrailノードを接続すると、Trailが正しく有効になる。

20140502_01_4

20140502_01_5

4・エフェクトの発生点を作成する

trail_emitterを非表示にしておき、後面を選択後に削除。

blastノードが作られ面の削除が行われる。
blastノードのパラメータで、Delete Non Selectedをオンにする。
こうすることで、選択されていなかった面が削除される。

5・Trailで複製された面が持つ頂点同士を接続する

Trailノードのパラメータで、Result TypeをConnect as Polygonsにする

20140502_01_6

20140502_01_7

同じ番号を持つ頂点同士が接続される。

デフォルトの設定では、ここで作られるポリゴンのラインは閉じているため、急激なカーブを行う箇所などでは面が見えてしまう。
開いたカーブにするため、以下のパラメータをオフにする。

20140502_01_8

6・Trailが作るラインがいい感じの見た目になるようにパラメータを調整

20140502_01_9

20140502_01_10

上記のような設定にしてみた

7・Trailで出来たラインをNurbs Curveに変換する

Convertノードを作成し接続
Convert To を Nurbs Curveにする

20140502_01_11

8・ラインのパラメータ位置計算のため、rankアトリビュートを作成する

Attrib Createノードを作成。
Name を rankに

9・カスタムアトリビュートをビューポートに表示する

Dキーでディスプレイオプションを開き、Customの項目でNew text display option

20140502_01_12

20140502_01_13

ApplyやAcceptを押すと、Customの項目にrankが追加されたことがわかる。

20140502_01_14

これがオンになっていると、同名のアトリビュート値が各ポイント上に表示されるはずだが、なぜかされない。

ちなみに、このカスタム表示を使えば、各頂点上の法線方向なども視覚的にわかりやすく表示できるようになるらしい。

20140502_01_15

10・VOP SOP

VOP SOPを作成してコネクト

20140502_01_16

VOP SOPに入る

11・rankの値を使用するため、Parameterノードを作成する

20140502_01_17

ノード名はわかりやすいものにする

Nameはアトリビュート名
Labelはわかりやすいものにする

InvisibleがオフだとVOP SOPノードにパラメータが表示されてしまうのでオンにして隠しておく。

ノードカラーも、inputとVOP SOP内で生成されるものとで分けておくと良い。

12・RampParameterを作成し、コネクトする

Trailエフェクトのぶれ具合をramp制御したいのでRampParameterを作成し、コネクトしておく。

RampParameterノードは0〜1の値を受け取り、それぞれの値に応じた値を出力する。

20140502_01_22

Rampの動作は以下のようにしておく

20140502_01_18

Nameに$OSという名前の変数を使うと、ノード名そのものがここで作られるパラメータ名として使われる。VEX内部で生成するパラメータはこのパターンで命名するのが楽かも。

13・Turbulence Noiseノードを作成する

このノードを使用して、Trailのブレを作る

20140502_01_21

14・Noiseスケール用のParameterノードを作成する

Turbulence Noiseで作られた3軸のノイズ値を個別にスケールできるように、 3 Float型のParameterノードを作成。

この時、Default値は 1,1,1にしておく。(0,0,0 のままだと、Noiseがかかっていないように見えてしまう)

20140502_01_19

15・MultiplyノードにNoise計算用ノードをコネクト

20140502_01_20

16・Noiseと元々のカーブを加算する

最後に、Multiplyで作られたNoise成分と、元々のカーブのポイントを足し合わせる。

20140502_01_23

Multiplyの計算結果は、あくまでもノイズ成分。
これを、元々のカーブに足し合わせることで、Noiseの加わったランダムなカーブが出来上がる。

20140502_01_24

赤がモーションパスカーブ
緑がNoise加算前のTrailカーブ
白がNoise加算後のTrailカーブ

20140502_01_25

チュートリアルをアレンジしてレンダーしてみた

Houdini sidefx official Lesson12 Compositing

パーティクルアトリビュートを個別に取り出しやすくする

sourceノードにAttribCreateノードを接続する。

20140430_01_1

AttribCreate内でNameに任意のアトリビュート名。
Valueに変数名を使用することで、任意の変数に名前をつけて明示的に外に出せるようだ。

20140430_01_2

マルチパスレンダリング

Mantraノード内、Outputタブ。

20140430_01_3

Extra Image Planesで+ボタンから出力するパスが追加できる。
デフォルトで定義されているパスはVEX Variableの項目右端のプルダウンから簡単に指定可能。

VEX Typeは変数の型を指定。もともとVector型として定義されているパスをFloatなどで出力するとどうなるのか?後でテストする。

Channel Nameは出力されるファイル名のようだ。

Quantizeでピクセルのビット深度の指定。

この設定をしただけではマルチパスレンダリングされないので注意

Material Shader Builder

マルチパスレンダリングのため Extra Image Planeを追加したら、SHOPでMaterial Shader Builderを作成し、オブジェクトへアサインする必要がある。

これでもまだマルチパスレンダリングは行われない

20140430_01_4

VEXパラメータの追加

Material Shader Builderの中でParameterノードを追加し、Nameに先ほど作成したExtra Image PlaneでVEX Variableでつけた名前をNameパラメータに指定する。

20140430_01_6

ExportパラメータをAlwaysにしてレンダリングするとマルチパスレンダリングされたことがわかる。

20140430_01_5

ウインドウ上部のチャンネル名プルダウンから、表示するチャンネルを指定できる。

上図は、Velocityチャンネルを表示。

MPlayについて

Iキーを押すとカーソルの下にあるピクセルの各種情報が表示される

20140430_01_7

以下のボタンを押すと、現在表示されているチャンネルに含まれる値の範囲を最大限引き伸ばして表示できる。

20140430_01_8

イメージファイルへのレンダリング

mantraノードのProperties->Output

Output Pictureパラメータにファイルパスをファイル名込でセット。
拡張子を記入しておくと、自動的にその拡張子のフォーマットで書き出される。

ここにipとだけ記入しておくと、MPlayで直接レンダリングされる。

imgコンテキストを使用するコンポジット

コンポジットプロジェクトの設定は Edit -> Composite Project Settings
コンポジット作業は、imgコンテキスト内で行う。

コンポジット中の画像はComposite Viewで確認できる。

ノードベースのコンポジットソフトと同じように、素材ノードの下流に各種処理ノードをつなげて処理を進める。

まずはImage Networkノードを作り、カットごとなどある程度の単位でサブネットワークを作るのが良い。

イメージファイルの読み込みはfileノードから行う。

Channel Copyノードでイメージファイルから任意のチャンネルを取り出したり、取り出した画像にBlurやExpand,Limitなどといった画像処理ノードををつないでマスクを生成するなどしながら画像合成を行う。

20140430_01_9

20140430_01_10

レンダーノードのmerge

複数のレンダーノードを作成し、mergeノードにまとめると、mergeノードのRenderボタンからまとめてレンダリングできる。