概要
条件式でリストから要素を選別するノードです。item >= 0.75 のような式が
true になった要素だけが残ります。候補の間引き・しきい値による選別・
「偶数番目だけ」のような規則的な抽出に使います。
使い方のポイント
list_map(変換)との対: map は「全要素を加工」、filter は「要素を選別」。 両方使うなら filter → map の順が無駄がない- しきい値を
x入力ピンで外部化すると「スライダーで候補の絞り込み具合を 調整する」対話的な使い方ができる - 件数が変わることに注意: 後段が固定件数を期待する構成
(
list_unpack等)とつなぐ時はcount出力で確認する
関連ノード
list_map— 選別ではなく変換list_slice— 条件ではなく位置による切り出しexpression_bool— 同じ式エンジンの単値Bool版variant_range/cartesian_product— 絞り込む候補の生成元
まず大事なこと
predicateは、各要素ごとに1回ずつ評価されます- 既定式
trueは要素の型に関係なく有効で、初期状態ではすべての要素を残します - 結果が
trueなら残り、falseなら捨てられます - つまり
list = [0.25, 0.75, 1.25]でpredicate = item >= 0.75なら、0.25 >= 0.75はfalseなので捨てる0.75 >= 0.75はtrueなので残す1.25 >= 0.75はtrueなので残す という動きになります
要素の型ごとに使える名前
要素そのものから作られる名前は型によって異なります。item がどの型でも使える
わけではありません。
| 要素の型 | 要素から使える名前 |
|---|---|
Number / Float / Int / Bool |
item |
Color |
item_r, item_g, item_b, item_a |
Vec2 |
item(Vec2), item_x, item_y |
Vec3 |
item_x, item_y, item_z |
Map |
下記のキー名 |
| 上記以外の構造化型 | 要素から作る式変数はありません |
Any では、実際の各要素が数値・Color・Vec2・Vec3・Map なら、その実体に対応する
名前が評価時に使えます。次の共通名は要素の型に関係なく使えます。
| 名前 | 意味 | 例 |
|---|---|---|
index |
何番目の要素か。0始まりです | index % 2 == 0 |
count |
全体の要素数です | index / max(count - 1, 1) |
x, y, z, w |
補助入力ピン、または Inspector で与える数値です | item >= x |
vec, vx, vy |
補助 Vec2 入力、または Inspector の vec_x, vec_y です |
length(vec) > 1 |
flag |
補助 Bool 入力、または Inspector の既定値です | flag && index > 0 |
time, frame, total_frames |
評価時の時刻情報です | frame % 2 == 0 |
Map 要素の時
要素が Map の時、有効な識別子(value, a, _seed など)になっている非予約キーは
そのキー名を条件式へ直接書けます。さらに、有効なすべてのキーは item_ を付けた
名前でも参照できます。
たとえば要素がこうなら:
{ "index": 0, "value": 0.25 }
条件式の中でそのままこう書けます。
value < 0.5
item_index == 0
index は常に「リスト内の現在位置」です。Map 内の index キーを読む時は
item_index を使います。予約名
item, index, count, x, y, z, w, vec, vx, vy, flag,
time, frame, total_frames は標準変数が優先され、同名の Map 値は
item_<キー名> で参照します。先頭が英字か _、残りが英数字か _ で構成された
有効な識別子ではないキーは、式変数として公開されません。
よくある入力ごとの読み方:
| 入力元 | 要素の形 | 条件式で使える名前 |
|---|---|---|
| 普通の数値リスト | 0.25, 0.75, 1.25 |
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 >= 0.75- しきい値以上だけ残します
index % 2 == 0- 偶数番目だけ残します
item >= x- 外から与えたしきい値より大きい要素だけ残します
value < 0.5 && item_index == 0- Map の複数条件で絞ります
a * 10 == bListZipの2本の関係で絞ります
具体例
例1: 0.75 以上だけ残す
入力:
[0.25, 0.75, 1.25]
設定:
item_type = Floatpredicate = item >= 0.75
出力:
list = [0.75, 1.25]
count = 2
例2: ListZip の結果から一部だけ残す
入力:
[
{ "index": 0, "a": 1, "b": 10 },
{ "index": 1, "a": 2, "b": 20 }
]
設定:
item_type = Mappredicate = a * 10 == b
出力:
list = [
{ "index": 0, "a": 1, "b": 10 },
{ "index": 1, "a": 2, "b": 20 }
]
count = 2
例3: 偶数番目だけ残す
入力:
[10, 20, 30, 40, 50]
設定:
item_type = Numberpredicate = index % 2 == 0
出力:
list = [10, 30, 50]
count = 3
例4: 変数や補助入力をしきい値として使う
入力:
[0.25, 0.75, 1.25]
設定:
item_type = Floatpredicate = item >= xx = 0.75
出力:
list = [0.75, 1.25]
count = 2
x は Inspector で直接入れてもよいですし、Variable Ref を x 入力ピンへつないでも使えます。
どういう時に使うか
- 量産候補から条件に合うものだけ残したい時
BatchRenderに送る前に候補数を絞りたい時
注意
- v1 は constrained expression ベースです
- 任意 subgraph を predicate として回す用途ではありません
- Map の予約名は標準変数が優先されます。同名の Map 値は
item_<キー名>で参照します