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

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

Houdini sidefx official Lesson5 Procedual Animation

エクスプレッションのフレームナンバー表記

$F :フレームナンバーをint型で計算
$FF :フレームナンバーをfloat型で計算

Global Animation Optionsでシーンの時間をfloat型にする

下記オプションで変更可能

20140419_01_0

チャンネルエディタのカーブ精度を変更する

Settings > Curve Quality > 任意の精度レベル

エクスプレッションで使う変数やエイリアスを設定する

Edit > Aliases and Variables

20140419_01_1

ウインドウ下部の入力ボックス左側が名前、右側が値。
入力してエンターキーで変数を作成できる。

実際にここで作成した変数は、エクスプレッションなどで$マークに続けて変数名を書くことで使用できる。

Houdini shell terminal

Houdini同梱版のshell?
Applications>Houdiniインストールフォルダ内にある

hconfigなど、Houdini独自のアプリが立ち上げられるようだ。
mayapyみたいな存在だろうか?
もう少し使いこなせるようになってから覚えるのでも遅くはなさそうなので、とりあえずこういうものがあるということだけ覚えとく。

タイムレンジに関する変数名

$RFSTART:プレイバックレンジのスタートフレーム
$RFEND:プレイバックレンジのエンドフレーム
$FSTART:設定されている実際のタイムレンジのスタートフレーム
$FEND:設定されている実際のタイムレンジのエンドフレーム

textport

Houdini内のシェルウインドウのようなもの。
exhelp 関数名 などと入力しエンターキーで実行すると関数のヘルプが見れたりする。コマンドを知るにはかなり重要になりそうなウインドウ。

表示
20140419_01_2

Alt+5などでも表示可能。

opname関数

fileノードでの例
実際のモデルファイルは、「tree_01〜16.bgeo」という名前で、このシーンファイルの保存されているフォルダと同階層にある「Lesson5_Tree」というフォルダに格納されている。

また、このファイルノードを格納しているgeometryノード名はtree_01

そこで、Geometry Fileパラメータに以下を書く

$HIP/Lesson5_Tree/opname( “..” ).bgeo

このエクスプレッションでは、以下のようにエクスプレッションが解釈される。

$HIP:シーンファイルが保存されているフォルダパス
opname( “..” )このfileノードを格納しているgeometryノードの名前
“..”は相対パス表記で、親ノードを指す。

よって、親のgeometryノード名を変更すると読み込むモデルファイルのパスも自動的に変化するようになる。

文字列を受け取るパラメータで計算を行うエクスプレッションを書く

例えば、fontノードのTextパラメータなどで$F-1を単純に入力した場合、-1の部分は文字として単純に表示されてしまう。

これを防ぎ、計算結果の文字列を使用したい時は数式部分を「“」で囲む

また、定義済みの数値型変数を使用するような場合は、この必要はない。

便利そうな変数

$OS:この変数名が記載されたノード自身の名前

Houdini sidefx official Lesson4 Keyframe Animation

キーフレームの打ち方

任意の時間でパラメータを設定し、パラメータボックスなどをAlt+クリック
キーがあるフレームは、緑色のマーカーで表示。

20140419_02_1

プレイバック方法の指定

数のボタンを長押しし、サブメニューから選択

20140419_02_2

アニメーション関連ホットキー

↑:順再生 / +command 先頭フレームに戻る
↓:逆再生
←:1フレーム戻る / +command 前のキーフレームへ移動
→:1フレーム進む / +command 次のキーフレームへ移動

ドープシート的キー操作

タイムラインをShift+右クリックドラッグ:操作範囲指定
範囲を中ボタンドラッグ:キー移動
範囲の左右端の数値ボックスShift+中ボタンドラッグ:キータイミングスケール
Shift+右クリック:選択解除

その他のキーフレーム操作

各パラメータボックスをShift+左クリックでチャンネルエディタ表示

オブジェクト選択状態でKキーを押すと移動回転スケールにまとめてキーを打つ

チャンネルエディタ

キーを選択後…
キーの中心ドラッグ:値変更
キーを通る縦ラインドラッグ:時間変更
0キー:タンジェントをフラットにする
9キー:タンジェントをスムースにする

・各種キーコマンドボタン

20140419_02_3

キー選択状態で押すと、タンジェント操作やサイクル方法の設定などができる。色々押して効果を確かめる。

キーフレームにエクスプレッションを指定

通常通りキーを打ち、キーの打たれた時間でターゲットパラメータボックスにエクスプレッションを書くと、次のキーまでの間そのエクスプレッションが有効になる。
この機能により、一定時間の間、ベースになるキーフレームにsin波を足しあわせたモーションを作ることができる。
キーごとに全く違うエクスプレッションで動くモーションも作れる、これはものすごく便利。

Maya絶対はこれを真似るべき。

キーのバウンディングボックス

キーをまとめて選び、Yキーでバウンディングボックス表示

チャンネルグループ

任意のパラメータに打たれたキーの可視性をグループで管理できる
20140419_02_4

グループの作り方はいくつかある

パラメータボックスやラベルを直接チャンネルグループエリア(チャンネルエディタの左上ブロック)にドラッグで作成

左下のチャンネル名右クリックからAdd Channel(s)など

Look AtとPathモーション

HoudiniのGeometryノードは、必ずLook AtパラメータとPath Objectパラメータを持つようだ。
Look Atで指定されるオブジェクトに対し常に一定の軸を向けることができる。(Mayaでいうと Aim Constraint)
Path Objectに指定されたカーブの上に沿うようにオブジェクトを移動させることができる。(Mayaで言うと、Motion Path  )

blendノード

変換マトリクスのブレンドノード
コンストレイン等の動作を行えるようだ。

Houdini sidefx official Lesson3 Digital Assets

ROP Output Driverノード

ROPは、多分Render OPeration
モデルの出力で使った

Output File で指定したフォルダに、Valid Frame Range で指定した範囲の各フレームのモデル形状を個別のモデルファイルとして出力する。

諸々設定したらRenderボタンで書き出し

モデル名は、例えば

$HIP/Lesson3_Rocks/geom/rock_$F3.bgeo

などと指定する。

エクスプレッションで使用するフレームナンバー

通常の文字列フォーマットのように$F3などとすると、ゼロパディングされた数値に置き換えられる。

GPlay(Geometry Viewer)

Houdiniのインストールフォルダにある。

Point Jitterノード

つないだオブジェクトのポイント位置をランダム化する

20140419_03_0

20140419_03_1

instanceノード

オブジェクトインスタンスのためのノード
pointを持つ形状ノードを含めると、それぞれのポイントにオブジェクトのインスタンスが作成されるようだ。
複数オブジェクトを含め、全ポイント上にオブジェクトを配置する場合は、mergeノードを使用し、必要なオブジェクトをマージしたあとで、mergeノードを有効化する。
オブジェクト階層に移動することで結果が確認できる。

インスタンスするオブジェクトは Instance Objectパラメータによって指定する。

Instance Objectパラメータには、Network Viewから直接ノードをドラッグ&ドロップしてオブジェクトを指定することもできる。

Reference Copy

ノードの右クリックからReference Copyを選択すると、コピー元のすべてのパラメータを参照した状態でコピーオブジェクトが作成できる。
必要に応じてパラメータの参照をきってノードをユニーク化すると便利。

subnetノード

小さなネットワークを組み立てるためのコンテナノードを作成できる
20140419_03_2

入力プラグは4つで固定のようだ

Edit Parameter Interface…

任意タイプのパラメータを作成するためのツール。
Mayaで言うところのAdd Attributeのようなもの。

20140419_03_3

操作したいノードを選んだ上で、パラメータパネルの歯車ボタンから呼び出す。

3ペインあり、左から順に

追加するパラメータのタイプ
追加先
パラメータの詳細

となっているようだ。

Rangeパラメータなどを使用して値の範囲を設定することもできる。

パラメータを追加したらApplyボタンを押して変更を適用する。

ここで追加したパラメータは任意のアトリビュートへのエイリアスとして使うととても便利。

Digital Asset

作成したノードネットワークをファイルに纏め、あとから別のシーンに流用することができる。このファイルをDigital Assetファイルと呼ぶ、拡張子はotl。

File > Install Digital Asset Library > 登録したいotlファイルを選択

こうすることで、Network Viewなどで

Tab > Digital Asset > 保存されたノード

という手順で呼び出せるようになる。

シェルフ

シェルフはシェルフエリアの+ボタンから行う。
シェルフへは、ノードを直接ドラッグするなどしてコマンドを登録できる。他にも細かい挙動を設定できそうなので、よく調べる必要がある。

20140419_03_4

Houdini sidefx official Lesson2 UI&Modeling

コンポーネントの削除

モデルのコンポーネントを削除するとblastノードが作られる。

コンポーネントのグループ化

任意のコンポーネントを選択してModel→Groupでコンポーネントのグループを作成することができる。

例えば、任意の面をFacesという名前のグループに入れておけば、以降のポリゴン編集処理の時、編集ノード内で処理対象にFacesグループを簡単に指定できる。

この方法で、上流にあるすべてのグループ名を下流ノード内で使用できるが、ある編集ノードを挟んで、より上位に存在するグループ名を指定して新たな編集を行う場合、古い方の編集が行われる前のコンポーネントに対して編集が行われるため、面が2重化するなど好ましくない状況を生みやすいように感じた。

セレクションモードのショートカット

1 オブジェクト選択(オブジェクトレベルに移動)
2 point選択
3 Edge選択
4 Primitive選択
5 Vetices選択

ビューポート変更のショートカット

Space+数字キー

Network Viewのカーブ種類を変える

Sキー

スパイラルカーブを作る

lineノードにpointノードを接続し、standardカテゴリのpositionパラメータを操作する。

X = cos( $PT ) * 10 + noise( $TX , $TY , $TZ )
Y = $TY + noise( $TX , $TY , $TZ )
Z = cos( $PT ) * 10 + noise( $TX , $TY , $TZ )

のように、各頂点番号を使用してエクスプレッションを書くことで、各頂点に対し自動で位置計算が行われる。
これはめちゃくちゃ便利

20140414_01_0

sweepノードとskinノード

sweepノード
カーブ上のポイントを節にして断面形状を配置するノード

input1に断面となるポリゴン、またはNURBSカーブを入力する。
input2にsweepの経路となるカーブを入力する。

後で分かったが、sweepノード内のoutputオプションの中でSkin Outputの項目があるため、skinノードを使用せずとも同様の処理はsweepノード内で完結できるようだ。
同時にAngle Fixオプションも併用することで部分的に痩せない状態でチューブを作成できる。

20140414_01_6

20140414_01_5

skinノード
Mayaで言うところのloftのようなノード
入力された断面オブジェクト同士をつないでチューブのような形状を作成するのに使う。

20140414_01_3

20140414_01_4

このチュートリアルでは、sweepによって配置された複数の断面メッシュをつないで一本のチューブに仕上げるのに使った。

sweepノードのscaleパラメータに 変数 $PT を使用するエクスプレッションを書くと、ポイント番号ごとにスケールが変化するように断面形状が作成できる

20140414_01_1

20140414_01_2

resampleノード

カーブ上のポイントをリサンプリングするためのノード。
粗いポイントによって作られたカーブ上の点をより細かい精度で取り出すときに使う。

Lengthパラメータで各点の間隔を指定。
Maintain Last Curveのオプションで、終端の点を保持するか決定する。

便利ホットキー

Space+H ホームポジションに戻る
Space+G 選択アイテムにフォーカス

ジオメトリレベルのノードを別のジオメトリレベルへ

単純に、移動元でCtrl+X、移動先でCtrl+V
すごく乱暴な気がするけどこれでいいらしい

fuseノード

頂点同士を結合するノード
tubeノードなどを作成し、End Capをオンにした場合、キャップとボディは結合されていないため、このノードをひとつ噛ませておくとよい。

copyノードの動作について

copyノードの右側のコネクタはコピーオブジェクトの散布先を入力する。
散布先がポリゴンメッシュならメッシュ内の各頂点が散布先として指定される。

cookieノード

いわゆるオブジェクトのブーリアンノード
交差している部分の相関線なども取り出せるようだ

形状データの分岐

sphereノードなどからは、純粋な形状が出力される。
この出力を複数のtransformノードに分岐させることによって、それぞれの形状データに個別の処理を行える。
下図はひとつのsphereノードから穴を開けられるオブジェクトと、穴を開けるオブジェクトを配置するためのテンプレートオブジェクトをsphere1ノードから生成している。

20140414_01_7

20140414_01_8

convertノード

NURBSからポリゴンなどのタイプ変換や、メッシュの粗密を変換できるノード

sculptノード

入力されたオブジェクトをスカルプトできるようにするノード

Houdini sidefx official Lesson1-2 Particle

このチュートリアルでは、球体から発生したパーティクルをティーポットの形状をゴールとし、最終的にティーポット型のパーティクル集合を作成するという内容。

まずは球体とティーポットを作る

はじめにsphereを作る。
その後、sphere_object1内で Platonic Solids ノードを作成し、Solid TypeをUtah Teapotに

20140413_01_0

20140413_01_1

20140413_01_2

popnetノード

popはParticle OPerationのこと、多分。
popnetノードを使用し、パーティクル処理を作成する。
popnetとは、Particle OPeration Networkのことだと思う。(多分)
このノードの中にパーティクル処理のためのネットワークを作成するようだ。

※チュートリアルが作成された時点では、popnetノードが旧式のものしかなかったようで、Houdini 13ではpopnet – old というタイプで定義されているノードを使用する。

popnet – oldノードが作られた時点では、中身は空っぽでなんの動作も行わない。

オブジェクトからのパーティクル放出

エミッタオブジェクトをpopnetのinput1に、収束するターゲットオブジェクトをinput2につないでおく。
popnet-oldに入り、sourceノードを作成。

ソースはinput1に入力されたジオメトリオブジェクトになるので、 Geometry SourceをUse Firse Context Geometry にする。

この時点で、球体の各頂点からパーティクルが発生するようになっているが、速度等を持たないので動かない。

初速を持たせるために、Attributesタブで Initial Velocity を Add to inherited velocity にする。こうすることで、親から継承された速度ベクトルに加え、自らが定義した速度を持ってパーティクルが放出されるようになる。

Velocityは速度ベクトル。Varianceは速度ベクトルに加えられるランダム速度ベクトル。x=3であれば、ランダム範囲は -3~3

20140413_01_3

パーティクルを引きつけるattractorノードを作成

attractorノードを作成する。

sourceノードでパーティクルを放出するジオメトリを選んだ時の要領で、Geometry Source を Use Second Context Geometry に

これで、input2に接続されたティーポットオブジェクトがパーティクルの引きつけターゲットになるが、このままではかなりラフなティーポットの頂点が引き付けターゲットになるので、引きつけが成功してもティーポットには見えない。
また、現時点ではティーポットの点からは引き付けの力が発生していないので、パーティクルの動作には変化がない。

ティーポットの表面に収束先パーティクルを作成する

scatterノードをつなぎ、ティーポットの表面にパーティクルを生成する

scatterで作られたパーティクルに力を与える

pointノードを作成する

pointノードのforceタブで各種力を設定可能。
Radiusを Add Radius に
Force Scale を Add Force Scale に
Radial Force を Add Radial Force に

popnet-old内のattractorノードに戻り、Attractor Use を Single point per Particle に

こうすることで、パーティクルとアトラクターの頂点が1対1で対応し、正しい軌跡でティーポットに引き付けられるようになる。

※この設定を行わない場合、1粒のパーティクルに影響を与える頂点がティーポット上にある全ての点になり、それぞれの力の合力が一つのパーティクルに作用するため、パーティクルは発生後に非常に高速で飛んでいってしまうのだと思う。

dragノード

現時点で、放出されたパーティクルはティーポットになんとなく引き付けられているように見えるが、収束すべき点に向かって移動する際の減速が弱く、なかなか収束しない。

よって、dragノードを使用して強制的にパーティクルを減速させる。

dragノードを作成し、 attractorの下流に接続する

※この時、dragノードの可視性をオンにしないと効果が見えないので注意

20140413_01_4

タイムレンジを変更する

デフォルトのタイムレンジ 0〜240フレームの間では収束が確認できないのでタイムレンジを変更する。

Global Animation Options ウインドウを開き、Endフレームを500〜1000程度にし、Applyで決定する。

この時、現在あるキーを新しいタイムレンジにフィットさせるか聞かれるので、必要に応じたオプションでメニューを閉じる。

細かいパラメータ調整で気持よく終息するように調整する

収束の具合はpointノードの各種forceパラメータの調整で。

パーティクル放出のエクスプレッションを設定する

sourceノードのパラメータを設定

Impulse Activation = $F < 50
Impalse Birth Rate = $NPT
Const Activation = 0
Const Birth Rate = 0

※Impulseアクティベーションは放出を行う条件
※$NPTは、放出ソースに指定されているオブジェクトの頂点数

Houdini sidefx official Lesson1-1 プロキシモデルとランダム配置

ノードタイプには、Geometryと各種形状ノードがある。
Mayaで言うところのTransformがGeometryにあたり、内部に各種形状ノードネットワーク、つまりMeshなどのShapeノードと、それを操作するHistoryノードが格納されている状態。

オブジェクト内には複数の形状を保持できる。
通常通りオブジェクトを作り、Geometryレベルに入ってBOXノードなどを追加することで、複数の形状を保持できる。
表示のオンオフは、ノード右側の表示ボタン(水色)で行える

自動的なパラメータの受け渡し

パラメータ上で右クリックしCopy Parameter。
同期を行いたいパラメータの上で右クリックしPaste Copied Relative References。
ペースト先に「ch(“パラメータのパス”)」が自動的に記入され、コピー元の値が受け取られるようになる。※記入されるのはエクスプレッション

基本的にはペースト先はコピー元の値を受け取るようになるが、パラメータの中ボタンドラッグで値を変更すると、受け取った値にオフセット値として新たに値が足しあわされる。

パラメータ名の確認

ノードプロパティのラベルの上でカーソルを静止させるとポップアップヘルプが表示され、その中に各パラメータ名が表示されている。

パラメータの表示モード

パラメータのラベルをクリックすると、実際の値と仮の値(エクスプレッション文字列など)を切り替えることができるようだ。

mergeノード

ジオメトリレベル内で複数の形状を作成し、mergeノードにコネクトすることで複数の形状をまとめて表示できるようになる。

20140413_02_0

20140413_02_1

ノードの状態を手早く確認する

各ノードを中ボタンでクリックすると、各種パラメータの状態がポップアップ表示される。

ノードパラメータへのパス

自身のパラメータへのパスはパラメータ名を単純に使用
ch( “tx” ) など

別ノードへのパス以下のように書く
ch( “../sphere1/tx” ) など

上記の例は、box1からsphere1のパラメータへアクセスする場合の書き方。
自分と同階層にあるノードへアクセスするため、一旦上位階層へ上がってから目的のノードを指定する。

パラメータのアニメーション(キーフレーム)

パラメータラベルをAltキーを押しながらクリックすると、各値のボックスの値にキーが打たれ、緑色に変わる。時間を動かし、パラメータを変化させ、同じようにAltを押しながらラベルをクリックで新しいキーを打つ。

プロシージャルアニメーション

sin関数を使用する例
パラメータの入力ボックスに sin( $F ) などと入力。
$Fは、現在フレーム番号を表す。

ノードの直接生成に関して

Network ViewでTabキーからノードを作成する際、現在見ているレベルによって作れるノードの種類が変わる。

transformノード

Mayaのtransformノードとは違い、Houdiniでのtransformノードはオブジェクトのローカル空間内での変換用に用いられるようだ。

下流ノードをお手軽に作成

上流ノードの出力コネクタを右クリックし、下流に作成したいノードをポップアップメニューから選択、または、フィルタを使用していつも通りにノードを作成する。

attribcreateノード

下流ノードのパラメータへのエイリアスが作れるノード?
チュートリアルでは、scatterノードの上流にattribCreateノードを置き、アトリビュート名をpscaleとすることで、散布されたオブジェクトのスケールを変更した。動作に関して要調査

paintノード

スキンウエイトやダイナミクスのアトリビュートを直接モデルにペイントできるノードのようだ。attribCreateの下流につないで使用した。
attribCreateから出力される値に対し行う処理で使われる値をペイントする。例えば、入力値に対する倍率や加算する値など。

Override Colorパラメータを有効にし、上書きするパラメータ名をデフォルトの「Cd」から上流にあるattribCreateで指定した「pscale」パラメータを操作するように書き換えた。

Merge Modeでペイントした値が元の値に対してどのように処理されるかを決定する。

20140413_02_2

20140413_02_3

このチュートリアルでは、シンプルなボックスをまず最初に配置し、switchノードへ、ボックスとLSystemによって作られた樹木を接続。
ボックスはプロキシオブジェクトとして扱い、switchノードで出力するモデルデータを切り替えるようにし、精細な樹木と交互に切り替え表示できるようになった。

copyノードのstamp

コピーしたオブジェクトそれぞれ個別に与える事ができるパラメータを作成できる。このパラメータでは、rand関数などを使用してそれぞれのオブジェクトにランダムな値を与えることもできる。

stampパラメータの作成

まずは、copyノードのstampタブを見る

20140413_02_4

stampタブの下部に各変数を生成するためのエリアがあるので、任意の名前と値をセットする。この値は、いつも通りエクスプレッションを記入することができる。

20140413_02_5

$PT という変数は、コピー先の各頂点番号を指す。

20140413_02_6

ここでは、rand関数に各頂点番号を与え、返ってくる0〜1の値に対して360をかけることで、ランダムな角度を計算できるようにしている。

stampパラメータの使用

使用するパラメータに、以下のように記述する

stamp( “copyノードのパス” , “使用するstampパラメータ名” , 0 )
この時、Stamp Inputチェックボックスは忘れずにオンにしておく。

結果

最後に、ランダムなY回転を行って配置したLSystemオブジェクトをちょうどいい数になるようscatterのNumber Of Pointsパラメータを調整して終了。

20140413_02_7

20140413_02_8

マテリアルが設定されていないので真っ白w