ICE ツリーでデータを取得し設定する

 
 
 

ほぼすべての ICE ツリーで、データの取得、計算の実行、およびデータの設定が行われます。[ツール]タブの[Data Access]カテゴリにある[Get Data]、[Set Data]、およびその他のノードを使用して、データを取得し、設定することができます。また、Preset Manager の[Particles]および[Deformations]タスクの[Getters]および[Setters]サブタスクには、特定のデータの取得および設定を行うためのいくつかのコンパウンドが用意されています。

取得または設定可能なデータ

ICE でのデータのタイプ

ICE ツリーでは、固有の ICE データ、動的な ICE データ、その他のシーン データの 3 つのタイプのデータを操作できます。

固有の ICE 属性

固有の ICE 属性には、[PointPosition]、[PointNormal]、[PolygonNormal]などの、シーン内の実際のジオメトリック データに対応したコンポーネント属性が含まれます。一部の属性は読み取り/書き込み可能で、それ以外の属性は読み取り専用です。

動的な ICE 属性

動的な属性には、「オン ザ フライ」で作成および設定され、ツリー内で自由に使用できる属性が含まれます。これらの属性は、ユーザが設定するまで存在しません。

多くの事前定義された属性は、固有の ICE 属性ではなく、実際には特定のノードおよびコンパウンドによって自動的に設定された動的な属性です。これらの属性は、名前によって認識されます。たとえば、[SimulateParticles]ノードは、[Force]、[PointVelocity]、[Mass]属性を認識します。これらの事前定義された属性は、設定または初期化されていない場合でも、常に[Get Data]ノードの Explorer に表示されます。

動的属性には、カスタム属性も含まれます。目的に応じて、独自のカスタム属性を作成することができます。[AgeLimit]や[Init_PointVelcocity]など、定義済みコンパウンドで使用される多くの属性は、実際にはカスタム属性です。「ICE ツリーでの実行を制御する」を参照してください。

その他のシーン データ

ICE では任意のネイティブ Softimage プロパティまたはオペレータのパラメータやカスタム プロパティなど、その他のシーン データへのアクセスも提供しています。

取得可能なデータ

シーン内のどのデータも取得可能です。「データを取得する」を参照してください。

設定可能なデータ

次のような特定のデータを設定できます。

  • [PointPosition]または[EdgeCrease]などの一部の固有属性。[PointNormal]や[PolygonArea]などのその他の属性は読み取り専用です。

  • [Force]や[PointVelocity]などの事前定義された属性を含む任意の動的な属性。

  • Softimage のほぼすべてのプロパティ。ただし、キネマティクスは特別です。「ICE キネマティクス」を参照してください。

データの設定方法の詳細については、「ICE 最適化の注意事項」を参照してください。

データの取得/設定とコンテキスト

データは、明示的な文字列によるリファレンス別またはロケーション別に取得することができます。

  • 明示的な文字列リファレンス別にデータを取得する場合、コンポーネントごとに 1 つの値を示す一連の値が得られます。たとえば、「sphere.PointNormal」を取得すると、球オブジェクトの各ポイントの 3D ベクトルが得られます。つまり、球のポイントごとのコンテキストが得られます。

  • ロケーション別にデータを取得する場合、コンテキストは、[Get Data]ノードの[Source]ポートに接続する一連のロケーションのコンテキストに依存します。たとえば、「grid.PointPosition」を最初に使用してデータを取得して、それを使用して球上の一番近いロケーションを取得し、次に[PointNormal]を取得する場合、球上の法線を含むデータが得られますが、コンテキストはグリッドのポイントごとに取得されます。「grid.PolygonPosition」を最初に使用すると、コンテキストはグリッドのポリゴンごとに取得されます。

明示的な文字列リファレンスのみを使用してデータを設定することができますが、 ロケーション別にデータを設定することはできません。属性を設定するには、データが適切なコンテキストにある必要があります。たとえば、[PointPosition]を設定するには、データが適切なオブジェクトのポイント別のコンテキストにある必要があります。属性によっては設定できないものもあります。

データを取得する

[Get Data]ノードを使用して、データを取得できます。ツリーへの[Get Data]ノードの追加は、いくつかの方法で実行できます。

設定または初期化される前にデータを取得することができます。これにより、他のツリーに接続されるまで表示され続けるエラー(赤いノード)が表示されなくなります。

ツリーでは、ICE 属性の取得および設定を何度でも実行可能で、属性を取得するたびに、最新の更新された値が取得されます。ただし、キネマティクスや通常のプロパティ値などの外部データは、ツリーごとに 1 度だけ設定できます。そのような値の設定後に再度取得すると、変更されていない元の値が取得されます。

ICE ツリーに[Get Data]ノードを追加するには

  1. 次のいずれかの操作を実行します。

    • Preset Manager の[ツール]タブにある[Data Access]カテゴリの[Get Data]ノードをツリーにドラッグします。新しいノードのリファレンスは、初期状態では空です。

    • [ノード](Nodes) [Data Access] [Get Data]を選択します。繰り返しますが、新しいノードのリファレンスは、初期状態では空です。

    • Explorer からツリーにオブジェクト、パラメータ、またはその他のノードをドラッグします。ここでは、アイコンではなくエレメントの名前をドラッグするようにしてください。[Get Data]ノードは、エレメントのリファレンスによって事前に埋められています。

      現在の選択にシノプティックまたはアノテーション プロパティが含まれていない場合は、ビューポートで[F3]を押して小さな Explorer を開き、選択およびドラッグ操作を行います。含まれている場合は、[Shift]+[F3]キーを押すと小さな Explorer を開けます。

  2. ツリーに[Get Data]ノードが表示されたら、リファレンスを指定または変更できます(「シーン リファレンスを指定する」を参照)。

位置でデータを取得する

文字列のリファレンスからデータを取得するだけでなく、特定の位置からデータを取得することもできます。たとえば、パーティクルの[EmitLocation]で[PointVelocity]を取得できます。

特定の位置からデータを取得するには、任意の位置データを[Get Data]ノードの[Source]ポートに接続します。この方法で[Get Data]ノードの[Source]ポートに位置を接続すると、[Explorer]ボタンには、その位置で使用できる属性だけが表示されます。

このテクニックを使用して、[Get Closest Location]ノードなどのジオメトリ クエリを使用した他のオブジェクトからデータを取得することができます。たとえば、球上の最も近い位置にある[PointNormal]を取得することができます。ジオメトリ クエリの詳細については、「位置をテストする」を参照してください。

属性がポイントの上に保存されている場合は、任意の位置で取得することができます。この値は、近隣ポイント値間で補間されます。整数値は、補間され、丸められます。

ジオメトリ上の位置は、その場所で[PointPosition]属性を取得することで、3D ベクトルの位置に変換できます。

この方法で戻された位置は、ICE ツリーが適用されたオブジェクト(「セルフ」オブジェクト)のローカルの座標システムで表されます。[PointNormal]や[PointVelocity]などのベクトルでも同様ですが、これらは位置としてではなく、ベクトルとして処理されます(移動は無視されます)。カスタムの 3D ベクトル属性は、自動的には変換されません。位置として変換されるようにするか、ベクトルとして変換されるようにするか、それとも変換せずにそのまま残すかはユーザが決定する必要があります。リファレンス フレーム間での変換については、「ジオメトリ クエリを使用する」を参照してください。

前のフレームでデータを取得する

前のフレームから属性またはその他のデータを読み込む必要がある場合は、[Get Data at Previous Frame]ノードを使用します。このノードは、フレーム間で値を補間する必要がある場合に便利です。

[Get Data at Previous Frame]ノードを使用ときの注意点として、ノードによって取得された特定のデータだけが前のフレームで評価されるということがあげられます。詳細については、次の図に示します。

上のツリーは、前のフレームのポイント位置と球の両方を取得することで、前のフレームの球にある最も近い位置を計算します。次に、前のフレームでこれらの位置の法線を取得します。

上のツリーは、前のツリーと同じ方法で、前のフレームの球にある最も近い位置を計算します。次に、現在のフレームでこれらの位置の法線を戻します。

上のツリーは、現在のフレームの球にある最も近い位置を計算します。次に、前のフレームでこれらの位置の法線を取得します。

[Get Data at Previous Frame]ノードでは、別のフレームで評価するのに必要になるデータの量によっては、処理コストが高くなることがあるので注意が必要です。ツリーの処理速度は、[Get Data at Previous Frame]ノードを使用する代わりに、次のフレームで使用されるカスタム属性のデータを保存することで向上させることができます。

注:
  • ポイントが追加または削除される場合、[Get Data at Previous Frame]は同じインデックスが付いたコンポーネント(同じコンポーネントである必要はありません)のデータを戻します。前のフレームに指定されたインデックスが付いたコンポーネントがない場合は、対応するエレメントがデータ セットからフィルタリングされ、下流のノードでは無視されます。

  • 同じ ICE ツリー内で、オブジェクト自身か別のオブジェクトかに関係なく、オブジェクトで[Get Data at Previous Frame]および[Set Data]の両方を使用する場合は、そのオブジェクトのコンストラクション スタックにシミュレーション領域が存在している必要があります。これは、別の属性を取得および設定する場合でも適用されます。スタックにシミュレーション領域が存在する場合、スタックの下位の領域は、シミュレーションの最初のフレームでのみ評価され、後続のフレームは前のフレームに基づいて処理されます。詳細については、「ICE ツリーとコンストラクション スタック」を参照してください。

シーン グループのデータを取得する

シーン内のグループのデータを取得する場合は、いくつかの点を考慮する必要があります。

  • グループそのものを取得すると、グループ内のジオメトリのユニオンが取得されます。たとえば、シーン グループのすべてのポリゴン メッシュ、サーフェイス、およびカーブからパーティクルを放出できます。

  • [Get Data]ノードの Explorer のグループの下から取得可能なその他の属性およびプロパティは、グループ(交差)の各メンバーに存在するものと同じです。これらの属性または値の 1 つを取得すると、要求されたデータ セットの各メンバーの配列が戻されます。配列のサイズはグループのサイズです。この値を返すには、[Get Array Size]ノードを使用します。

    配列内の要素の順番は、グループのメンバの作成順に対応します。この順序は、必要に応じて変更できます。Explorer で、[ビュー](View) [一般](General) [ソート](Sort) [なし](None)([生成順](creation))を選択し、[ビュー](View) [再配列ツール](Reorder Tool)をアクティブにしてから、グループ内でノードをドラッグアンドドロップします。この順序は、シーンを保存して開き直したときにも保持されています。詳細については、「Explorer でエレメントをソートおよび順序変更する」を参照してください。

    [PointPosition]など、コンポーネントごとのデータを取得した場合、グループ内のすべてのオブジェクトが同じ数のコンポーネントを持つ場合のみ、結果が正しくなります。これを回避し、すべてのポイント位置を取得する方法として、[Get Data](グループ)ノードの値を[Generate Sample Set]ノードの[Geometry]ポートに接続する方法が挙げられます。このとき、[Generate Sample Set]ノードの[Emission Type(放出の種類)]を[Point(ポイント)]に設定し、[Rate Type(レートの種類)]を[All Points(すべてのポイント)]に設定します。

シーン グループを使用する代わりに、[Group Geometry]ノードを使用し、ジオメトリック オブジェクトを組み合わせてクエリすることができます。「位置をテストする」を参照してください。

[Get Data]ノードを再利用する

ツリー内に同じデータが必要な場合は、同じ[Get Data]ノードを必要なだけ他のノードに接続することができます。ただし、データが中間で変更されている場合は、[Get Data]ノードはツリー内に新しいデータを戻します。

[Get Self.Foo]ノードは、[Self.Foo]が中間で設定されているため、[Stuff and More Stuff]に異なる値を戻します。

ロケーション別のデータの補間法

ロケーション別のデータを取得する場合。

  • ポイント、エッジ、およびサンプルに含まれる属性は、周りのコンポーネントから補間されます。ただし、[PointBinormal]などの NURBS サーフェイスおよびカーブ上で直接計算される、特定の NURBS 関連の属性は例外となります。

  • ポリゴンおよびオブジェクトに含まれる属性は補間されません。返された値は常に、対応するポリゴンやオブジェクトの値となります。

  • 整数およびブールが補間されると、近似値に切り捨てられます。

リファレンス フレーム

明示的な文字列リファレンスを使用して位置、ベクトル、回転などの変換に依存する属性を取得すると、まだ処理されていない未変換の値が返されます。これらの値は通常、コンポーネントが属するオブジェクトのローカル空間に対応します。たとえば、「grid.PointPosition」を取得する場合、返される値はグリッドのローカル リファレンス フレームに対応します。

ロケーション別にデータを取得する場合、「self」オブジェクト(ICE ツリーのオブジェクト)のリファレンス フレームに自動的に変換される属性は次のとおりです。

  • PointPosition

  • PointNormal

  • PointTangent

  • PointBinormal

  • SurfaceGeometricNormal

  • PointReferenceFrame

  • EdgeReferenceFrame

  • PolygonRefFrame

これ以外の属性は、ロケーションごとに取得するときに変換されず、 属性が属するオブジェクトのローカル リファレンス フレームとして表示されます。

データを設定する

データを設定するには、[Set Data]コンパウンドを使用します。接続したり、プロパティ エディタを直接使用して、目的のリファレンスと値を指定するだけで操作は完了です。「シーン リファレンスを指定する」を参照してください。

属性によっては設定できないものもあります。[NbPoints]など、読み取り専用の属性は、[Set Data]ノードの Explorer に表示されません。

リファレンスを指定すると、入力ポートの表示されている名前は「Value」からリファレンスの名前に変わります。リファレンスを[Set Data]ノードの[In Name]に接続している場合は、[Set Data]ノードで定義されているすべてのリファレンスの前にこの名前が付きます。これにより、1 つの[Set Data]ノードを使用して、同じオブジェクトに複数の属性を設定できます。ただし、オブジェクト名が[In Name]に接続されている場合は、ポートを追加してからリファレンスを指定しないと、値を追加できません。これは、オブジェクト名が単独でデータ タイプを解析できないためです。

ICE 属性を設定し、後で同じツリーでその属性を取得すると、変更された値が取得されます。ただし、キネマティクスや通常のプロパティ値などの外部データは、ツリーごとに 1 度だけ設定できます。そのような値の設定後に再度取得すると、変更されていない元の値が取得されます。

データがデータ セットのすべてのコンポーネントの一部(すべてではない)で設定されている場合は、初期化されていないコンポーネントに既定値(ほとんどのデータ タイプではゼロ、ブール値では false、行列では同一、カラーでは黒など)が設定されます。

2 つのアンダースコア文字(__)から名前が始まる属性は、非表示に設定されており、属性の Explorer には表示されません。この属性は、コンパウンド内でユーザに使用してほしくない内部的な「会計」属性で使用すると便利です。

ICE 最適化の注意事項

データを設定しても、シーンでまったく使用されていない場合、ICE が最適化される仕組みにより、そのデータが実際に設定されることはありません。これはカスタム属性だけでなく、動的属性にも適用されます。たとえば、[PointVelocity]を設定しても、シミュレート ノードを使用してポイント位置を更新しない場合、[PointVelocity]は実際には設定されません。

その他にも、この動作による次のような影響が考えられます。

  • キャッシュにあると予測していたデータが失われている可能性があります。

  • そのデータを使用する別のツリーを作成する前に、データを初期化するツリーをフリーズすると、そのデータは失われます。

  • SDK の ICEAttribute.IsDefined プロパティが、誤解を招くおそれがあります。

フォース データは、次の 2 つの方法で評価および設定できます。

  • ビューポートでデータ値を表示する。「ポート値を表示する」を参照してください。

  • データを使用して、シーンの実際のデータを設定する。たとえば、ウェイト マップ値を設定したり、Render Tree でデータを使用したりします。

データを初期化する

データの初期化は簡単に設定できます。

現在のフレームで生成されているパーティクルの初期値を設定するには、[Set Data]ノードを該当するノードの[Execute on Emit]、[Execute on Spawn]、または[On Creation]ポートに接続します。

[Set Data]ノードをこれらのポートの 1 つに接続できない場合(たとえば、1 つの処理を新しいパーティクルに対して行い、別の処理を古いパーティクルに対して行っているコンパウンドを作成している場合など)は、[Init]属性をフィルタリングできます。「自動フィルタリング」を参照してください。

カスタム属性を設定する

カスタム

カスタム属性を作成するには、[Set Data]ノードを使用して、新しい属性名を定義します。ICE ですでに使用されている属性名のリストについては、「ICE 属性」を参照してください。「PointCloud.my_custom_attribute」のように、必ず[Set Data]ノードのオブジェクト名を含めた完全なリファレンスを設定してください。

カスタム属性は、ロケーションなど、任意のタイプの値を保存するために使用できます。カスタム属性のコンテキストとデータ タイプは、接続されているノードによって決定されます。データ タイプが決定されていない場合、[Set Data]ノードがエラーになります(赤)。[Constant]カテゴリのノードを使用すると、特定のデータ タイプを強制的に設定することができます。コンテキストが決定されていない場合は、既定でオブジェクト コンテキストになります。ただし、別のコンテキストを強制するノードを接続している場合は、このコンテキストがコンポーネント コンテキストに変更される場合があります(競合するコンストレイントがコンテキストで発生している場合を除く)。

Set Data を遅延させる

[Delay Set Data]ノードは、上流ノードのすべての[Set Data]ノードの結果を保持し、一度にすべてを実行します。これにより、相互に依存した属性を設定できます。たとえば、値をスワップすることができます。

 

最初の例では、値 A は B と記述されてから、値 B(以前 A だった値)が A と再び記述されます。

最後に、A と B の両方とも A の同じ値を持つようになります。

 

[Delay Set Data]を使用すると、B は A の値に設定されますが、すぐには記述されません。A が B の値に設定されてから、両方の値が同時に取得されます。

最後に、A にオリジナルの B の値が設定され、B にオリジナルの A の値が設定されます。