Procedural plants generation in houdini
My current development. Digital asset for creating production ready animated trees and other plants. A few types of wind (Real time wind system and accurate dynamic…
LSystem チュートリアル
Procedural plants generation in houdini
My current development. Digital asset for creating production ready animated trees and other plants. A few types of wind (Real time wind system and accurate dynamic…
LSystem チュートリアル
Rigid Body
剛体シミュレーション。
Rigid Bodyの作成は、Rigid Bodiesタブから RBD object 選択後、Rigid Body化するオブジェクトを選択し、Enter
Rigid Bodyの基本ノード構成
torus_object1に対してRigid Body化した直後
torus_object1の内側
通常通り、ジオメトリが作成され、restにつながっている。
restノードはソリッドテクスチャをオブジェクトへ追従させるために使うノードらしい。
dopimportノードは、別の階層にある DOP Networkへジオメトリデータを転送するのに使っている
Object Mask = dopobjscreatedby(“/obj/AutoDopNetwork/torus_object1”)
AutoDopNetworkの内側
dopimportで出力されたジオメトリデータをRBD Objectノードで受け取っている。
SOP Pathパラメータにて、どのジオメトリを受け取るか指定
SOP Path = opinputpath(“/obj/torus_object1/dopimport1”, 0)
Rigid Body Solver
実際にシミュレーションを行うノード。
Solver Engineパラメータで、使用するソルバを指定する。
おそらくBullet以外を使うことは殆ど無いんじゃないだろか
以降のコネクションには、ここでリジッドボディに関連するジオメトリをまとめるmergeノードと、重力等の外力ノードが並ぶ。
これに続けてWindノードなどをつないで外力を足すことも可能。
Ground Plane
無限遠のCollisionオブジェクトを足すことができる。
Rigid BodiesタブからGraund Plane。
Rigid Bodyオブジェクトの初期状態
各RBD ObjectノードのInitial Stateタブにて設定。
Collisionのパフォーマンス調整
RBD ObjectのCollisionsタブにて設定
Modeの変更可で処理の高速化ができそう。
Modeパラメータは、実際に各RBD オブジェクトがどのようなCollision形状を使用して衝突判定を行うかを決定する。
このCollision形状を確認するには、Show Collision Geometryをオンにし、一度初期フレームに戻る。
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オブジェクトが追加される。
RBD Objectはいったんmergeノードにまとめられた上で各ソルバノードへジオメトリの出力を行うようだ。
これは、Static RBDオブジェクトの追加も同様。
閉じていない形状のRBDオブジェクト
デフォルト設定では、RBDオブジェクトは閉じていない形状でも閉じてい状態で計算される(Bulletの制限?)
ボールはチューブの内側に落ちず、チューブが持つボリュームに乗る。
これを防ぐには、チューブの表面に厚みをもたせ、形状を閉じておく必要がある。
カーブ上に散布するオブジェクトの向き
ここでは、散布されたオブジェクトをそれぞれ次のオブジェクトに向けるある一点のオブジェクトに向いてほしい方向は「次のポイントの位置-現在のポイントの位置」で表わせる。
pointノードについてもう少し
pointノードのinput2は、ポイント参照用のオブジェクトを入力できる。
参照用オブジェクトを使用すれば、法線方向の計算などで使用することができる。
上図の例では、上見えているカーブを複製し、複製されたカーブを少し下にずらしている。
複製されたカーブなので、各頂点番号は一致している状態。
ここで、上のカーブをpointノードのinput1に、下のカーブをinput2へ接続し、pointノードのNormalに以下のエクスプレッションを仕込む。
NormalX : $TX2-$TX
NormalY : $TY2-$TY
NormalZ : $TZ2-$TZ
$TX2はinput2側の頂点位置を指す。
こうすることで、input1の各頂点法線は、input2の各頂点との差分ベクトルを持つようになる。
Dominoチュートリアル
このチュートリアルでは、まずドミノピースを並べるためにカーブを作成する。その後、カーブをResampleし、等間隔で頂点をもたせる。
最終的には、このカーブが持つ各頂点上にピースを複製して散布する。
Resample済みのカーブを受け取るSortノードを作成し、ソート方法をShiftにした上でOffsetパラメータを変更すると、各頂点番号が循環する。
ここでは、この性質を利用して、全く同じ形状で一つ頂点番号がずれたカーブを法線方向計算のための参照先として利用する。
頂点数が同じで、元の頂点の並びが同じカーブ同士なら、片方のカーブ上にある頂点番号を一つシフトすると$TXと$TX1の差は、ちょうど隣り合う頂点の位置の差分となる。
よって、この値をNormalに与えれば各頂点の法線は、強引ではあるが次の頂点方向を向くようになる。
この時、末端のポイントだけは正しい方向を向けられないので、DeleteノードをPointノードの後ろに配置し、ポイントの削除を行う。
オブジェクトの頂点上にRBDオブジェクトを散布する
任意のオブジェクトを選択した状態で以下を押す
すると、ダイアログが開く。RBD Packed〜 と RBD Point〜の違いが不明なので調べる。
その後、散布したいオブジェクトを選択し、Enterキーで決定。
散布された各オブジェクトは、通常通りRBDオブジェクトとして動くようになる。
あとは、地面を配置してドミノをスタートさせるオブジェクトを作り、最初のピースを倒すだけ。
RBD Object と RBD Fracture Object
RBD Objectは、一つのジオメトリに複数ピースのジオメトリが含まれている場合、それらが一塊でなかった場合でも一つのRigid Bodyオブジェクトとして扱われる。
RBD Fracture Objectは、1ジオメトリ内に含まれるすべてのジオメトリを個別のRigid Bodyオブジェクトとして扱う。
RBD Glue Object
糊付けされたように、もともと結合力を持っているRigid Bodyが作成できる。例えば家具など、力が加わることで破壊され、他と切り離されるまでは結合を保とうとする振る舞いが作成できる。
シェルフ内で当該機能が見つけられなかった。
別の方法で作る方法を探る。
RBD Pin(Rigid Body Constraint)
剛体に制限を与えることができる。
以下を押す。対象となる剛体オブジェクトを選んでEnter、Pinの位置を選択し、もう一度Enter
RBD同士をPinでつなぐ
RBD Pin作成時に2つのRBDを選択すれば、それぞれがPinで繋がれる
Rigid Pin Constraintノード
Constrained Objectはコンストレインをうけるオブジェクト
Goal Objectは、コンストレインを与えるオブジェクト
Goal Objectが空欄だとGoal Locationで定められた位置にゴール位置が固定される。
RBD Spring Constraint ノード
バネで剛体をつなぐコンストレイン。
Limit Forceは、バネが切れる力のしきい値のようだ。
低めの値にしておくと、一定の速度がかかった時にバネが消えて、剛体は自由落下する。
その他のRigid Body Constraint
RBD Hinge Constraintや、RBD Angular Constraint等がある。
使用するソルバによって使えるコンストレインが変わるらしい。
破壊可能なRigid Body
RBDを作成後、Make Breakableを押す
破壊のパラメータは Fracture Parameterノード内で操作する。
Particleノード
入力は、左から順にソースオブジェクト、コリジョンオブジェクト、フォースオブジェクト。
パーティクルは、ソースオブジェクトのポイントの位置からIDの順にしたがって発生する。
リアルタイムプレイバックオプション
あまり変わってるように見えないけど、タイムスライダ右側の時計アイコンのオンオフで全フレームを極力高速に連続再生するか、設定されたフレームレートを守って再生するかを決められる。
パーティクルの初期設定
ソースオブジェクトからpointノードに接続し、Particleタブの中で初速等を設定する。
初速に Y=-9.8を入れてみたところ
パーティクルをソースオブジェクトの法線方向に飛ばす
ソースオブジェクトにコネクトされるpointノードで、standardタブにあるNormalの項目をAdd Normalにする
この法線パラメータも初速として考えることが可能。
初速と同様にY=-9.8とすると全く同じ動きをする。
パラメータ名と動作をより正確にマッチさせるなら、Velocityパラメータに$NX,$NY,NZを元にするエクスプレッションを仕込むのが正しい気がする。
パーティクルをランダムな位置から発生させるには
ソースオブジェクトをScatterに接続し、オブジェクトの表面に一度パーティクルを散布し、散布されたパーティクルをパーティクル発生点にする。
Sortノード
入力されたコンポーネントのIDの並びを任意のルールでソートする。
例えば、ソースオブジェクト上のパーティクル発生位置を固定しながら、発生順だけをランダム化したい場合に使うと便利。
Collisionオブジェクト
パーティクルが衝突するオブジェクト。
このオブジェクトは体積を持っているべき。
形状を作成したら、particleノードの2番目の入力にコネクトする
デフォルトでは、Collisionオブジェクトにパーティクルがヒットした際の動作は「消滅」に設定されている。
Hit Behabiour = Die On Contact
このパラメータをBounce On Contactに設定すれば、Collisionオブジェクトにヒットしたパーティクルが跳ね返るようになる。
Collisionアトリビュートは Gain Tangent/Normalのようだ。
Collisionヒット時にそれぞれの方向にどの程度の倍率で力が変化するかを指定できる。
+/- Limit Planeパラメータは、強制的に発生させるCollisionバウンディングボックスと言える。多分オブジェクトを使用するCollisionより高速かつパーティクル抜けがないので、室内シーンなどでは積極的に使うのがいいように思う。
上図は、-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
1
パーティクルの発生点として2つのポイントで構成されるラインを作成
2
ラインの中心にピボットを移動し、transformにつなげて回転させる。
3
このオブジェクトをパーティクル発生源にし、Initial Velocityを持たせて移動するように設定する。この時、Impulse Activationを1,Impusle Birth Rateを$NPTとし、ソースオブジェクトが持つ頂点数分を毎フレーム生成するように指定。
4
パーティクルをAddノードに接続し、By GroupタブでAddパラメータを Groups of N Pointsにし、Nを2にする。
こうすることで、パーティクルが2つ発生するごとに一つのグループにまとめられ、それぞれが別のPolyLineオブジェクトとして扱われるようだ。
5
Skinノードにコネクトし、面を貼って完成
popnet内でのパーティクルグループ
popnetノード内で、パーティクルのグループを作れる。
groupノードを作成し、Createタブで新規作成するグループ名を Group Nameに入力、Createタブ内、Ruleタブでグループに含める条件を入力することで、条件に当てはまるパーティクルをここで作成したグループに含めることができる。
下図は、パーティクルIDを走査し、偶数と奇数でグループを分け、それぞれのグループに別々のカラーとフォースを割り当てた例。
ColorノードやForceノード内で、Source Groupパラメータに、ここで作ったグループ名を入力することで、グループごとの編集が可能になる。
Groupノード内で Ruleタブ内にあるEnableを忘れずにオンにしておくこと。これを忘れると当然効果が現れない。
なお、パーティクルの寿命が尽きた時、全パーティクルが持つIDが変化してしまうため、一工夫して変化させない仕組みを作る必要があるようだ。
CHOPS and Music Driven Animation I
A tutorial on the basics of Houdini chops, and then two examples of music driven animation. The first part looks at how to bring data into a chops network, and&
音に合わせたアニメーションチュートリアル
An update to the earlier series of videos on compositing. Not a real field of expertise for me, so some errors crept in – these are corrected here. I also look at…
Houdiniのレンダーパスチュートリアル
VOP SOP
頂点を直接操作するためのノード
オブジェクトの変形などができるようだ
フルネームでアトリビュート名を表示する
Edit -> Preferences -> Network Editor, Nodes and Trees
で、以下のオプションをオンにする。
こんなかんじでフルネーム表示される。
アトリビュートの型
アトリビュート名の左右にあるボックスは、コネクタであり、値の型ごとにカラーが決まっている。このへんは他のDCCツールのノードエディタと同じ概念。
異なる型同士を接続sる場合は、変換ノードを間に挟む。
変換ノードには、Float to Vector等がある。
各コネクタの上にカーソルを置いて待つとコネクタの詳細情報がポップアップする
これは、型の確認に使える。
VOP SOPノードのボタン
ノードの右側にはボタンが有る。
左から順にデバッグ/バイバス/表示モード切り替え。
デバッグは後に説明がありそう
バイパスはそのノードを一時的に無効化する
表示モードは、全アトリビュート表示、コネクト済みアトリビュートのみ表示、全アトリビュート非表示を切り替えられる。
頂点移動の例
Noiseを使用してGridを変形する。
ここでやってること
1
入力されたメッシュであるglobal1が持つ頂点からそれぞれ Position(Vector)を取得し、Noiseノードに渡す。この時、特にグループなどが指定されていなければ、global1には入力されたメッシュ上にある全頂点が含まれる。
2
Noiseノードの計算結果をDisplacementノードに渡し、移動後の頂点位置を出力する。Displaced Position(Vector)
3
VOP SOPの計算結果を出力するためのOutputノードに、変形後の頂点位置を渡すことで、変形が完了する。
VOP SOPの使い方考察
見たところ、VOP SOP内ではトポロジの変更を行うノード(smoothやsubdivideなど)が作れないようだ。
よって、VOP SOPはすでにあるメッシュなどに対し、何らかの処理をするためのものだと思う。
トポロジ変更はVOP SOPの上流で完了させておく必要がありそうだ。
シェーダーネットワーク
shopでMaterial Shader Builderを作成
このノードの内側に入るとVOP SOPと同じ要領でシェーダーネットワークを編集できるようだ。
Global Variablesノード
出力したい内容に応じて使用する入力値が異なるので、Global Variablesノード内のアトリビュートを適宜切り替えて使用する。
VOPノードの動作は、このノードから出力される値をもとに行われるようだ。
Surface Modelノード
一般的なシェーディングノード。
だいたいこれを使っとけば問題ないらしい。
ダブルクリックすると中身を見ることができる。すでに複雑なネットワークが組まれていることがわかる。
既存のシェーダノード内にあるネットワークを編集する
ノードのラベル部分を右クリックして表示されるメニューから、Allow Editing of contentsを選択すると、ノード名が赤色になり、内部のノードネットワークが編集可能になる。
大体の流れとしては、Global Variable → 任意のチャンネルごとに見た目調整処理 → Surface Model → Surface Output → Collect の順にノードをコネクトすれば良さげ。
アトリビュートのPromote
Material Shader Builder内に存在する各ノードの中から、任意のパラメータへのエイリアスをMaterial Surface Builderノードへ持たせることができる。
外に出したいプラグを中ボタンクリックし、Promote Parameterを選択
こうすると、ノードのパラメータの左側に突起が出現し、Promoteされたことがわかる。
また、Material Shader Builderノードのパラメータを確認すると、パラメータが追加されたことがわかる。
また、Promoteは、パラメータリストに表示されている各パラメータの右端にあるボタンからも行える。
ノード内の未コネクトパラメータをまとめて外にだす場合は、ノードラベル右クリックから Create Input Parameters を選択する
Promote済アトリビュートのExpose
Promoteは、実際には、実体アトリビュートとアトリビュートへのエイリアスの間に値を中継するためのノードが挿入されて行われる。
ノードのPromote済みプラグを中ボタンクリックし、Expose Input Node を選ぶことで、中継ノードが表示される。
上図はdisplacementnml1のscaleアトリビュートはPromote済みで、それをExposeした様子。
この中継ノードを操作すると、値の範囲やタイプなど、パラメータの振る舞いを変更することができる。
Propertiesノード
任意のパラメータを持たせるためのデフォルトでは何のパラメータも持たないノード。Edit Parameter Interfaceで任意のパラメータを追加して使用する。
MaterialパラメータをGeometryノードに渡す
GeometryのMaterialパラメータ欄右端のプルダウンから以下のメニューを選択すると、geometry内のmaterialタブにシェーダが持っているパラメータのエイリアスがまとめて表示されるようになる。
この操作により外へ出されたパラメータは、マテリアル本体が共有されていても、値は共有されないようだ。
つまり、ひとつのシェーダを使いまわしてバリエーションを作成することができる。
これが、アトリビュートとチャンネルの違いということなのだろうか?
ちょっとぴんとこないので、あとで調べる。
オブジェクト内に直接シェーダーを埋め込む
オブジェクトの内側で SHOP Networkノードを作成するとオブジェクトに、シェーダーを埋め込むことができるようだ。
その後、GeometryノードのMaterialタブにて使用するシェーダーを選ぶ際、以下のようにオブジェクトツリー内のシェーダーが選択できる。
また、この時、Export Relative Path を選択してからマテリアル指定を完了すると、相対パスでマテリアルが指定されるため、Geometry自体が階層を移動してもマテリアルのアサインは保たれる。
Displacementの最適化
Displacementはデフォルトの設定では、欠けが発生するなどして、正しくレンダリングされない(チュートリアル中に理由が詳しく述べられているようだけど、よく聞き取れず)
これを回避するためには、Propertiesノードを作成し、レンダリング用の特別なアトリビュートを作成と、シェーダネットワーク末端のCollectノードへ接続する。
アトリビュートの追加はPropertiesノードで通常通りEdit Parameter Interface
For Renderingタブ → mantra → Shading → Displacement Bound
Displacement Boundの値を上げることで、精度が上がり、正しくレンダリングできるようになる。
それで出来た草シェーダ
VEXとVOP考察
VEXは、Vertex Expression?
VOPで作成するノードグラフは、実際にはVEXコードをグラフィカルに表示しているだけのようだ。
また、Material Shader Builderのパラメータを見ると Compilerの項目がある。これが意味するところは、リアルタイムにVEXがコンパイルされ、最適化された状態で常に使用されるということなんじゃないだろうか。
VEXのコードを表示するには
VOPの操作による処理を記述できるノードを右クリックし、View VEX Code を選択する
※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が作成される。
Material Paletteにて任意のシェーダを作成し、Materialノードアイコンをオブジェクトにドラッグして適用できる。
マテリアルによるかもしれないが、ノードのダブルクリックで内部のノードネットワークにアクセスできる。
MaterialはGeometryノードに接続されるようだ。
上図は、sphere_object1にuvmapMaterialをアサインした直後の様子。
UV作成(プロジェクション)
TextureタブでUVProject選択後、任意のコンポーネントを選んでEnter
この後、ProjectionパラメータをCylindicalなどに設定することで、それぞれの方法でUVプロジェクションできる。
通常のマニュピレータを使用して、プロジェクションオブジェクトも操作できる。
UV頂点とモデル頂点の選択
通常の頂点は選択ツールで選択する
UV頂点はUVEditノードのハンドルで選択する。
うっかり選択ツールで選択すると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で決定
細かい調整は、uvpeltノード内のiterationsパラメータなどを操作して行う
ここで作ったUV島はuvpeltノード内のCreate Output Group と Output Groupアトリビュートによって名前をつけておくことができる。
Frameタブのパラメータで、ここで作られたUV島の配置を調整できる
便利な選択モード
Select Connected Geometryをオンにし、ConnectivityをUVにしておくと、UV選択時に連続したUV島のみをまとめて選択できる。
UVを直接編集する場合は、任意のUVを選択して Texture>UVEdit
Select Connected Geometryをオフにし、 Select Front Facing Onlyをオンにした上でUVを選択すると、裏返っていない部分のUVのみをまとめて選択できる。
また、この時、そのまま移動すれば指定された範囲がまとめて切り離され移動できる。非常に便利。
UVの微調整 UVBrush
スカルプト感覚でUV調整できるツール。
右クリックメニューなどで細かい動作の変更も可能
ノードのアトリビュートでも調整可能
UVの微調整 UVEdit
Soft Radius 任意の頂点を動かしたあと、Soft Radiusパラメータを操作すると、周辺のUVがスムースに追従する。
UVのグループ化を使うテクニック
UVは、その他のジオメトリコンポーネントのようにグループ化することができる。
ここでは、とりあえず半身分のUVをミラーするため、以下の手順でUVを作成した。
各部位ごとにUV島に名前をつけておく。
groupノードをコネクトし、groupノードのBoundingタブからど真ん中を通るようにバウンディングボックスサイズと位置を調整することで、半身のUVをすべて選択できる。
groupノードでは以下のように設定した。
UVのミラーリング
attribMirrorノードをコネクトし、任意の位置を中心に反転するように設定。
copyノードについてもう少し
・コピーされたオブジェクトの姿勢制御
Transform Using Template Point Attributesオプションをオフにすると、コピーされたオブジェクトはコピー前の姿勢を保って複製される。
・stampアトリビュート
stampアトリビュートの作成は、あくまでもコピー時に参照される準備を行うためのもの。
実際には個々のコピーオブジェクトが生成されるときに使用される。
stampアトリビュートを使用するかどうかの判断は、入力されたオブジェクト内のエクスプレッションでstamp関数を使用して参照する記述の有無による。
カメラ
カメラの作成はCommand+シェルフのカメラボタンから。
こうすると、現在シーンを見ているカメラの複製が作られる。
カメラのマニピュレータとホットキー
・Orientation Handle
カメラ本体または注視点を固定しながらカメラワークを決められるのがとても便利。
・Focus Handle
被写界深度のための設定が簡単に行える
・Frustam Handle
画角やNear/Far Clip Plainなどを決められる。
中央のボックスをドラッグしてクリッププレーンを決める
周囲の四角をドラッグして画角を決める
カメラの切り替え
ビューポートの右上にあるHUDボタンから任意のカメラを選ぶ
カメラのシーケンスを組む
Switcherノードに任意のカメラを複数コネクトする
このSwithcerノードはビューポートのHUD内にも表示される。
ビューポートをSwitcherノードで覗き、Swicherノード内のSwitch Cameraアトリビュートを切り替えれば、任意のカメラでビューポートを見ることができる。
キーフレームを打てば、指定時間でカメラを切り替えることも可能。
レンダリング
レンダリングを行う際は、はじめにレンダラーノードを作成する。
Mantra:標準搭載のスキャンラインレンダラー
Mantra-PBR:物理ベースレンダラー
その他:サードパーティ製レンダラー
Houdini で作業を完結させるなら、Mantra系レンダラーを使えば良い。
個々で作られたレンダーノードはoutコンテキスト内にぶら下げられる。
Mantraのレンダリング設定
・レンダリングするフレームレンジを設定
Render Any Frame:現在フレームのみレンダリング
Render Frame Range:指定した範囲のフレームをレンダリング
Render Frame Range Only(Strict):謎。厳密なフレームレンジ?要調査
・レンダリングノードごとに使用するカメラを指定
・レンダリング結果の出力先を指定する
Output Pictureにipが指定されているとレンダリング時にMPlayアプリケーションが立ち上がり、リアルタイムにレンダリングの様子が見られる。
フルパスで出力先を決めることもでき、フレーム番号を使うエクスプレッションを使用して出力ファイル名を指定することで、連番画像を吐き出すことができる。
(例)$HIP/Lesson7_Render/Lesson7_$F4.jpg
・レンダリングクオリティの調整
Samplingタブ内の調整を行う
SamplingパラメータやJitter、Noise Levelパラメータなどを使う
・被写界深度を使う
Samplingタブの中で、 Enable Depth of Fieldをオンにする
ライトのタイプ
Areaライトの注意点
デフォルト設定では、ライトのサイズに応じてライトの強さも変化する。
Normalize Light Intensity to Areaをオンにすると、光源の強さが正規化される。必要に応じて切り替える必要がある。
Details View
Mayaで言うところのスプレッドシート
各頂点位置やUV座標等を一覧したり、選択ノードに関わるマテリアル一覧など様々な情報を俯瞰してみることができる
ノード情報の確認
Network Viewでノードを中ボタンクリックすると、ノードに関する情報を一覧表示するポップアップウインドウが現れる。
Materialノード
マテリアルをオブジェクトにアサインする場合はまずオブジェクトにMaterialノードを接続し、Materialノード内でMaterialパラメータを使用し、どのシェーダを使用するか指定する。
グループノードを事前に用意し、特定のコンポーネントのみにMaterialをアサインする事もできる。
SHOP
Shader Operationのこと、多分。
シェーダーはSHOPツリーの中で管理される。
Measureノード
入力されたノードに関して様々な計測をするためのノード
TypeパラメータでAreaを指定すると、与えられた各面の面積を計算する。Override Nameをオンにし、Attributeパラメータで任意の名前をつけることができ、以降のコネクションにおいて、付けられた名前を使用することができるようになる。
AttribPromoteノード
指定したコンポーネントを走査し、平均値や最大値などを取り出すためのノード。
Original Nameによって計算するアトリビュート名を指定
Original Classによって走査するデータタイプを指定し、New Classによって出力先を指定。
Promotion Methodによって計算方法を指定。
Change New Nameをオンにし、New Nameで出力されるパラメータ名を指定する
Delete Originalがオンだと、計算に使われたパラメータの情報はAttrib Promoteノードを経由した時点で削除される。パフォーマンスと利便性のバランスを考えて適宜使用するのが良いのだろう。
上記の例では入力された各面の面積合計値を計算している。
Breakノード
input1に入力された形状を、input2に入力された形状で分断するノード
Connectivityノード
1ノードに複数のジオメトリ形状の塊がある場合、コンポーネント単位で所属しているジオメトリのIDが取り出せるノード。
上図の例では、それぞれのジオメトリにの塊を表すIDパラメータ名をchunkと名づけている。各塊にはIDが振られ、それぞれint値で表される。
また、この時付けられた名前は、以降のノードで使用できる変数名としても同時に定義される。
Details ViewのDetailタブを確認すると、varmapパラメータが作られていることがわかる。
chunk -> CHUNK
以降のノードでは、$CHUNKという変数が使用可能である
Partitionノード
1つのノードに含まれる複数のジオメトリの塊を個別に取り出すためのルールを決めるノード。
チュートリアルがここで終わったのでよくわからないが、個別の塊にshape_IDというグループ名前が付けられて出力されるということだろうか?
AttribCreateノード
ポリゴンノードの出力から、新しいアトリビュートを生成。
ariという名前のfloat3アトリビュートを生成している。
ariアトリビュート内の各要素は、入力されたポリゴンデータに含まれる $CR,CG,CBの値をそのまま受け取り、そのまま出力する。
例えばここで各要素をシャッフルしたり、それぞれの要素に何かしらの計算を行いつつ出力を行うなど、かなり便利な使い方ができそう。
Attrib Transferノード
input1に与えられたジオメトリにinput2に与えられたジオメトリから任意のデータを付加して出力するノード
grid1にsphere1からアトリビュートを転写する。
転写するアトリビュート名をCd(頂点カラー)に指定
conditionタブで、影響を与える最大距離など、細かい設定ができる。
Trailノード
入力されたジオメトリの動きの軌跡を作成できる。
パーティクルの基本的な制御
POP Networkノード内でパーティクルを発生させる。
エミッターとなるオブジェクトを作成し、input1に接続
popnet内にsourceノードを作成し、パーティクル作成方法を指定
パーティクルに対するアトリビュート転送
popnet内にAttribTransferノードを作成。
下図の例ではpopnetのinput2に接続されたジオメトリから頂点カラー(Cd)をパーティクルに対して転送している。
popnetでのgroupノード
popnet内でのgroupノードは、特定の条件に当てはまるパーティクルの取り出しに使うことができる。
上図の例では、頂点カラーのR値が0.6より大きくなった全パーティクルをredというグループ名で取り出せるようにグルーピングしている。
このグループ名は、以降に続くノードで使用できる。
パーティクルに外力を与える
sourceノードの下流にforceノードを接続する。
パーティクルの動きを制限する
これらのノードは、パーティクルに何らかの意味を持つ範囲情報を与えることができる。
例えば、その範囲を超えたら消滅する。範囲の境界でバウンスするなどを指定できる。
言ってみれば、コリジョンノードとも言えるかもしれない。
エクスプレッションのフレームナンバー表記
$F :フレームナンバーをint型で計算
$FF :フレームナンバーをfloat型で計算
Global Animation Optionsでシーンの時間をfloat型にする
下記オプションで変更可能
チャンネルエディタのカーブ精度を変更する
Settings > Curve Quality > 任意の精度レベル
エクスプレッションで使う変数やエイリアスを設定する
Edit > Aliases and Variables
ウインドウ下部の入力ボックス左側が名前、右側が値。
入力してエンターキーで変数を作成できる。
実際にここで作成した変数は、エクスプレッションなどで$マークに続けて変数名を書くことで使用できる。
Houdini shell terminal
Houdini同梱版のshell?
Applications>Houdiniインストールフォルダ内にある
hconfigなど、Houdini独自のアプリが立ち上げられるようだ。
mayapyみたいな存在だろうか?
もう少し使いこなせるようになってから覚えるのでも遅くはなさそうなので、とりあえずこういうものがあるということだけ覚えとく。
タイムレンジに関する変数名
$RFSTART:プレイバックレンジのスタートフレーム
$RFEND:プレイバックレンジのエンドフレーム
$FSTART:設定されている実際のタイムレンジのスタートフレーム
$FEND:設定されている実際のタイムレンジのエンドフレーム
textport
Houdini内のシェルウインドウのようなもの。
exhelp 関数名 などと入力しエンターキーで実行すると関数のヘルプが見れたりする。コマンドを知るにはかなり重要になりそうなウインドウ。
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:この変数名が記載されたノード自身の名前