On this page |
Copy Objects DOPは、入力シミュレーションオブジェクトのコピーを作成します。 Copy Data DOPとは違い、このノードは、グローバルパラメータの使用や入力ノードの再評価では動作しません。 その代わりに、このノードは、入力シミュレーションオブジェクトの同一コピーをいくつか作成します。 各オブジェクトを固有にするタスクは、その後のDOPノードに託されています。
例えば、このノードの後にRBD Stateノードを接続して、 そのノードが、コピーされたオブジェクトのオブジェクト識別子を使用して各オブジェクトを固有の位置に動かします。
パラメータ ¶
Activation
このノードは、このパラメータがゼロ以外の値に評価された任意のタイムステップでの入力オブジェクトのコピーを作成します。
一般的には、このパラメータには、特定のタイムステップで1に評価され、それ以外の時間ではゼロに評価されるエクスプレッションを含めます。 しかし、他の配置も可能で、例えば、入力オブジェクトを一定の流れでコピーを作成することができます。
Number of Copies
このノードが作成するオブジェクトの数を設定します。この数は、入力オブジェクトの数とは関係ないことに注意してください。 もし10個の入力オブジェクトがあり、このパラメータの値を2にすると、2個の新しいオブジェクトのみが作成されて、20個作成されるわけではありません。
Object To Copy
このパラメータは、コピーオペレーションのソースとして使用する入力オブジェクトを制御します。 このパラメータは、このノードで作成されたコピー毎に評価されるので、生成される出力オブジェクトに基づいて、 別の入力オブジェクトを選択してコピーするエクスプレッションを設定することができます。
このパラメータは、(ワイルドカードやグループ名を使用することで)2個以上の入力オブジェクトに一致する場合があります。 Object Index パラメータは、一致したオブジェクトセットからどれをコピーするのか決めるために使用します。
Object Index
このパラメータは、コピーオペレーションのソースとして使用する入力オブジェクトの制御で役に立ちます。 このパラメータは、このノードで作成されたコピー毎に評価されるので、生成される出力オブジェクトに基づいて、 別の入力オブジェクトを選択してコピーするエクスプレッションを設定することができます。
まず最初に、 Object To Copy パラメータが、入力オブジェクトのマッチングセットの作成に使用されます。 このパラメータの値には、そのセットの中でコピーするオブジェクトを指定します。
Tip
例えばRBD Fractured Object DOPで生成されるオブジェクトのように、オブジェクトセットのコピーを作成するには、
Object To Copy の値に*
を、 Object Index の値に$OBJ
を使用してください。
または、各入力オブジェクトのコピーをいくつか作成するには、 Object Index の値に$OBJ % number_of_input_objects
を使用し、
そして、 Number of Copies を出力オブジェクトの総数に設定してください。
Object Name
出力オブジェクトの名前を制御します。このパラメータには、単にSRCNAME
ローカル変数をよく使用します。
その変数は、コピーされるオブジェクトの名前に設定されています。
Copy Objects Created By This Node
通常では、コピーに利用可能なオブジェクトのみが、このノードの入力内のオブジェクトになっています。 これは、既に作成されているオブジェクトがコピーの対象ではない時にテンプレートオブジェクトに基づいてオブジェクトを作成したり、 オブジェクトインデックスを単純化するのに役に立ちます。
既存オブジェクトを分割するためには、このコピーオブジェクトで作成されたオブジェクト自体を再帰的に分割する必要があります。 この場合では、入力オブジェクトとこのノードで作成されたオブジェクトの両方にアクセスする必要があります。 このケースでは、ほぼ常にコピーの対象となるオブジェクトを持つので、目的のフレームでのみ発生するようActivationを設定することが重要になります。 Preserve Inputをオフ、Copy Own Objectsをオフにすることで、コピーは、テンプレートオブジェクトが最初に作成された時にだけ起こり、 そのActivationを同時にそのままにすることができます。
Preserve Input Objects
このパラメータをオフにすると、オブジェクトコピーが作成されると同時に、すべての入力オブジェクトが壊されます このパラメータをオンにすると、入力オブジェクトをそのままに、このノードを通します。
Solve on Creation Frame
新しく作成されたオブジェクトに対して、このパラメータは、そのオブジェクトのソルバが、そのオブジェクトが作成された時のタイムステップでオブジェクトを計算するかどうか制御します。 このノードが、シミュレーションの初期状態でのオブジェクトを作成するのではなく、シミュレーション中にオブジェクトをコピーするのであれば、通常では、このパラメータをオンにします。
ローカル変数 ¶
SRCID
ソースオブジェクトの固有ID。
SRCNAME
ソースオブジェクトの名前。
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 ¶
AutoFracturing Example for Copy Objects dynamics node
このサンプルでは、Multi Solverと併せてCopy Object DOPを使って、他のオブジェクトと衝突した際に自動的にRBDオブジェクトを半分に割る方法を説明しています。
SimpleCopy Example for Copy Objects dynamics node
このサンプルでは、Copy Objects DOPを使う方法を説明しています。 単一のRBD Objectを100回コピーしてから、それらのオブジェクトにランダムな初期Velocityとグリッドジオメトリからの位置を割り当てています。 そして、それらの100個の球が地面に落下します。