3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Blender/GeometryNodes】RepeatZoneノードを使って高さの異なるオブジェクトを積み上げる

Last updated at Posted at 2025-01-30

untitled.png
今回はBlenderのGeometry Nodesに4.0から追加されたRepeatZoneノードを使って
異なる高さのオブジェクトを空高く積み上げる方法を紹介します。

RepeatZoneの挙動

RepeatZoneノードは特定の処理を反復するノードです。

簡単なサンプルを作ってみます。
image.png

新しく作ったCubeにGeometry Nodesを適用したらRepeat Zoneノードを追加します。
このノードはベージュの枠内の中の処理をIterationsの回数分反復します。

image.png

RepeatZoneの中にJoin Geometry→Set Positionと繋ぎます。
Set PositionのOffsetはZ:0.5で、Z方向に位置が変わるように設定します。
Group InputとJoin Geometryで合流させます。
そうするとリピートする度にCubeがZ方向へ移動しながら増えていくことが確認できます。

GeometryNodes完成版

それでは初めていきましょう。
全容をざっくり掴むため、まずは完成版のノードをお届けします。
image.png

ネストしたGroupNodesの中身
image.png

システムの仕組み

仕組みとしては、指定のcollectionからランダムに取り出したオブジェクトを
Instance on Pointsで1点に配置、
そのオブジェクトのバウンディングボックスの高さを取得し
Z Up方向にオフセットして配置…を指定回数分繰り返すというものです。

手順前編:オブジェクトをランダムに取り出す仕組み

image.png

とりあえずサンプルオブジェクトを任意の数配置して、新規Collectionに格納しておきます。
私はCone、Icosphere、Suzzanneの3体をTestObjというCollectionに格納しました。

Collection Infoノードを追加し、Join Geometry ノードに接続します。
Collection Infoから先ほど作ったCollectionを指定すると、
右上のビューに3体のオブジェクトが同時に表示されました。
全部表示されているのでゴチャっとしていますので、こちらを
1つずつ取り出すノードをここから組んでいきます。

image.png

ノードを追加し、少し組み換えます。
まず、Instance on Pointsノードを追加します。つないだGeometryのPoint上に
Instanceを表示するノードです。
そして、Pointsノードを追加し、Instance on PointsのInputに繋ぎます。
先ほど追加したCollection InfoをInstance on PointsのInstanceのInputに繋ぎ
Instance on Points→Pick Instance、Collection Info→Separate Children/Reset Childrenにもチェック。
これでInstanceとして1つずつオブジェクトが取り出せるようになりました。

image.png

ランダムのObjectをInstanceとして取り出すノードを組みます。
Instance on PointsのInstance Indexに
Random Valueノードを追加し、Integerに変更し整数が取り出せるようにします。

Addノード、Domain Sizeノードを追加し、Collection Infoから
図のように順番に繋いでいきます。
Domain SizeはCollection Infoに格納されているオブジェクトの数で、
1を追加している理由としては、Random ValueではMinからMax-1の間の整数が取り出されるためです。
現状だとオブジェクトの数は3つなので「0,1,2」が取り出されるのですが
Instance Indexとしては「1,2,3」としないと3つ目のオブジェクトが
出現しなくなるため1を追加します。

ランダムに取り出す仕組みができたのでGroupNodesでまとめていきます。
image.png

上記を選択してCtrl+Gでまとめます。

GroupInputの中に入ります。
image.png

親階層からIDとSeed値を取り出したいので、Random ValueのIDとSeedを
Group Inputノードに接続します。
右のGroupタブも連動して追加されます。

手順後半:オブジェクトを繰り返しオフセットして配置する仕組み

image.png

ここから、Tabキーで親階層に上がり、オフセットする仕組みを作っていきます。

繰り返す度に別のオブジェクトが出現するようにするため、
先ほどのRandom IDを毎回違うものにします。
image.png

右のRepeatノードのItemsにIDを追加し、Integerとします。
image.png

IDが繰り返す度に1加算されるように
RepeatZoneの始まりと終わりの間にAddノードで1.0を加算して、
RepeatZoneの出口と繋ぎます。
Repeatの入口を先ほど作ったGroupNodesのIDに繋いで、RandomのIDが
繰り返す度に加算されたものがRandomのIDに渡るようになり、
毎回違うオブジェクトが出やすくなります。

image.png

RepeatZoneの始まりとJoin Geometryの間にSet Positionを追加して、Zに任意の値を入れ、
Repeat ノードの Iterations の値を上げてみると、ランダムなオブジェクトが積み上がって
いくのが確認できました。

しかしこのままではオブジェクト同士が重なってしまい問題があります。
それぞれのオブジェクトのBoundingBoxの高さ分Z方向にオフセットする仕組みを作っていきます。
image.png

GroupNodesからJoin Geometryに繋がっていたノードをCtrl+右クリックで切り、
Realize Instancesノード、Bounding Boxノードを追加して
GroupNodesからJoin Geometryまでを順番に繋いでいきます。
そうするとオブジェクトが四角く変化します。これはそれぞれのオブジェクトのBounding Boxです。

image.png

追加するノードが増えるので注意しましょう。(赤い囲み)
オブジェクト全体のBounding Boxと、ランダムのオブジェクトのBounding Boxの高さを
Addノードで加算します。こちらをSet PositionのOffsetに繋ぎます。
前に追加していたSet Positionは使わないので接続を切ってしまって大丈夫です。

ノードがぐちゃっとして見づらいときは
Shift+右クリックでノードの分岐点を追加し、整理します。
image.png

Offsetされたランダムのオブジェクトが表示されました。
image.png

VectorのXYZ全てに1が加算されてループされてしまっているため
右奥斜めにどんどんオフセットされてしまっていますが、今回使いたいのはZ方向だけのため、
Vector MathのMultiplyノードを追加、AddとSet Positionの間に挿入し、
XとYに0をかけて動かないようにします。
image.png

完成です!

いかがでしたでしょうか?
配置場所を工夫することで色々な表現に使えそうですね。
色々とセオリーはあるようなのですが、下記の動画の方法が
とても参考になりました。

次回はこちらにランダムの回転を加える方法を追加解説しようと思います。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?