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ボタンからまとめてレンダリングできる。

Houdini sidefx official Lesson11 Dynamics

Rigid Body

剛体シミュレーション。
Rigid Bodyの作成は、Rigid Bodiesタブから RBD object 選択後、Rigid Body化するオブジェクトを選択し、Enter

Rigid Bodyの基本ノード構成

20140428_01_0

torus_object1に対してRigid Body化した直後

torus_object1の内側

20140428_01_1

通常通り、ジオメトリが作成され、restにつながっている。
restノードはソリッドテクスチャをオブジェクトへ追従させるために使うノードらしい。

dopimportノードは、別の階層にある DOP Networkへジオメトリデータを転送するのに使っている

20140428_01_4

Object Mask = dopobjscreatedby(“/obj/AutoDopNetwork/torus_object1”)

AutoDopNetworkの内側

20140428_01_2

dopimportで出力されたジオメトリデータをRBD Objectノードで受け取っている。

SOP Pathパラメータにて、どのジオメトリを受け取るか指定

20140428_01_3

SOP Path = opinputpath(“/obj/torus_object1/dopimport1”, 0)

Rigid Body Solver

実際にシミュレーションを行うノード。

20140428_01_5

Solver Engineパラメータで、使用するソルバを指定する。
おそらくBullet以外を使うことは殆ど無いんじゃないだろか

以降のコネクションには、ここでリジッドボディに関連するジオメトリをまとめるmergeノードと、重力等の外力ノードが並ぶ。
これに続けてWindノードなどをつないで外力を足すことも可能。

Ground Plane

無限遠のCollisionオブジェクトを足すことができる。

Rigid BodiesタブからGraund Plane。

20140428_01_6

20140428_01_7

Rigid Bodyオブジェクトの初期状態

各RBD ObjectノードのInitial Stateタブにて設定。

Collisionのパフォーマンス調整

RBD ObjectのCollisionsタブにて設定

20140428_01_8

Modeの変更可で処理の高速化ができそう。
Modeパラメータは、実際に各RBD オブジェクトがどのようなCollision形状を使用して衝突判定を行うかを決定する。

このCollision形状を確認するには、Show Collision Geometryをオンにし、一度初期フレームに戻る。

20140428_01_9

20140428_01_11

20140428_01_10

DivisionsパラメータでCollision形状の精度を調整する。
当然だが、極力少ない面の数で構成されるように調整するのが良い。

シミュレーションのパフォーマンス調整

AutoDopNetworkのパラメータで行う。
Sub Stepで1ステップを何分割して計算するか指定。
このへんはその他のシミュレーションツールと同じ考え方で良さそう。

剛体の振る舞い調整

RBD ObjectのPhysicalタブで行う。
このへんもMayaなどと同じ考えで設定できそう。

※Mayaにないパラメータ
Dynamic Friction Scale:静止摩擦が限界を迎えた後の摩擦係数。
説明を読む限り、Frictionは静止摩擦で、それに対してこの数値を掛けあわせた値が動摩擦係数として動作するということらしい。
よって、この値が0の場合は、滑り出したら摩擦係数0の状態で動作するようになる。逆に、1の場合は常に静止摩擦の値で摩擦係数が発生することになる。
Temperature:温度。浮力や発火の検知に用いる値らしい。
例えば、燃料オブジェクトにこの剛体が接した時、燃料オブジェクトの発火温度をこの値が上回っていたら発火させる。
この発火処理がどのように行われるかは現時点では不明。

RBD Objectの追加

追加したいオブジェクトを選択し、通常通りRBD Objectを作成すると、AutoDopNetworkにRBDオブジェクトが追加される。

20140428_01_12

RBD Objectはいったんmergeノードにまとめられた上で各ソルバノードへジオメトリの出力を行うようだ。

これは、Static RBDオブジェクトの追加も同様。

20140428_01_13

閉じていない形状のRBDオブジェクト

デフォルト設定では、RBDオブジェクトは閉じていない形状でも閉じてい状態で計算される(Bulletの制限?)

20140428_01_14

ボールはチューブの内側に落ちず、チューブが持つボリュームに乗る。
これを防ぐには、チューブの表面に厚みをもたせ、形状を閉じておく必要がある。

カーブ上に散布するオブジェクトの向き

ここでは、散布されたオブジェクトをそれぞれ次のオブジェクトに向けるある一点のオブジェクトに向いてほしい方向は「次のポイントの位置-現在のポイントの位置」で表わせる。

pointノードについてもう少し

pointノードのinput2は、ポイント参照用のオブジェクトを入力できる。
参照用オブジェクトを使用すれば、法線方向の計算などで使用することができる。

20140428_01_15

上図の例では、上見えているカーブを複製し、複製されたカーブを少し下にずらしている。
複製されたカーブなので、各頂点番号は一致している状態。

ここで、上のカーブをpointノードのinput1に、下のカーブをinput2へ接続し、pointノードのNormalに以下のエクスプレッションを仕込む。

NormalX : $TX2-$TX
NormalY : $TY2-$TY
NormalZ : $TZ2-$TZ

$TX2はinput2側の頂点位置を指す。
こうすることで、input1の各頂点法線は、input2の各頂点との差分ベクトルを持つようになる。

Dominoチュートリアル

20140428_01_16

このチュートリアルでは、まずドミノピースを並べるためにカーブを作成する。その後、カーブをResampleし、等間隔で頂点をもたせる。
最終的には、このカーブが持つ各頂点上にピースを複製して散布する。

Resample済みのカーブを受け取るSortノードを作成し、ソート方法をShiftにした上でOffsetパラメータを変更すると、各頂点番号が循環する。

ここでは、この性質を利用して、全く同じ形状で一つ頂点番号がずれたカーブを法線方向計算のための参照先として利用する。

20140428_01_17

頂点数が同じで、元の頂点の並びが同じカーブ同士なら、片方のカーブ上にある頂点番号を一つシフトすると$TXと$TX1の差は、ちょうど隣り合う頂点の位置の差分となる。

よって、この値をNormalに与えれば各頂点の法線は、強引ではあるが次の頂点方向を向くようになる。

この時、末端のポイントだけは正しい方向を向けられないので、DeleteノードをPointノードの後ろに配置し、ポイントの削除を行う。

オブジェクトの頂点上にRBDオブジェクトを散布する

任意のオブジェクトを選択した状態で以下を押す

20140428_01_18

すると、ダイアログが開く。RBD Packed〜 と RBD Point〜の違いが不明なので調べる。

その後、散布したいオブジェクトを選択し、Enterキーで決定。

散布された各オブジェクトは、通常通りRBDオブジェクトとして動くようになる。

あとは、地面を配置してドミノをスタートさせるオブジェクトを作り、最初のピースを倒すだけ。

RBD Object と RBD Fracture Object

RBD Objectは、一つのジオメトリに複数ピースのジオメトリが含まれている場合、それらが一塊でなかった場合でも一つのRigid Bodyオブジェクトとして扱われる。

20140428_01_19

RBD Fracture Objectは、1ジオメトリ内に含まれるすべてのジオメトリを個別のRigid Bodyオブジェクトとして扱う。

20140428_01_20

RBD Glue Object

糊付けされたように、もともと結合力を持っているRigid Bodyが作成できる。例えば家具など、力が加わることで破壊され、他と切り離されるまでは結合を保とうとする振る舞いが作成できる。

シェルフ内で当該機能が見つけられなかった。
別の方法で作る方法を探る。

RBD Pin(Rigid Body Constraint)

剛体に制限を与えることができる。
以下を押す。対象となる剛体オブジェクトを選んでEnter、Pinの位置を選択し、もう一度Enter

20140428_01_21

RBD同士をPinでつなぐ

RBD Pin作成時に2つのRBDを選択すれば、それぞれがPinで繋がれる

20140428_01_22

Rigid Pin Constraintノード

20140428_01_23

Constrained Objectはコンストレインをうけるオブジェクト
Goal Objectは、コンストレインを与えるオブジェクト

Goal Objectが空欄だとGoal Locationで定められた位置にゴール位置が固定される。

RBD Spring Constraint ノード

バネで剛体をつなぐコンストレイン。

20140428_01_24

20140428_01_25

Limit Forceは、バネが切れる力のしきい値のようだ。
低めの値にしておくと、一定の速度がかかった時にバネが消えて、剛体は自由落下する。

20140428_01_26

20140428_01_27

その他のRigid Body Constraint

RBD Hinge Constraintや、RBD Angular Constraint等がある。
使用するソルバによって使えるコンストレインが変わるらしい。

破壊可能なRigid Body

RBDを作成後、Make Breakableを押す

20140428_01_28

破壊のパラメータは Fracture Parameterノード内で操作する。

20140428_01_29

20140428_01_30

20140428_01_31

Houdini sidefx official Lesson10 Particles

Particleノード

20140427_01_0

入力は、左から順にソースオブジェクト、コリジョンオブジェクト、フォースオブジェクト。

パーティクルは、ソースオブジェクトのポイントの位置からIDの順にしたがって発生する。

リアルタイムプレイバックオプション

あまり変わってるように見えないけど、タイムスライダ右側の時計アイコンのオンオフで全フレームを極力高速に連続再生するか、設定されたフレームレートを守って再生するかを決められる。

20140427_01_1

パーティクルの初期設定

ソースオブジェクトからpointノードに接続し、Particleタブの中で初速等を設定する。

20140427_01_5

20140427_01_2

初速に Y=-9.8を入れてみたところ

20140427_01_4

20140427_01_3

パーティクルをソースオブジェクトの法線方向に飛ばす

ソースオブジェクトにコネクトされるpointノードで、standardタブにあるNormalの項目をAdd Normalにする

20140427_01_6

20140427_01_7

この法線パラメータも初速として考えることが可能。
初速と同様にY=-9.8とすると全く同じ動きをする。

パラメータ名と動作をより正確にマッチさせるなら、Velocityパラメータに$NX,$NY,NZを元にするエクスプレッションを仕込むのが正しい気がする。

パーティクルをランダムな位置から発生させるには

ソースオブジェクトをScatterに接続し、オブジェクトの表面に一度パーティクルを散布し、散布されたパーティクルをパーティクル発生点にする。

Sortノード

入力されたコンポーネントのIDの並びを任意のルールでソートする。
例えば、ソースオブジェクト上のパーティクル発生位置を固定しながら、発生順だけをランダム化したい場合に使うと便利。

Collisionオブジェクト

パーティクルが衝突するオブジェクト。
このオブジェクトは体積を持っているべき。

形状を作成したら、particleノードの2番目の入力にコネクトする

デフォルトでは、Collisionオブジェクトにパーティクルがヒットした際の動作は「消滅」に設定されている。

Hit Behabiour = Die On Contact

このパラメータをBounce On Contactに設定すれば、Collisionオブジェクトにヒットしたパーティクルが跳ね返るようになる。

20140427_01_8

20140427_01_9

Collisionアトリビュートは Gain Tangent/Normalのようだ。
Collisionヒット時にそれぞれの方向にどの程度の倍率で力が変化するかを指定できる。

+/- Limit Planeパラメータは、強制的に発生させるCollisionバウンディングボックスと言える。多分オブジェクトを使用するCollisionより高速かつパーティクル抜けがないので、室内シーンなどでは積極的に使うのがいいように思う。

20140427_01_10

上図は、-Limit PlaneをCollisionオブジェクトより高い位置に設定した例

パーティクルのSplit

Collisionヒット時にサブパーティクルを発生させることができる。
設定は、Splitパラメータから行う

Hit Behaviour=Die On Contact かつ Split=Split On Death に設定すると、単純にパーティクルがCollisionヒット時に分裂するような状態が作れる。

Stateパラメータ

Start Time:シミュレーション開始までの秒数
Prerole Time:シミュレーション開始時点までに事前計算を行っておく秒数。カットの開始時にある程度パーティクル数を出しておきたい場合に使用する。
Time Inc:パーティクルの評価タイミングの精度。細かくすればするほど評価精度が高まる。通常は1/$FPSで良くて、早過ぎるパーティクルなど、精度が求められるパーティクルだけ高精度化するのがいい。

ソースGeometryの変形

Particleノードの Behaviourパラメータを Modify Source Geometry にすると、ソースオブジェクトの頂点が、発生したパーティクルに追従するようになる。この性質を利用すれば、ソフトボディが簡単に作れそう。

パーティクルの寿命

Life Expectはパーティクルの寿命(秒)
Life Varianceはパーティクル寿命のランダム幅(秒)

Magnetノード

任意のGeometryをMetaBallによって変形できるノード。
チュートリアルでは、雨メタボールをパーティクル上にコピーし、メタボールがヒットした位置の頂点を盛り上げる変形を行うようにした

パーティクルの発生数に関して

パーティクルの発生数に関するアトリビュート

Impulse Activation:0=パーティクルは発生しない、それ以外は発生する。
Impulse Birth Rate:評価タイミングごとに発生させるパーティクルの数

Const Activation:0=パーティクルは発生しない、それ以外は発生する。
Const Birth Rate:一秒間に発生させるパーティクルの数

Particle -> Poly Line -> Skin -> Polygon Mesh

20140427_01_11


パーティクルの発生点として2つのポイントで構成されるラインを作成


ラインの中心にピボットを移動し、transformにつなげて回転させる。


このオブジェクトをパーティクル発生源にし、Initial Velocityを持たせて移動するように設定する。この時、Impulse Activationを1,Impusle Birth Rateを$NPTとし、ソースオブジェクトが持つ頂点数分を毎フレーム生成するように指定。


パーティクルをAddノードに接続し、By GroupタブでAddパラメータを Groups of N Pointsにし、Nを2にする。
こうすることで、パーティクルが2つ発生するごとに一つのグループにまとめられ、それぞれが別のPolyLineオブジェクトとして扱われるようだ。


Skinノードにコネクトし、面を貼って完成

popnet内でのパーティクルグループ

popnetノード内で、パーティクルのグループを作れる。

groupノードを作成し、Createタブで新規作成するグループ名を Group Nameに入力、Createタブ内、Ruleタブでグループに含める条件を入力することで、条件に当てはまるパーティクルをここで作成したグループに含めることができる。

20140427_01_12

下図は、パーティクルIDを走査し、偶数と奇数でグループを分け、それぞれのグループに別々のカラーとフォースを割り当てた例。

ColorノードやForceノード内で、Source Groupパラメータに、ここで作ったグループ名を入力することで、グループごとの編集が可能になる。

Groupノード内で Ruleタブ内にあるEnableを忘れずにオンにしておくこと。これを忘れると当然効果が現れない。

20140427_01_13

なお、パーティクルの寿命が尽きた時、全パーティクルが持つIDが変化してしまうため、一工夫して変化させない仕組みを作る必要があるようだ。

Houdini sidefx official Lesson9 Custom Shaders

VOP SOP

頂点を直接操作するためのノード
オブジェクトの変形などができるようだ

20140426_01_0

フルネームでアトリビュート名を表示する

Edit -> Preferences -> Network Editor, Nodes and Trees

で、以下のオプションをオンにする。

20140426_01_1

20140426_01_2

こんなかんじでフルネーム表示される。

アトリビュートの型

アトリビュート名の左右にあるボックスは、コネクタであり、値の型ごとにカラーが決まっている。このへんは他のDCCツールのノードエディタと同じ概念。

異なる型同士を接続sる場合は、変換ノードを間に挟む。
変換ノードには、Float to Vector等がある。

20140426_01_3

各コネクタの上にカーソルを置いて待つとコネクタの詳細情報がポップアップする

20140426_01_4

20140426_01_5

20140426_01_6

これは、型の確認に使える。

VOP SOPノードのボタン

20140426_01_7

ノードの右側にはボタンが有る。
左から順にデバッグ/バイバス/表示モード切り替え。

デバッグは後に説明がありそう
バイパスはそのノードを一時的に無効化する
表示モードは、全アトリビュート表示、コネクト済みアトリビュートのみ表示、全アトリビュート非表示を切り替えられる。

頂点移動の例

20140426_01_9

Noiseを使用してGridを変形する。

20140426_01_8

ここでやってること


入力されたメッシュであるglobal1が持つ頂点からそれぞれ Position(Vector)を取得し、Noiseノードに渡す。この時、特にグループなどが指定されていなければ、global1には入力されたメッシュ上にある全頂点が含まれる。


Noiseノードの計算結果をDisplacementノードに渡し、移動後の頂点位置を出力する。Displaced Position(Vector)


VOP SOPの計算結果を出力するためのOutputノードに、変形後の頂点位置を渡すことで、変形が完了する。

VOP SOPの使い方考察

見たところ、VOP SOP内ではトポロジの変更を行うノード(smoothやsubdivideなど)が作れないようだ。
よって、VOP SOPはすでにあるメッシュなどに対し、何らかの処理をするためのものだと思う。
トポロジ変更はVOP SOPの上流で完了させておく必要がありそうだ。

シェーダーネットワーク

shopでMaterial Shader Builderを作成

20140426_01_10

このノードの内側に入るとVOP SOPと同じ要領でシェーダーネットワークを編集できるようだ。

20140426_01_11

Global Variablesノード

出力したい内容に応じて使用する入力値が異なるので、Global Variablesノード内のアトリビュートを適宜切り替えて使用する。
VOPノードの動作は、このノードから出力される値をもとに行われるようだ。

Surface Modelノード

一般的なシェーディングノード。
だいたいこれを使っとけば問題ないらしい。
ダブルクリックすると中身を見ることができる。すでに複雑なネットワークが組まれていることがわかる。

既存のシェーダノード内にあるネットワークを編集する

20140426_01_12

ノードのラベル部分を右クリックして表示されるメニューから、Allow Editing of contentsを選択すると、ノード名が赤色になり、内部のノードネットワークが編集可能になる。

大体の流れとしては、Global Variable → 任意のチャンネルごとに見た目調整処理 → Surface Model → Surface Output → Collect の順にノードをコネクトすれば良さげ。

アトリビュートのPromote

Material Shader Builder内に存在する各ノードの中から、任意のパラメータへのエイリアスをMaterial Surface Builderノードへ持たせることができる。

外に出したいプラグを中ボタンクリックし、Promote Parameterを選択

20140426_01_13

こうすると、ノードのパラメータの左側に突起が出現し、Promoteされたことがわかる。

20140426_01_14

また、Material Shader Builderノードのパラメータを確認すると、パラメータが追加されたことがわかる。

20140426_01_15

また、Promoteは、パラメータリストに表示されている各パラメータの右端にあるボタンからも行える。

20140426_01_17

20140426_01_16

ノード内の未コネクトパラメータをまとめて外にだす場合は、ノードラベル右クリックから Create Input Parameters を選択する

Promote済アトリビュートのExpose

Promoteは、実際には、実体アトリビュートとアトリビュートへのエイリアスの間に値を中継するためのノードが挿入されて行われる。
ノードのPromote済みプラグを中ボタンクリックし、Expose Input Node を選ぶことで、中継ノードが表示される。

20140426_01_21

上図はdisplacementnml1のscaleアトリビュートはPromote済みで、それをExposeした様子。

この中継ノードを操作すると、値の範囲やタイプなど、パラメータの振る舞いを変更することができる。

Propertiesノード

任意のパラメータを持たせるためのデフォルトでは何のパラメータも持たないノード。Edit Parameter Interfaceで任意のパラメータを追加して使用する。

MaterialパラメータをGeometryノードに渡す

GeometryのMaterialパラメータ欄右端のプルダウンから以下のメニューを選択すると、geometry内のmaterialタブにシェーダが持っているパラメータのエイリアスがまとめて表示されるようになる。

20140426_01_18

20140426_01_19

この操作により外へ出されたパラメータは、マテリアル本体が共有されていても、値は共有されないようだ。

つまり、ひとつのシェーダを使いまわしてバリエーションを作成することができる。

これが、アトリビュートとチャンネルの違いということなのだろうか?
ちょっとぴんとこないので、あとで調べる。

オブジェクト内に直接シェーダーを埋め込む

オブジェクトの内側で SHOP Networkノードを作成するとオブジェクトに、シェーダーを埋め込むことができるようだ。

その後、GeometryノードのMaterialタブにて使用するシェーダーを選ぶ際、以下のようにオブジェクトツリー内のシェーダーが選択できる。

20140426_01_20

また、この時、Export Relative Path を選択してからマテリアル指定を完了すると、相対パスでマテリアルが指定されるため、Geometry自体が階層を移動してもマテリアルのアサインは保たれる。

Displacementの最適化

Displacementはデフォルトの設定では、欠けが発生するなどして、正しくレンダリングされない(チュートリアル中に理由が詳しく述べられているようだけど、よく聞き取れず)

これを回避するためには、Propertiesノードを作成し、レンダリング用の特別なアトリビュートを作成と、シェーダネットワーク末端のCollectノードへ接続する。

アトリビュートの追加はPropertiesノードで通常通りEdit Parameter Interface

For Renderingタブ → mantra → Shading → Displacement Bound

20140426_01_22

20140426_01_23

20140426_01_24

Displacement Boundの値を上げることで、精度が上がり、正しくレンダリングできるようになる。

20140426_01_25

それで出来た草シェーダ

VEXとVOP考察

VEXは、Vertex Expression?
VOPで作成するノードグラフは、実際にはVEXコードをグラフィカルに表示しているだけのようだ。

また、Material Shader Builderのパラメータを見ると Compilerの項目がある。これが意味するところは、リアルタイムにVEXがコンパイルされ、最適化された状態で常に使用されるということなんじゃないだろうか。

VEXのコードを表示するには

VOPの操作による処理を記述できるノードを右クリックし、View VEX Code を選択する

Houdini sidefx official Lesson8 UVs and Materials

※UV操作に関しては、Houdiniで全てを完結させないと思うので、ここでは軽いメモに留める。

UV Editorの表示

Space+5

Background Image

Dキー:ディスプレイオプション

Background Imageタブでイメージ読み込みや表示方法のオプションが選択できる。

icp(画像変換ツール)

Houdini Shellから

icp 元画像のパス 変換先の画像パス

拡張子似あわせ、自動的に変換が行われるようだ。

スタンドアローンアプリケーション

Help > 検索で Standalone を検索

Stand−alone utilitiesの項目を参照。

このヘルプに一覧化されている各種ツールは、

$HFS/bin

に格納されている。
Mayaでいうところのimgcnvのようなサポートツールがてんこ盛りである。

UV Textureの適用

ジオメトリにUV Textureノードをコネクトすると、ジオメトリにUVが作成される。

20140422_01_0

Material Paletteにて任意のシェーダを作成し、Materialノードアイコンをオブジェクトにドラッグして適用できる。

マテリアルによるかもしれないが、ノードのダブルクリックで内部のノードネットワークにアクセスできる。

MaterialはGeometryノードに接続されるようだ。

20140422_01_1

上図は、sphere_object1にuvmapMaterialをアサインした直後の様子。

UV作成(プロジェクション)

TextureタブでUVProject選択後、任意のコンポーネントを選んでEnter

この後、ProjectionパラメータをCylindicalなどに設定することで、それぞれの方法でUVプロジェクションできる。

通常のマニュピレータを使用して、プロジェクションオブジェクトも操作できる。

UV頂点とモデル頂点の選択

通常の頂点は選択ツールで選択する

20140422_01_7

UV頂点はUVEditノードのハンドルで選択する。

20140422_01_8

うっかり選択ツールで選択するとUVではなくモデルの頂点を編集するモードに入ってしまう。

PointとVertex

ポイントはあくまでも共有される頂点で、モデルの頂点
Vertexはあくまでも独立している頂点でUVなどで使われる。

HoudiniのUVはそれぞれ所属する面ごとにUV頂点が独立しているようで、繋がりを保ったまま移動したい場合はドラッグして、重なったUVの塊をまとめて選択してから行う必要があるようだ。

UVの接合

近い位置にあるUV頂点をくっつけるには、UVFuseを使う

UV作成(ペルティング)

エッジを1つ選択しLキーでLoopセレクト
Shiftキー+エッジセレクトで追加。直後にLキーで追加Loop選択
エッジ選択後Fキーで隣接エッジを一つ拡張選択

2つのループで境界を区切り、一本のループで切れ目を指定

Textureタブ>UVPelt

UV島の範囲の中で内側になる部分をCtrlを押しながらクリック

赤いボーダーラインが現れるので、切れ目に問題がなければEnterで決定

20140422_01_3

20140422_01_2

細かい調整は、uvpeltノード内のiterationsパラメータなどを操作して行う

ここで作ったUV島はuvpeltノード内のCreate Output Group と Output Groupアトリビュートによって名前をつけておくことができる。

Frameタブのパラメータで、ここで作られたUV島の配置を調整できる

20140422_01_4

便利な選択モード

20140422_01_5

Select Connected Geometryをオンにし、ConnectivityをUVにしておくと、UV選択時に連続したUV島のみをまとめて選択できる。

UVを直接編集する場合は、任意のUVを選択して Texture>UVEdit

Select Connected Geometryをオフにし、 Select Front Facing Onlyをオンにした上でUVを選択すると、裏返っていない部分のUVのみをまとめて選択できる。
また、この時、そのまま移動すれば指定された範囲がまとめて切り離され移動できる。非常に便利。

20140422_01_6

UVの微調整 UVBrush

スカルプト感覚でUV調整できるツール。
右クリックメニューなどで細かい動作の変更も可能
ノードのアトリビュートでも調整可能

UVの微調整 UVEdit

Soft Radius 任意の頂点を動かしたあと、Soft Radiusパラメータを操作すると、周辺のUVがスムースに追従する。

UVのグループ化を使うテクニック

UVは、その他のジオメトリコンポーネントのようにグループ化することができる。

ここでは、とりあえず半身分のUVをミラーするため、以下の手順でUVを作成した。

各部位ごとにUV島に名前をつけておく。

groupノードをコネクトし、groupノードのBoundingタブからど真ん中を通るようにバウンディングボックスサイズと位置を調整することで、半身のUVをすべて選択できる。

groupノードでは以下のように設定した。

20140422_01_10

20140422_01_9

UVのミラーリング

attribMirrorノードをコネクトし、任意の位置を中心に反転するように設定。

20140422_01_11

Houdini sidefx official Lesson7 Lights, Camera, Render

copyノードについてもう少し

・コピーされたオブジェクトの姿勢制御

Transform Using Template Point Attributesオプションをオフにすると、コピーされたオブジェクトはコピー前の姿勢を保って複製される。

・stampアトリビュート

stampアトリビュートの作成は、あくまでもコピー時に参照される準備を行うためのもの。
実際には個々のコピーオブジェクトが生成されるときに使用される。

stampアトリビュートを使用するかどうかの判断は、入力されたオブジェクト内のエクスプレッションでstamp関数を使用して参照する記述の有無による。

カメラ

カメラの作成はCommand+シェルフのカメラボタンから。
こうすると、現在シーンを見ているカメラの複製が作られる。

カメラのマニピュレータとホットキー

20140420_01_2

・Orientation Handle

20140420_01_1

カメラ本体または注視点を固定しながらカメラワークを決められるのがとても便利。

・Focus Handle

20140420_01_3

被写界深度のための設定が簡単に行える

・Frustam Handle

20140420_01_4

画角やNear/Far Clip Plainなどを決められる。
中央のボックスをドラッグしてクリッププレーンを決める
周囲の四角をドラッグして画角を決める

カメラの切り替え

ビューポートの右上にあるHUDボタンから任意のカメラを選ぶ

20140420_01_10

カメラのシーケンスを組む

Switcherノードに任意のカメラを複数コネクトする
このSwithcerノードはビューポートのHUD内にも表示される。
ビューポートをSwitcherノードで覗き、Swicherノード内のSwitch Cameraアトリビュートを切り替えれば、任意のカメラでビューポートを見ることができる。
キーフレームを打てば、指定時間でカメラを切り替えることも可能。

レンダリング

レンダリングを行う際は、はじめにレンダラーノードを作成する。

20140420_01_5

Mantra:標準搭載のスキャンラインレンダラー
Mantra-PBR:物理ベースレンダラー
その他:サードパーティ製レンダラー

Houdini で作業を完結させるなら、Mantra系レンダラーを使えば良い。

個々で作られたレンダーノードはoutコンテキスト内にぶら下げられる。

Mantraのレンダリング設定

・レンダリングするフレームレンジを設定

20140420_01_7

Render Any Frame:現在フレームのみレンダリング
Render Frame Range:指定した範囲のフレームをレンダリング
Render Frame Range Only(Strict):謎。厳密なフレームレンジ?要調査

・レンダリングノードごとに使用するカメラを指定

20140420_01_6

・レンダリング結果の出力先を指定する

20140420_01_8

Output Pictureにipが指定されているとレンダリング時にMPlayアプリケーションが立ち上がり、リアルタイムにレンダリングの様子が見られる。

20140420_01_9

フルパスで出力先を決めることもでき、フレーム番号を使うエクスプレッションを使用して出力ファイル名を指定することで、連番画像を吐き出すことができる。

(例)$HIP/Lesson7_Render/Lesson7_$F4.jpg

・レンダリングクオリティの調整

Samplingタブ内の調整を行う
SamplingパラメータやJitter、Noise Levelパラメータなどを使う

・被写界深度を使う

Samplingタブの中で、 Enable Depth of Fieldをオンにする

ライトのタイプ

20140420_01_11

Areaライトの注意点

デフォルト設定では、ライトのサイズに応じてライトの強さも変化する。
Normalize Light Intensity to Areaをオンにすると、光源の強さが正規化される。必要に応じて切り替える必要がある。

Houdini sidefx official Lesson6 Attributes & Variables

Details View

Mayaで言うところのスプレッドシート
各頂点位置やUV座標等を一覧したり、選択ノードに関わるマテリアル一覧など様々な情報を俯瞰してみることができる

ノード情報の確認

Network Viewでノードを中ボタンクリックすると、ノードに関する情報を一覧表示するポップアップウインドウが現れる。

Materialノード

マテリアルをオブジェクトにアサインする場合はまずオブジェクトにMaterialノードを接続し、Materialノード内でMaterialパラメータを使用し、どのシェーダを使用するか指定する。
グループノードを事前に用意し、特定のコンポーネントのみにMaterialをアサインする事もできる。

20140420_02_1

20140420_02_2

SHOP

Shader Operationのこと、多分。
シェーダーはSHOPツリーの中で管理される。

Measureノード

入力されたノードに関して様々な計測をするためのノード
TypeパラメータでAreaを指定すると、与えられた各面の面積を計算する。Override Nameをオンにし、Attributeパラメータで任意の名前をつけることができ、以降のコネクションにおいて、付けられた名前を使用することができるようになる。

20140420_02_3

AttribPromoteノード

指定したコンポーネントを走査し、平均値や最大値などを取り出すためのノード。
20140420_02_4

Original Nameによって計算するアトリビュート名を指定
Original Classによって走査するデータタイプを指定し、New Classによって出力先を指定。
Promotion Methodによって計算方法を指定。
Change New Nameをオンにし、New Nameで出力されるパラメータ名を指定する
Delete Originalがオンだと、計算に使われたパラメータの情報はAttrib Promoteノードを経由した時点で削除される。パフォーマンスと利便性のバランスを考えて適宜使用するのが良いのだろう。

上記の例では入力された各面の面積合計値を計算している。

Breakノード

input1に入力された形状を、input2に入力された形状で分断するノード

Connectivityノード

1ノードに複数のジオメトリ形状の塊がある場合、コンポーネント単位で所属しているジオメトリのIDが取り出せるノード。

20140420_02_5

上図の例では、それぞれのジオメトリにの塊を表すIDパラメータ名をchunkと名づけている。各塊にはIDが振られ、それぞれint値で表される。
また、この時付けられた名前は、以降のノードで使用できる変数名としても同時に定義される。
Details ViewのDetailタブを確認すると、varmapパラメータが作られていることがわかる。

chunk -> CHUNK

20140420_02_7

以降のノードでは、$CHUNKという変数が使用可能である

Partitionノード

1つのノードに含まれる複数のジオメトリの塊を個別に取り出すためのルールを決めるノード。

20140420_02_6

チュートリアルがここで終わったのでよくわからないが、個別の塊にshape_IDというグループ名前が付けられて出力されるということだろうか?

AttribCreateノード

以前も少し触ったノードだが、もう少し詳しく。
20140420_02_8

ポリゴンノードの出力から、新しいアトリビュートを生成。
ariという名前のfloat3アトリビュートを生成している。
ariアトリビュート内の各要素は、入力されたポリゴンデータに含まれる $CR,CG,CBの値をそのまま受け取り、そのまま出力する。
例えばここで各要素をシャッフルしたり、それぞれの要素に何かしらの計算を行いつつ出力を行うなど、かなり便利な使い方ができそう。

Attrib Transferノード

input1に与えられたジオメトリにinput2に与えられたジオメトリから任意のデータを付加して出力するノード

20140420_02_9

grid1にsphere1からアトリビュートを転写する。

20140420_02_10

転写するアトリビュート名をCd(頂点カラー)に指定

20140420_02_11

conditionタブで、影響を与える最大距離など、細かい設定ができる。

Trailノード

入力されたジオメトリの動きの軌跡を作成できる。

パーティクルの基本的な制御

POP Networkノード内でパーティクルを発生させる。
エミッターとなるオブジェクトを作成し、input1に接続
popnet内にsourceノードを作成し、パーティクル作成方法を指定

20140420_02_12

パーティクルに対するアトリビュート転送

popnet内にAttribTransferノードを作成。
下図の例ではpopnetのinput2に接続されたジオメトリから頂点カラー(Cd)をパーティクルに対して転送している。

20140420_02_13

popnetでのgroupノード

popnet内でのgroupノードは、特定の条件に当てはまるパーティクルの取り出しに使うことができる。

20140420_02_14

上図の例では、頂点カラーのR値が0.6より大きくなった全パーティクルをredというグループ名で取り出せるようにグルーピングしている。

このグループ名は、以降に続くノードで使用できる。

パーティクルに外力を与える

sourceノードの下流にforceノードを接続する。

パーティクルの動きを制限する

LimitノードやSoftLimitノードを接続する。
20140420_02_15

これらのノードは、パーティクルに何らかの意味を持つ範囲情報を与えることができる。
例えば、その範囲を超えたら消滅する。範囲の境界でバウンスするなどを指定できる。
言ってみれば、コリジョンノードとも言えるかもしれない。