概要
リストの全要素に同じ式を一括適用するノードです。[1,2,3] を item * 2 で
[2,4,6] にする、という具合に、値の列をまとめて加工します。バリアントや
バッチ処理に渡す数値列の下ごしらえが主な仕事です。
使い方のポイント
variant_range等で作った等間隔の数列を、item * item(二次カーブ)やsin(item * pi)(山なり)のような式で非線形な列に変換するのが典型index/countが使えるので「番号に応じた値」も作れる: 先頭を0、末尾を1にするならindex / max(count - 1, 1)を使う- 式は
expression_floatと同じエンジン。まず単体のexpression_floatで 式の挙動を確認してから持ち込むとデバッグが楽
関連ノード
expression_float— 同じ式エンジンの単値版list_zip/list_enumerate— 複数リストの合流・番号付き化(このノードの前段)variant_range/seed_range— 入力リストの生成元list_create— 手動でのリスト作成
まず大事なこと
expressionは、リストの各要素ごとに1回ずつ評価されます- つまり
list = [1, 2, 3]でexpression = item * 2なら、- 1個目では
1 * 2 - 2個目では
2 * 2 - 3個目では
3 * 2が順番に実行されます
- 1個目では
要素の型ごとに使える名前と既定式
要素そのものから作られる名前は型によって異なります。item がどの型でも使える
わけではありません。item_type を変更すると、まだ自動既定式を使っている時だけ
expression も次の有効な式へ切り替わります。自分で書き換えた式は維持されます。
| 要素の型 | 要素から使える名前 | 自動既定式 |
|---|---|---|
Number / Float / Int / Bool |
item |
item |
Color |
item_r, item_g, item_b, item_a |
item_r |
Vec2 |
item(Vec2), item_x, item_y |
item_x |
Vec3 |
item_x, item_y, item_z |
item_x |
Map |
下記のキー名 | 0 |
Any と上記以外の構造化型 |
構造化値から作る共通名はありません | 0 |
Any では、実際の各要素が数値・Color・Vec2・Vec3・Map なら、その実体に対応する
名前が評価時に使えます。混在リストでも常に成立する既定式として 0 を使います。
次の共通名は要素の型に関係なく使えます。
| 名前 | 意味 | 例 |
|---|---|---|
index |
何番目の要素か。0始まりです | index % 2 |
count |
全体の要素数です | index / max(count - 1, 1) |
x, y, z, w |
補助入力ピン、または Inspector で与える数値です | item * x |
vec, vx, vy |
補助 Vec2 入力、または Inspector の vec_x, vec_y です |
length(vec) |
flag |
補助 Bool 入力、または Inspector の既定値です | if(flag, 1, 0) |
time, frame, total_frames |
評価時の時刻情報です | sin(time * pi * 2) |
Map 要素の時
要素が Map の時、有効な識別子(value, a, _seed など)になっている非予約キーは
そのキー名を式へ直接書けます。さらに、有効なすべてのキーは item_ を付けた名前でも
参照できます。
たとえば要素がこうなら:
{ "index": 0, "value": 0.25 }
式の中でそのままこう書けます。
value < 0.5
item_index + 1
index は常に「リスト内の現在位置」です。Map 内の index キーを読む時は
item_index を使います。予約名
item, index, count, x, y, z, w, vec, vx, vy, flag,
time, frame, total_frames は標準変数が優先され、同名の Map 値は
item_<キー名> で参照します。先頭が英字か _、残りが英数字か _ で構成された
有効な識別子ではないキーは、式変数として公開されません。
よくある入力ごとの読み方:
| 入力元 | 要素の形 | 式で使える名前 |
|---|---|---|
| 普通の数値リスト | 1, 2, 3 |
item, index, count |
ListEnumerate |
{ "index": 0, "item": 10 } |
現在位置は index、Map 値は item_index, item_item |
ListZip |
{ "index": 0, "a": 1, "b": 10 } |
a, b、Map の index は item_index |
CartesianProduct |
複数キーの Map | 非予約キーを直接、または有効な各キーを item_<キー名> で参照 |
よく使う式
item * 2- 数値を2倍します
item + index- 要素番号ぶんだけ値をずらします
item * x- 外から与えた係数で各要素をまとめて変換します
value < 0.5- Map の
valueを見て Bool を作ります
- Map の
a + bListZipの2本を足します
vec2(item, index)- 数値リストから Vec2 リストを作ります
具体例
例1: 数値を2倍にする
入力:
[1, 2, 3]
設定:
item_type = Numberoutput_type = Floatexpression = item * 2
出力:
list = [2.0, 4.0, 6.0]
count = 3
例2: Map を Bool に変換する
入力:
[
{ "index": 0, "value": 0.25 },
{ "index": 1, "value": 0.75 }
]
設定:
item_type = Mapoutput_type = Boolexpression = value < 0.5 && item_index == 0
出力:
list = [true, false]
count = 2
例3: ListZip の結果を足し算する
入力:
[
{ "index": 0, "a": 1, "b": 10 },
{ "index": 1, "a": 2, "b": 20 }
]
設定:
item_type = Mapoutput_type = Floatexpression = a + b
出力:
list = [11.0, 22.0]
count = 2
例4: 変数や補助入力を使ってまとめて倍率を変える
入力:
[1, 2, 3]
設定:
item_type = Numberoutput_type = Floatexpression = item * xx = 10
出力:
list = [10.0, 20.0, 30.0]
count = 3
x は Inspector で直接入れてもよいですし、Variable Ref を x 入力ピンへつないでも使えます。
どういう時に使うか
- range / seed / zip / enumerate の結果を別の値列へ変換したい時
BatchRenderへ渡す前に、値候補を軽く加工したい時
注意
- v1 は constrained expression です
- 任意 subgraph を各要素に回すノードではありません
- Map の予約名は標準変数が優先されます。同名の Map 値は
item_<キー名>で参照します