
文系の blender 4.1 はじめての Geometry Node | Repeat 繰り返し
前の記事で、ほとんどのプログラムは、if(条件分岐)と、for, while(繰り返し)でできている、と書きましたが、ほぼ本当です。
ジオメトリノードでは、for, while などのノードはありませんが、おもに比較的最近になって導入された Repeat ノードがそれにあたります。
ここでは、その Repeat ノードについて、簡単に紹介します。
環境 Blender 4.1.0 , Mac Mini M1 OS 14.4
Node の作成
Geometry Node
平面など任意のオブジェクトを追加
上部メニューの Geometry Nodes を選択
New(新規)ボタンをクリック

ここではモディファイア名を RepeatNodes とした。
Group Input(グループ入力)は削除し、以下のノードを組む。

上では、数値を文字列に変換し、確認のため、文字列をカーブとしてビューポートに表示している。
Repeat Node
STEP 1
Repeat ノードを追加し、N キーで左からプロパティ画面を表示させる。
Node タブをクリックし、Repeat ノードのプロパティを表示する。

STEP 2
Repeat ノードの入出力は、ここでは整数としたいので、デフォルトの Geometry を Value(任意)と変更し、Socket Type を Integer とする。

STEP 3
Repeat Node の出力を、Value to String ノードに接続。
Add ノードを Repeat ノード内に追加する。

Repeat Node の Iterations の数値を上げると、上の表示値も同時に上がる。Repeat ノード内で 1 を足す、という操作が 3 回繰り返され、リピート終了後、合計値が出力されているためだ。
1 〜 100 を足す
せっかくの繰り返しなので、1 から 100 までを足し合わせてみる。
1 + 2 + 3 + 4 …. + 98 + 99 + 100 = ?
上の Value は、0 , 1 , 2, 3 … となるので、それを放り込む箱として、Result という変数を別に用意する。
Repeat ノードを選択し、+ ボタンで、合計用の値、Result を追加し、Socket Type を Integer ( 整数 ) とする。

下のようにノードを組み、Value to String ノードへの接続を、Result に変更する。

上の Value の値は、リピート毎に、0, 1, 2, 3, 4 … と値が増え、Result は、同様にリピート毎に、Value の値が加算されて、1, 3, 6, 10, 15 … のように増える。
結果

ノードを組まなくても、101 × 50 = 5050 と簡単に答えが出るとのこと。天才ガロアは、5,6 歳でそのロジックを瞬時に導き出し、即答できたという。
Circle リピート 01
せっかくのジオメトリノードなので、ジオメトリを繰り返してみる。
STEP 1
上の同じ手順で、新しいジオメトリノードを作成。名前を RepeatCircles とする(必須ではない)
Group Input(グループ入力)は削除し、以下のノードを組む。

上の 100 までの足し算と同じで、ここでは、Geometry が合計値の箱の役割をし、Join Geometry(ジオメトリ統合)ノードで、リピート毎に新規の Curve Circle(カーブ円)を加えている。
ただ、このままでは Iterations を増やしても、同じ大きさのサークルが追加され、みためが同じなので、半径をリピート毎に増やしてみる。
STEP 2
上記と同じ手順で、Repeat ノードに 半径用の変数 Rad を作成し、Socket Type を、Float とし、下のノードを組む。
Float は小数点以下を含む値。上述の Integer は整数。


Rad は、初期値 0.1 から、リピート毎に 0.2 加算され、0.3, 0.5. 0.7 … の値をカーブサークルのRadius(半径)に渡している。上では、この処理を、6 回 繰り返している。
STEP 3
さらに、Transform Geometry ノードを加え、 カーブサークルの Translation をランダムに変化させた。


Transform Geometry | ジオメトリトランスフォーム
ジオメトリの Translation(移動)、Rotation(回転)、Scale(スケール)を変更することができる。
Random Value | ランダム値
ランダムな値、乱数を生成できる。上では、0 から 0.2 までの乱数を生成している。
本来は、Random Value の出力するフィールド値は、単数値である Translation には接続できないが、Random Valueの ID に整数値(上では、0.2等の Rad の値を 10 倍)を与えると、接続可能になる。
スマートなやりかたではないかもしれない。他の方法や詳細はまだよくわかっていない。
Circle リピート 02
ノード自体は上と同様だが、すこし立体的なオブジェクトを作成してみる。
STEP 1
下のオブジェクトを作成し、名前を RingCircle とした。

ジオメトリノードの構成は、上の Curve Circle とほぼ同じ。相違点は、
Curve Circle の代わりに、Object Info(オブジェクト情報) ノードを接続し、上の RingCircle を指定。
ランダム値による変化を、Translation(移動)から、Rotation(回転)に変更。

結果

まとめ
すこし詳しい方なら(そもそもそんなひとは読んでないかもしれませんが)、それはリピートノードを使わなくてもできるよ、と指摘されるかもしれません。
そもそもオブジェクトは、点や線や面の連続、繰り返しで、それじたいがすでにリピート構造ともいえ、そのまま利用できるからです。
ただ、リピートノードでなくてはできないこともあるでしょうし、理解しておくと幅も広がるでしょう。わたしもこれから応用したいと思っています。ただ、すこし複雑になると、文系は頭もぐるぐる回ってきます。
私の場合、プログラムを組むときもそうですが、複雑さがある程度を超えると、頭がブラックアウトします。安いPCに重い処理をさせるとフリーズするのに似ています。