見出し画像

文系の 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 ノード内に追加する。

Add(加算) は Math(数式)ノードのプルダウンから

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 … のように増える。

結果

Iterations に 100 と入力

ノードを組まなくても、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 をランダムに変化させた。

見やすいように Add ノードは畳んだ。値は同じ。


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(回転)に変更。

見やすいように Add ノードは畳んだ。加算値は 1.0

結果

コペルニクス的ななにかができた。


まとめ


すこし詳しい方なら(そもそもそんなひとは読んでないかもしれませんが)、それはリピートノードを使わなくてもできるよ、と指摘されるかもしれません。

そもそもオブジェクトは、点や線や面の連続、繰り返しで、それじたいがすでにリピート構造ともいえ、そのまま利用できるからです。

ただ、リピートノードでなくてはできないこともあるでしょうし、理解しておくと幅も広がるでしょう。わたしもこれから応用したいと思っています。ただ、すこし複雑になると、文系は頭もぐるぐる回ってきます。

私の場合、プログラムを組むときもそうですが、複雑さがある程度を超えると、頭がブラックアウトします。安いPCに重い処理をさせるとフリーズするのに似ています。

この記事が気に入ったらサポートをしてみませんか?