ICE Tree で配列を操作する

 
 
 

データ セットは、値または配列で構成されます。配列は、順番に並べられた同じデータ タイプの値のセットです。配列は、特にパーティクル ストランドを実装するのに使用されます。

配列はゼロベースです。つまり、サイズ 5 の配列では、最初のエレメントにはインデックス 0 が付き、最後のエレメントにはインデックス 4 が付きます。

注:[Build Array]ノードには[Value1]、[Value2]などの入力が存在しますが、これらは単なるポート名です。配列のインデックスは、0、1 などです。

配列には、同じデータ セットのさまざまなメンバのさまざまなサイズが設定されます。たとえば、[Get Closest Points]は、カットオフ距離内にあるパーティクルの数に従って、各位置のロケーションの別の数を戻します。

[Math]/[Conversion]カテゴリのノードを含む多くの基本的なノードでは、単独の値だけでなく配列も使用できます。また、配列を構築および変更できるノードのセットもあります。たとえば、[Push On Array]ノードは、配列の最後に値を追加します。さらに、配列のサイズや平均値などの配列属性にアクセスするノードもあります。

[Array]カテゴリのノードは、標準の配列操作(ポッピング、プッシュ、削除など)を実行するのに使用されます。特殊なノードに関する注意事項については、次のセクションを参照してください。

配列サイズ

配列は動的なものであるため、アイテムを挿入、削除、ポッピング、プッシュするときに自動的にサイズが変更されます。

ただし、事前に配列の最大サイズが予測できる場合は、たとえば、シミュレーション中に再評価されないコンストラクション スタック内の別の ICE ツリーなどで、[Reserve Array]ノードを使用してメモリを予約することで、パフォーマンスを改善できます。また、[Reserve Array]を使用して、既存の配列に対して追加のメモリを予約することもできます。たとえば、データ セットのすべての配列に 4 つのアイテムをプッシュしようとしているときは、メモリを先に予約しておく方が効率的かもしれません。メモリを予約しても、配列のサイズは変わりません。

[Resize Array]ノードは[Reserve Array]とは異なり、配列サイズを変更します。サイズが大きくなる場合は、新しいエレメントは既定の値で埋められます。

配列に挿入する

[Insert in Array]ノードを使用すると、値を配列に挿入するだけでなく、配列を別の配列に挿入することもできます。これは、特定のインデックスから始まる配列をスライスして入れ子にすることと似ています。

配列内のアイテムを選択する

[Select in Array]ノードは、特定のインデックス値の配列にあるアイテムを戻します。また、インデックス値の配列に接続して、特定のアイテムを含む配列を戻すこともできます。

配列内のアイテムを並び替える

配列の並び替えには、2 つの方法があります。

  • [Sort Array]は、配列内のアイテムを昇順または降順で並び替えます。このノードでは、[Compare]ノードと同じ条件が使用されます(「値を比較する」を参照)。

  • [Sort Array with Key]は、同じサイズの別の配列に基づいて配列を並び替えます。これは、表や SpreadSheet の行を 2 つのうちの 1 つの列に基づいて並び替えると、もう一方の列も同じように並び替えられるのと似ています。

位置やカスタム ユーザ データ ブロブの配列を並び替えることはできません。

配列のインデックスを取得する

[Get Array Sub Indices]ノードは、別の配列で使用された整数のインデックスの配列を戻します。このノードは通常、[Sort Array with Key]と併用されます。たとえば、デフォーマの配列とポイント ウェイトの配列を持っていて、強い影響を持つ 2 つのデフォーマを取得する場合、デフォーマ配列のインデックスを取得し、ポイント ウェイト配列に従って降順に並び替えてから、最初の 2 つのインデックスを戻すことができます。

無効なインデックスでの配列にアクセスする

負の値や配列サイズ以上の値など、配列ノードで無効なインデックス値を使用すると、その結果がフィルタリングされます。[Set in Array]を使用する場合など、状況によっては、データ セット内のエレメントに対して配列全体がフィルタリングされる原因となる場合があります。

配列と非配列を結合する

配列は、単一の値と結合することができます。たとえば、スカラの配列に単一のスカラ値を追加すると、その値が配列内のすべてのアイテムに追加されます。同様に、ベクトルの配列をスカラで乗算すると、配列内のすべてのベクトルがそのスカラで乗算されます。

複数の配列を演算する

配列の加算、乗算、比較など、オペレータを使って配列を結合する場合、アイテムごとに演算が実行されます。たとえば、2 つの配列を加算する場合、Value1[0]が Value2[0]に加算されて Result[0]が導かれ、Value1[1]が Value2[1]に加算されて Result[1]が導かれる、というように演算が進められます。

配列のサイズが異なる場合、発生する「オーバーフロー」がフィルタリングされ、出力は最も小さい入力配列と同じサイズになります。この処理は、[Condition]、[If True]、[If False]の各入力が異なるサイズの配列である[If]ノードや、入力が異なるサイズの配列である[Select Case]ノードにも適用されます。

2D 配列

[Array2d]コンパウンドは、サブ配列の配列を再現したものです。このカテゴリは、Preset Manager の[ツール]タブで使用できます。

2D 配列は、内部的に次の 2 つの個別の配列属性として実装されます。

  • [2darray] は、すべてのサブ配列のリニア的(1 次元的)な連結です。

  • [2darrayids] は、2D 配列内の各サブ配列の最後のインデックスを格納する整数の配列です。

単一のオブジェクトで複数の 2D 配列を使用する場合は、これらの属性の名前を[Build 2D Array]コンパウンドで変更する必要があります。また、2D 配列を操作する他のコンパウンドでも、同様の名前変更を行う必要があります。このようにしないと、異なる 2D 配列同士で、相互に上書きされてしまいます。それとは別に、内部的な動作の仕組みを考慮することなく、[Array2d]コンパウンドを使用できます。

2D 配列に対する一般的なワークフローは、次のとおりです。

  1. 標準的な配列ノードを使用して、標準的な配列を作成します。

  2. [Build 2D Array(2D 配列の作成)]を使用して、配列を 2D 配列に組み立てます。

  3. 2D 配列の値を取得して操作するには、[Select SubArray in 2D Array(2D 配列内のサブ配列の選択)]を使用してから標準的な配列ノードを使用します。

  4. 2D 配列の値を変更するには、[Set SubArray in 2D Array(2D 配列内のサブ配列の設定)]を使用します。