道に沿って並ぶ電柱や線路の枕木のようなものを作りたい場合
カーブに沿わせてオブジェクトを配置するといった操作をすることが多いです
ジオメトリノードの搭載でそういった「配置」の選択肢が増えたので
試しながら考察してみたいと思います
2.8でも使える配置
まず これまでのバージョンでも使える方法をおさらいします
子にしたオブジェクトを頂点や面の位置に配置するインスタンス化という機能があります
経路になるカーブと 面を配置する間隔に合わせた平面を用意して
平面に配列(Array)のモディファイアを設定して
「適合する種類」の設定をカーブに合わせるに変更して カーブ項目に経路になるカーブを指定することで
平面がカーブの長さに合わせて複製された状態になり
カーブのモディファイアを設定することでカーブに沿って平面が作成されることになります。
板が意図せず傾いた状態になる場合にはカーブのオブジェクトデータプロパティの「ツイスト方式」をZ-UPにするといいでしょう
平面のオブジェクトの子に適当なオブジェクトを親子付けして
平面オブジェクトの「インスタンス化」の項目を頂点や面に変更すると、
頂点や面の位置に 子にしたオブジェクトが現れます
面にした場合 面の向きに合わせてオブジェクトも回転します
下の「インスタンサーを表示」の ビューポート とレンダーのそれそれのチェックを外すと
元になった面がビューポート上やレンダリング時には表示されなくなります。
さて、これはこれで便利な機能ですが、少し煩雑なのと、
1つのオブジェクトしか並べられないのでバリエーションのあるものを並べるといったことはできません。
また うまく配置するには それぞれのオブジェクトの原点が同じ位置にないといけません
Blender2.9のジオメトリノード
まずはBlender2.93のジオメトリノードの機能を試してみます
ジオメトリノードでは Collectionの中身からランダムにオブジェクトを選択して配置する機能がつきました
2.9のジオメトリノードではカーブのデータを扱うことができないので
先の方式のようにカーブを利用して面を配置した後に ジオメトリノードでオブジェクトを配置しています
頂点位置に配置することになるので 配列のモディファイアのマージをオンにして重なる位置にある頂点は結合しています
面の位置に配置する機能はないようですが1列に配置するのはどうすればいいでしょうか?
線状のポリゴンを用意してもいいですが、頂点ウエイトを設定して グループでフィルタリングしてみました
選択している頂点にGroupの頂点グループが設定してあります。
ポイント分離のマスクにGroupと入力することでグループを設定してある頂点とそれ以外にフィルタできています
「インスタンス化」ではカーブの向きに沿って回転していましたが、こちらでは元のオブジェクトと同じ方向を向いてしまっています
とりあえず面の法線の方向に向けてオブジェクトを回転させてみます。
回転をベクトルに整列は「XYZ」の軸をどれだけ回転すると入力されたベクトルの値方向と重なるか計算するノードです
ここでは面法線のnormalを計算の元にしています
(ジオメトリの入出力をつないで入力部分をクリックすると候補に表示されます)
軸に沿わせた回転をさせたい場合には 面を配列複製する時に 線と垂直になるように設定して
整列するベクトルも変更すればいいようです。
Blender 3.0のジオメトリノード
Blender3.0では ジオメトリノードではカーブを扱えるようになった上に
属性周りの設定が大きく変化しました
カーブに沿わせてランダム選択したもの配置というのはこうなりました。
左上にあるオブジェクト情報でカーブを指定して、カーブからポイントで配置するためのポイント情報を取得しています。
指定したコレクションの中のオブジェクトを個別選択できるようにするには
「コレクション情報」の子を分離と 「ポイントにインスタンス作成」のインスタンスのみのチェックをオンにする必要があるようです。
コレクション内のオブジェクトは 標準ではグローバル座標でのオブジェクト位置に影響を受ける状態になっていますが
コレクション情報の子をリセットをオンにすると それぞれのオブジェクトの原点位置を基準に配置計算されるようです。
ワールド原点に置いたり 配置の基準になるオブジェクトの原点と揃える必要がなくなるのは便利ですね。
子をリセットをオフの状態で「オリジナル」が選択状態だと グローバル原点からの位置で平行移動した状態になります
2.9でポイントインスタンスに相当するポイントにインスタンス作成は
インスタンスインデックスで 複数入力されたものの中のどれを使用するか等の指定ができるようになったり機能が増えています
インスタンスインデックスに入力されているランダムはインデックス数の範囲内の値をランダム生成して、どのオブジェクトを使うかの指定をしています
因みに回転に接続している オイラー回転のノードは
回転でZ軸がカーブの線の方向に向くような値なので 配置するオブジェクトの向きと合わせるように調整するものです
ジオメトリノードでの配置は単に規則的な値だけでなく どんどんノードを足して思い通りに調整したり つなぎなおして元に戻したり
試行錯誤が非常に楽なのでどんどん試していきたいですね。