Blender 3.6.11 のジオメトリノードで使えるゾーンは Simulation だけでした。Repeat(4.0〜)と For Each Element(4.3〜)は 5.2.1 で使えます。
3つを画面なしで動かして測ると、Repeat はノードを手でつないだものと全頂点が一致し、Simulation はフレームを飛ばすと途中が計算されず(1→48フレームで1フレームぶんしか進まない)、For Each は同じ処理ならフィールドより遅い(4万点で約109倍)という結果でした。
ジオメトリノードの「ゾーン」は、入口と出口の2つのノードで囲んだ範囲を、くり返したり、前のフレームの結果を引き継いだり、要素ごとに実行したりする仕組みです。3.6 から 5.2 へ移ると使えるゾーンが増えますが、それぞれ何ができて、どこでつまずくのか。同じ検証機の 3.6.11 と 5.2.1 LTS で同じノードを Python で組み、結果の座標と時間を測りました。
3.6と5.2で使えるゾーンはどう違う?
| ゾーン | 何をするか | 追加された版 | 3.6.11 | 5.2.1 |
|---|---|---|---|---|
| Simulation | 前のフレームの結果を次のフレームへ引き継ぐ | 3.6 | ○ | ○ |
| Repeat | 囲んだノードを指定した回数くり返す | 4.0 | × | ○ |
| For Each Element | 点や面などの要素ごとに1回ずつ実行する | 4.3 | × | ○ |
| Closure | ノードグループの中へ、外から処理を差し込む | 5.0 | × | ○ |
追加された版は公式リリースノート。○×は、各版の Python でノードを実際に追加できたかで判定しました(対照の Set Position は両方で可、存在しない型名は両方で不可)。5.2.1 には Bake ノードもあります(3.6.11 には無し)。Closure は有無だけを確かめ、動作は測っていません。
測り方:検証機は Core i7-11700F(CPU のみ)。3.6.11 と 5.2.1 LTS を初期設定・画面なしで起動し、Python で組んだノードの評価後の全頂点座標(小数点以下6桁で丸める)と評価時間(各3回の中央値)を比べました。2026年9月25日測定。
Repeat:手でつないだノードと結果は同じか
立方体を「右へずらした写しと結合する」処理を N 回くり返し(ずらす量は毎回倍)、同じノードを N 組コピーして手でつないだものと比べました。Repeat 側は、入口ノードの Iteration(0から数える回数)からずらす量を計算しています。
| 回数 N | 頂点数 | Repeat と手つなぎ |
|---|---|---|
| 0 | 8 | 全頂点一致 |
| 1 | 16 | 全頂点一致 |
| 3 | 64 | 全頂点一致 |
| 6 | 512 | 全頂点一致 |
| 10 | 8,192 | 全頂点一致 |
3.6.11 で組んだ手つなぎとも、5通りすべてで全頂点が一致しました。ずらす量を毎回2倍でなく1.9倍にした Repeat は、頂点数が同じ512でも「一致しない」と判定され、比べ方が違いを見分けられることも確かめています。
3.6 でもノードを回数ぶんコピーすれば同じ形は作れますが、回数を変えるたびにつなぎ直しです。Repeat なら Iterations の数字を変えるだけで済みます。評価時間は N=10 でどちらも約0.02秒でした。
Simulation:フレームを飛ばすと結果が変わる?
縦に並んだ5つの点を、毎フレーム「Delta Time × 1」だけ上へ動かしました(秒速1m)。Delta Time は公式マニュアルによるとフレーム間の秒数で、24fps なら1/24秒です。フレームの進め方だけを変えて、5つの点が上がった量の平均を比べました。
| フレームの進め方 | 上がった量 |
|---|---|
| 1→2→…→48 と順に進めた48フレーム目 | 1.958m(47フレームぶん) |
| 1 から 48 へ直接飛んだ | 0.042m(1フレームぶん) |
| 続けて 24 へ戻った | 0.020m(1 と 48 の結果の間の値) |
| 続けて 49 へ進んだ | 0.083m(48 の結果から1フレームぶん) |
開始フレーム(1)では点は動きませんでした。24 の値は、1 と 48 の結果を時間の比率で混ぜた計算値(0.0417×23/47=0.0204)と一致しました。
3.6.11 と 5.2.1 で、4つの値はすべて同じでした(小数点以下6桁まで)。シミュレーションは前のフレームの結果から1ステップずつ進む仕組みで、飛ばしたフレームぶんは計算されませんでした。タイムラインで途中のフレームへ飛んで確かめると、最初から再生したときとは違う形に見えることになります。公式マニュアルは、ディスクへベイクすれば順番どおりでなくても描画できるとしています。フレームを分けて描画するときは、先にベイクしておきます。
For Each Element:要素ごとに違う形を作る
横に並べた5つの点それぞれに、頂点数「点の番号+3」の円を作りました。比べる相手は、1つの三角形を全部の点へ配る Instance on Points です。

For Each は3〜7角形の5つ(計25頂点)を、Instance on Points は同じ三角形5つ(計15頂点)を出しました。違いは、Mesh Circle の頂点数が「点ごとに値が変わる入力(フィールド)」を受け付けないことです。For Each を使わずに点の番号を頂点数へ直接つなぐと、つなぎ線が無効と判定され、何も出力されませんでした(0頂点)。
では、フィールドで書ける処理を For Each に入れるとどうなるか。全部の点の高さを sin(x) だけ上げる同じ処理を、Set Position 1個(フィールド)と、For Each の中で1点ずつ実行する形で比べました。結果の座標は全点で一致しています。
| 点の数 | フィールド | For Each | For Each の遅さ |
|---|---|---|---|
| 1,024 | 0.6ミリ秒 | 6.9ミリ秒 | 約11.5倍 |
| 10,000 | 1.2ミリ秒 | 49ミリ秒 | 約41倍 |
| 40,000 | 1.8ミリ秒 | 197ミリ秒 | 約109倍 |
点が増えるほど差が開きました。4.3 のリリースノートも「単純なフィールド評価は、同じ計算をゾーンの中で行うよりはるかに速い」と注意しています。フィールドで書ける処理は For Each に入れず、円の頂点数のように要素ごとに変えられない入力を使うときに限るのがよさそうです。
Pythonで組むときの違い
ノードグループに入出力を足す書き方が変わっています。3.6.11 は node_group.inputs.new()/outputs.new()、5.2.1 は node_group.interface.new_socket() で、5.2.1 には inputs・outputs がありませんでした。3.6 向けのスクリプトは、そのままでは 5.2 で動きません。ゾーンは、入口ノードの pair_with_output() で出口ノードと組にしてから使いました。
まとめ
手でコピーしていたくり返しは Repeat に置き換えられ、今回の形では結果も同じでした。Simulation はフレームを飛ばすと途中が計算されないので、確認は最初から再生し、分けて描画するならベイクします。For Each は、フィールドで書ける処理では遅くなります。Closure の動作、ディスクへのベイク、3.6 で保存したファイルを 5.2 で開いた場合は測っていません。
3.6 から 5.2 へ移るかどうかは3.6・4.2 が旧 LTS に入った話、ファイルの互換は3.6 と 5.2 のファイル互換を試した記事、ジオメトリノードを土台にした新しい布は5.2 の布シミュレーションを測った記事、基本の操作はBlender の完全入門にまとめています。

コメント