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が変化してしまうため、一工夫して変化させない仕組みを作る必要があるようだ。