9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

BlenderAdvent Calendar 2021

Day 11

カーブに沿わせたオブジェクト配置について考える(2.9-3.0)

Last updated at Posted at 2021-12-10

道に沿って並ぶ電柱や線路の枕木のようなものを作りたい場合
カーブに沿わせてオブジェクトを配置するといった操作をすることが多いです

ジオメトリノードの搭載でそういった「配置」の選択肢が増えたので
試しながら考察してみたいと思います

2.8でも使える配置

まず これまでのバージョンでも使える方法をおさらいします
子にしたオブジェクトを頂点や面の位置に配置するインスタンス化という機能があります
image.png
経路になるカーブと 面を配置する間隔に合わせた平面を用意して
平面に配列(Array)のモディファイアを設定して
「適合する種類」の設定をカーブに合わせる
に変更して カーブ項目に経路になるカーブを指定することで
平面がカーブの長さに合わせて複製された状態になり
カーブのモディファイアを設定することでカーブに沿って平面が作成されることになります。

板が意図せず傾いた状態になる場合にはカーブのオブジェクトデータプロパティの「ツイスト方式」をZ-UPにするといいでしょう

平面のオブジェクトのに適当なオブジェクトを親子付けして
平面オブジェクトの「インスタンス化」の項目を頂点に変更すると、
頂点や面の位置に 子にしたオブジェクトが現れます
image.png
にした場合 面の向きに合わせてオブジェクトも回転します
下の「インスタンサーを表示」の ビューポート とレンダーのそれそれのチェックを外すと
元になった面がビューポート上やレンダリング時には表示されなくなります。

さて、これはこれで便利な機能ですが、少し煩雑なのと、
1つのオブジェクトしか並べられないのでバリエーションのあるものを並べるといったことはできません。
また うまく配置するには それぞれのオブジェクトの原点が同じ位置にないといけません

Blender2.9のジオメトリノード

まずはBlender2.93のジオメトリノードの機能を試してみます

ジオメトリノードでは Collectionの中身からランダムにオブジェクトを選択して配置する機能がつきました
2.9のジオメトリノードではカーブのデータを扱うことができないので
先の方式のようにカーブを利用して面を配置した後に ジオメトリノードでオブジェクトを配置しています
image.png
頂点位置に配置することになるので 配列のモディファイアのマージをオンにして重なる位置にある頂点は結合しています

面の位置に配置する機能はないようですが1列に配置するのはどうすればいいでしょうか?
線状のポリゴンを用意してもいいですが、頂点ウエイトを設定して グループでフィルタリングしてみました
image.png
選択している頂点にGroupの頂点グループが設定してあります。
ポイント分離のマスクにGroupと入力することでグループを設定してある頂点とそれ以外にフィルタできています

「インスタンス化」ではカーブの向きに沿って回転していましたが、こちらでは元のオブジェクトと同じ方向を向いてしまっています
とりあえず面の法線の方向に向けてオブジェクトを回転させてみます。
image.png
回転をベクトルに整列は「XYZ」の軸をどれだけ回転すると入力されたベクトルの値方向と重なるか計算するノードです
ここでは面法線のnormalを計算の元にしています
(ジオメトリの入出力をつないで入力部分をクリックすると候補に表示されます)

軸に沿わせた回転をさせたい場合には 面を配列複製する時に 線と垂直になるように設定して
整列するベクトルも変更すればいいようです。
image.png

Blender 3.0のジオメトリノード

Blender3.0では ジオメトリノードではカーブを扱えるようになった上に
属性周りの設定が大きく変化しました
カーブに沿わせてランダム選択したもの配置というのはこうなりました。
image.png

左上にあるオブジェクト情報でカーブを指定して、カーブからポイントで配置するためのポイント情報を取得しています。

指定したコレクションの中のオブジェクトを個別選択できるようにするには
「コレクション情報」の子を分離と 「ポイントにインスタンス作成」のインスタンスのみのチェックをオンにする必要があるようです。

コレクション内のオブジェクトは 標準ではグローバル座標でのオブジェクト位置に影響を受ける状態になっていますが
コレクション情報の子をリセットをオンにすると それぞれのオブジェクトの原点位置を基準に配置計算されるようです。
ワールド原点に置いたり 配置の基準になるオブジェクトの原点と揃える必要がなくなるのは便利ですね。
image.png
子をリセットをオフの状態で「オリジナル」が選択状態だと グローバル原点からの位置で平行移動した状態になります

2.9でポイントインスタンスに相当するポイントにインスタンス作成
インスタンスインデックスで 複数入力されたものの中のどれを使用するか等の指定ができるようになったり機能が増えています
インスタンスインデックスに入力されているランダムはインデックス数の範囲内の値をランダム生成して、どのオブジェクトを使うかの指定をしています
image.png

因みに回転に接続している オイラー回転のノードは
回転でZ軸がカーブの線の方向に向くような値なので 配置するオブジェクトの向きと合わせるように調整するものです
image.png
ジオメトリノードでの配置は単に規則的な値だけでなく どんどんノードを足して思い通りに調整したり つなぎなおして元に戻したり
試行錯誤が非常に楽なのでどんどん試していきたいですね。

9
8
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
9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?