Blenderのジオメトリーノード:For Each Elementノードを使って多様なインスタンスを作る方法を解説します。ジオメトリーノードで地形や町などを作るときにとても便利な機能です。
この記事は、Blenderのジオメトリーノード:For Each Elementノードを使ったインスタンスの作り方について基礎を知りたい中級者向けの記事です。
難易度
インスタンスとは
そもそもBlenderで言われるインスタンスとは、メモリを節約して同じジオメトリのコピーを複数作り、複数の場所に配置できる っていう感じです。大量にオブジェクトを作りたいときに利用されます。
例:木、石、植物、建物、etc…

インスタンスの基本的な作り方
例えば星のカーブをたくさん配置してみます。Instance On Pointsを使って、ポイントの数だけインスタンスを作成でき、その場所に配置できます。
ただインスタンスは実体は一つの同じもので、移動・スケール・回転しか操作できません
。大きさを変えることや回転させて、違う物体のように見せても、この星は八つの尖った部分がある形までは変えられません。Starノードの基本設定を変えることはできていないということです。

複数の種類のインスタンスを作ってみる
Geometry to Instanceで複数のジオメトリーをつなげば、コレクションに入ったインスタンスのような扱いをすることができ、8つ突起、5つ突起の二種類の星を作ることができます。
しかし何種類も違うジオメトリを作らないといけないので少し面倒です。(2,3種類ならこれでいいと思いますが)
For Each Elementノードで複数のインスタンス作成
For Each Elementノードは入力したジオメトリの頂点や辺、面などのドメインを使い、その数のオブジェクトを作り操作できます。

上記ではPointsノードのCountを5にして5種類のインスタンスを生成しようとしています。
Starノードの突起の数をRandom Valueノードでランダムに決めたいとおもっています。このとき、StarノードのPointsの入力はフィールドの値を受け取らないので、Random ValueノードにはIDやIndexなどを入力して、出力する値を一意に定めなければなりません。For Each Elementノードの入力ノードにはIndexのアウトプットソケットがあり、ジオメトリの頂点・辺・面のIndexをデフォルトで出力してくれます。これを使えばランダムな値を得ることができます。
これをそのまま出力することもできますが、今回はインスタンス化したいので(処理が早くなる)For Each Elementノードの中でGeometry to Instanceノードを使ってインスタンス化します。出力されるインスタンスはコレクションのようにまとまっているので、Instance on Pointsノードを使うときはPick Instanceにチェックをいれます。(For Each Elementノードのアウトプットは下側を使います。上は入力したジオメトリがそのまま出ます)
ジオメトリを入力しても良い

GridやCubeを入力してその頂点や辺の位置にインスタンスを作成することもできます。上の例ではEdge(辺)の位置にインスタンスを作成しています。
Positionの情報が必要なのでPositionノードを入力側につなぎます。するとFor Each Elementノードの内側で使えるようになるのでその情報を使って移動させます。
注意:処理が重くなる
実体化されているオブジェクトをたくさん作っているということなので、何十、何百と作るとインスタンスのときと違い処理が遅くなります。
数種類(3~5くらい…?)のものを作ってインスタンス化し、それを配置すると処理とバリエーションのバランスが良いのではないでしょうか。
まとめ
この機能を使えば、ちょっと形が違う石や、木など、バリエーションが少し欲しいものをたくさん作るときに便利です。
For Each Elementノードは新しく追加されたノードですが、これからもどんどん便利なノードが増えそうです。ジオメトリーノードはたくさんのものを操作したり作成するのにとても適した機能なので学習コストはかかりますが、楽しいしとてもオススメです。