【Blender】1つのオブジェクトに複数のマテリアルをランダムで設定する方法(material index node)
- 投稿日/更新日
よくあるカラーだけをランダムにする方法(と欠点)
ひとつのマテリアルでランダムなカラーを作る方法は、ネットでも散見されるようにオブジェクト情報ノード
のランダムを使用します。
ただしこれには欠点があります。
ひとつの立方体にこのマテリアルを適用し、モディファイアの配列を使用した場合、ランダムが反映されません。
ランダムを反映させるためには、個別のオブジェクトにする必要があります。これではいろいろ困ったことになります。また、この手法ではカラーしかランダムにできず、全く違うシェーダーやマテリアルのランダムはできません。そこで、ジオメトリノードを使用して、複数のマテリアルをランダムに適用する方法をご紹介します。
ジオメトリノードでランダムにマテリアルを適用する方法
用意するもの
まずはランダムなマテリアルにしたいオブジェクト(以下 立方体とします)と、ジオメトリノードを適用するオブジェクトを用意しました。後者はどうせ消えるのでなんでもよいです。
まずは立方体にマテリアルを複数あてておきます。今回はA「シルバー」、B「発光」、C「ストライプ」の3種にしています。名前は適当で良いです。このマテリアルには上からマテリアルインデックスが自動的に振られる仕組みになっており、上から0番となります。配列番号が0からスタートするのはプログラム界隈ではお約束なのですが、戸惑う人もいるかもしれませんね。ここで重要なのは、「マテリアルは3つある」が「インデックス番号は0から始まり、一番大きいのは2」ということです。
ジオメトリノードの設定
ジオメトリのオブジェクトに新規でジオメトリノードを作成し、以下のようなノードを組みます。画面はBlender4.0ですが、3系統でも問題ないはずです。
複雑そうに見えますが、一つづつ解説します。
これは簡単ですね。3✕3のグリッド(網目状)のポイントに、先程の立方体を配置するノードになります。
このまま出力すると、立方体が9個並ぶだけです。
次に名前付き属性格納(Store Named Attribute)ノード
を使用します。インスタンス
を指定することで、インスタンスのインデックス番号をインデックスノード
で取得できます。このノードで処理していることは、9個の立方体(インスタンス)のインデックス番号を「tekitoudayo」という変数名をつけておくことです。これで別のノードで変数を呼び出せます。インデックス番号は必ず整数なので、項目も整数
を選択しておきます。
次に重要なのは、一旦インスタンス実体化
をしておくことです。これをしておかないと、9個の立方体は全部で1つのオブジェクトと認識されるため、個々にマテリアルをあてることができません。
ランダム値ノード
の入力にあるID
が、個々にマテリアルを適用させる重要な項目です。このIDに入力されたインデックスごとにランダム生成をするからです(ドキュメント参照:ジオメトリノード-ランダム値ノード)。名前付き属性ノード
で変数名「tekitoudayo」を呼び出し、インデックス番号をIDに送ることで、それぞれの立方体ごとにランダム値が生成され、マテリアルが設定される仕組みです。
ランダム値ノード
の設定は「整数」、最小と最大は0と2になります。これでつまり0・1・2のいずれかがランダムで選ばれます。
わかりましたかね? 書いていながら私は6割くらいしか理解できてません(笑)。とくにマテリアルインデックスの設定がこの接続でなぜランダムになるのかわかっていません。将来的に仕様変更されそうな感じがします。
とはいえ、現状ではこの設定は有効で、いろいろ使い道がある気がします。
備忘録として残しておきます。