On this page |
RBD Auto Freeze DOPは、停止するようになったRBDシミュレーションのエレメントを簡単にフリーズさせることができます。
フリーズは、CumulativeMovementという名のRBD Objectに新しいデータを追加することで行なわれます。 このデータは、時間と共に線形速度と角速度の全体の大きさを追跡します。 このデータには、オブジェクトがすぐに平衡点(つまり、跳ね返りの頂上)に到達した場合でも、オブジェクトがフリーズされない移動平均を記録します。 とはいえ、これは、その閾値をシミュレーションに応じて調整しなければならないことを意味します。 ほぼ単位サイズのオブジェクトに対しては、デフォルト値がセットアップされます。
フリーズされたRBDオブジェクトは、他のRBDオブジェクトのサポートを続けますが、もはや衝突に応じて動かなくなります。 これによって、処理が高速になり、ジッター(微震)が発生しなくなります。
Melt パラメータを使えば、オブジェクト単位基準でRBD Objectを目覚めさせることができます。
Note
Meltを使用しなかった場合、一度オブジェクトがフリーズされると、フリーズのままになります。 そのオブジェクトが乗っている地面が非表示になっても、そのオブジェクトは、その変化に関係なく空中を浮き続けます。
Note
RBDシミュレーションでは、初期段階で静止状態になっていて、そして動きはじめて、1秒で停止するようになるオブジェクトがたくさんあることが多いです。 RBD Freeze DOPは、静止状態に戻るフリーズオブジェクトとしてマークすることになっています。
例えば、地面に落下する球があり、フレーム0では、球が静止していて、累積モーションがゼロです。 私達は、この球をフリーズさせたくないので、その球をフリーズするに値するまでは、その球が本当に移動していると見なされるのに十分なモーションを取得するのを待ちます。
パラメータ ¶
Activation
自動フリーズするための任意のテストを実行するかどうか決めます。 この値がゼロなら、オブジェクトはフリーズ用のテストが実行されず、それらのオブジェクトのActive値が更新されません。
キーフレームアニメーションに切り替えている場合、Active値が上書きされないように、このパラメータがキーフレームアニメーション中にゼロであることを確認することが重要です。
Group
Object Groupフィルターに一致した入力オブジェクトのみがテストされて、フリーズされます。
Angular Velocity Scale
オブジェクトの角速度の単位は、度/秒です。 1秒あたりに1単位の長さ分移動する単位サイズのオブジェクトのVelocityは1ですが、1秒あたり1回転する同じサイズのオブジェクトの角速度は360です。
このDOPは、それらの2つの測定を組み合わせようとするので、それらを同じ一般的な範囲にするスケール係数を持つことが重要です。 この係数のだいたいの値を予想することは可能で、単位サイズのオブジェクトに関しては、0.01のデフォルトが良いです。
Motion Decay
現行モーションを追加して、このMotion Decay係数で前のモーション量をスケールすることにより、時間における全体のモーションを追跡します。
値を1
にすると、モーションが100%のままになり、.9
にすると、モーションが前のモーションの90%に衰退します。0
にすると、各フレームのモーションが停止します。
つまり、放物線の頂上でオブジェクトが急にフリーズすることがあります。
Note
これは、 Enable Threshold と Freeze Threshold で必要な値にも影響を与えます。
Enable Threshold
オブジェクトがフリーズの対象となる前に、そのオブジェクトが、まず最小の累積移動距離に到達しなければなりません。
閾値を高くすることで、衝突を待っているオブジェクトが、衝突する前にそのオブジェクトがフリーズされないようにすることができます。 一方で、その閾値が高すぎると、移動オブジェクトがまったくフリーズの対象にならなくなります。
時間と共にCumulativeMovementデータを監視する場合、シミュレーションに適切な閾値を判断することができます。
NOTE: Enable Threshold は、常に Freeze Threshold よりも大きくしてください。そうしないと、オブジェクトがなんとか移動する前にフリーズする危険性があります。
Freeze Threshold
オブジェクトの累積移動距離が Enable Threshold を超えた時、そのオブジェクトが Freeze Threshold に対してテストされます。 その累積移動距離が Freeze Threshold を下回った時、RBD Auto Freeze DOPは、そのオブジェクトのActive Value値をオフにします。 これにより、オブジェクトがシミュレーションに反応しなくなります。
そのオブジェクトのシミュレーションが無効になったことで、そのオブジェクトのVelocityもゼロになるので、オブジェクトはもはや動かなくなります。
Melt
オブジェクトの Melt の値を1に設定すると、そのオブジェクトがフリーズしていれば、再度、そのオブジェクトを目覚めさせます。 オブジェクトがまだフリーズしていなければ、その設定は、 Enable Threshold に到達したかどうかの履歴をクリアします。 オブジェクトの Melt の値を1に設定した後では、そのオブジェクトは、 Enable Threshold に再度到達して Freeze Threshold を通過するまで再フリーズしなくなります。
Melt パラメータがゼロ以外の値の時、オブジェクトのActive Valueが1に設定され、オブジェクトがシミュレーションに反応するようになります。
Melt パラメータが1の時、オブジェクトはCumulativeMovementデータのhasbeenbig
フラグもリセットします。
そのため、オブジェクトは Enable Threshold に再度到達するまで再フリーズしません。
入力 ¶
First
自動フリーズのテストが実行されるRBDオブジェクト。
出力 ¶
First
入力に接続したオブジェクトとまったく同じセットが単一出力を通して送り出されます。
ローカル変数 ¶
ST
ノードが評価されるシミュレーション時間です。
この値は、変数Tで表現される現在のHoudiniの時間と同じではなく、DOP Networkの Offset Time と Scale Time のパラメータの設定に依存しています。
STは、シミュレーションの開始時間がゼロになるようになっています。
つまり、シミュレーションの最初のタイムステップをテストする時は、$T == 0
や$FF == 1
を使うのではなくて、$ST == 0
のようなテストを使うのがベストです。
SF
ノードが評価されるシミュレーションフレーム(正確には、シミュレーションタイムステップ番号)。
この値は、変数Fで表現される現在のHoudiniのフレーム番号と同じではなく、DOP Networkパラメータの設定に依存しています。 代わりに、この値は、シミュレーション時間(ST)をシミュレーションタイムステップサイズ(TIMESTEP)で割算した値と同じです。
TIMESTEP
シミュレーションタイムステップのサイズ。 この値は、1秒あたりのユニットで表現した値をスケールするのに役に立ちますが、タイムステップ毎に適用されます。
SFPS
TIMESTEPの逆数。 シミュレーション時間の1秒あたりのタイムステップ数です。
SNOBJ
シミュレーション内のオブジェクトの数。 Empty Object DOPなどのオブジェクトを作成するノードでは、SNOBJは、オブジェクトが評価される度に値が増えます。
固有のオブジェクト名を確保する良い方法は、object_$SNOBJ
のようなエクスプレッションを使うことです。
NOBJ
このタイムステップ間で現行ノードで評価されるオブジェクトの数。 この値は、多くのノードがシミュレーション内のオブジェクトすべてを処理しないので、SNOBJとは異なります。
NOBJは、ノードが各オブジェクトを続けて処理(例えば、Group DOP)しないなら0を返します。
OBJ
ノードで処理される特定のオブジェクトのインデックス。 この値は、指定したタイムステップで常にゼロからNOBJ-1まで実行されます。 この値は、OBJIDやOBJNAMEなどのシミュレーション内の現行オブジェクトを識別せず、現在の処理順でのオブジェクトの順番を識別します。
この値は、オブジェクト毎に乱数を生成するのに役に立ちます。他には、処理別にオブジェクトを2,3のグループに分けるのに役に立ちます。 この値は、ノードがオブジェクトを続けて処理(例えば、Group DOP)しないなら-1を返します。
OBJID
処理されているオブジェクトの固有ID。 すべてのオブジェクトは、すべての時間のシミュレーション内のオブジェクトすべてで固有な整数値が割り当てられています。たとえオブジェクトが削除されても、そのIDは決して再利用されません。 オブジェクトIDは、オブジェクト毎に別々の処理をさせたい場面(例えば、オブジェクト毎に固有の乱数を生成したい)で非常に役に立ちます。
この値は、dopfieldエクスプレッション関数を使って、オブジェクトの情報を検索するのにベストな方法です。
OBJIDは、ノードがオブジェクトを続けて処理(例えば、Group DOP)しないなら-1を返します。
ALLOBJIDS
この文字列には、現行ノードで処理されているオブジェクトすべての固有のオブジェクトIDをスペース区切りにしたリストが含まれています。
ALLOBJNAMES
この文字列には、現行ノードで処理されているオブジェクトすべての名前をスペース区切りにしたリストが含まれています。
OBJCT
現行オブジェクトが作成された時のシミュレーション時間(変数STを参照)。
そのため、オブジェクトが現在のタイムステップで作成されたかどうかチェックするには、$ST == $OBJCT
のエクスプレッションが常に使われます。
この値は、ノードがオブジェクトを続けて処理(例えば、Group DOP)しないなら0を返します。
OBJCF
現行オブジェクトが作成された時のシミュレーションフレーム(変数SFを参照)。
この値は、OBJCT変数にdopsttoframeエクスプレッションを使ったものと等価です。この値は、ノードがオブジェクトを続けて処理(例えば、Group DOP)しないなら0を返します。
OBJNAME
処理されているオブジェクトの名前を含んだ文字列値。
オブジェクト名は、シミュレーション内で固有であることが保証されていません。 しかし、オブジェクト名が固有になるように注意して名前を付けていれば、オブジェクトの識別は、オブジェクトIDよりも、オブジェクト名を指定するほうが簡単です。
オブジェクト名は、同じ名前を持つオブジェクトの数を仮想グループとして扱うこともできます。
“myobject”という名前のオブジェクトが20個あれば、DOPのActivationフィールドにstrcmp($OBJNAME, "myobject") == 0
を指定すると、DOPがその20個のオブジェクトのみを操作します。
この値は、ノードがオブジェクトを続けて処理(例えば、Group DOP)しないなら空っぽの文字列を返します。
DOPNET
現在のDOP Networkのフルパスを含んだ文字列値。 この値は、ノードを含むDOP Networkのパスを知りたりDOPサブネットのデジタルアセットで非常に役に立ちます。
Note
ほとんどのダイナミクスノードには、そのノードのパラメータと同じ名前のローカル変数があります。 例えば、Position DOPでは、以下のエクスプレッションを記述することができます:
$tx + 0.1
これはオブジェクトをタイムステップ毎にX軸方向に0.1単位分移動させます。
Examples ¶
Stack Example for RBD Auto Freeze dynamics node
ティーポットが10フレーム毎に地面に落下します。 RBD AutoFreeze DOPを使って、停止したティーポットを検出して、それをフリーズさせることで、シミュレーションを安定化して高速化することができます。