For eachを使用し、各ポイントにモデルを割り当てる場合は多々あるが、その各モデルに異なるマテリアルを割り当てたい場合の方法になります。
始める前はこのようになっています。
まずは、Material Networkを作成します。
この中にバリエーションに使用するマテリアルを全てまとめて作成します。
Shaderは何でも大丈夫です。
同じ場所に決められた法則で名前が付けられている必要があります。
ここでは、下記の場所に
mat_"番号"という形でShaderを作成しています。
ここから各モデルに対してマテリアルを割り当てていくため、For each Connected Pieceを作成しました。
For each BeginノードにてCreate Meta Import Nodeをクリック。
このMetadataノードのDetailアトリビュートで下記を取得することができます。
numiterations
反復の予想合計数で、Block Endの Max Iterations と Single Pass パラメータを考慮します。
iteration
現行の反復数で、常に0から始まり、各ループで1ずつ増加します。
ここでiterationを使用し、ループ内で何回目のループなのか取得することができます。
Attribute Wrangleを追加し、下記のように接続。
Run overを追加し、下記のように記述。
//detailアトリビュートのiterationを取得(現在のループ回数を取得)
int iter = detail(1, "iteration", 0);
//パラメータを作成 string matnet = chs("Material_Network"); string name = chs("Material_Name");
//variationsパラメータを作成し、現行のループ数を元に乱数を生成して整数化、それを文字列へ int rd = int(ceil(rand(iter)*chi("variations"))); string version = itoa(rd);
//生成した番号をマテリアル名の追加して、shop_materialpathアトリビュートを設定 s@shop_materialpath = matnet + "/" + name + "_" + version;
記述したら、横のパラメータボタンをクリック
パラメータが作成されるので、必要な情報を設定する
Variationsには、Material Networkで作成したマテリアルの数を入力。
Material Networkには、割り当てるマテリアルがまとめられたネットワークを指定
Matnetをパラメータに左マウスボタンでドラッグすればOK。
Material Nameにはマテリアル名の共通部分を入力
For each entにフラグを設定すると、マテリアルバリエーションのモデルを配置することができる。
正し、1モデルが複数のデータから成り立っている場合、接続されているプリミティブかどうかで割り当てるマテリアルをきめているため下記のようになってしまう。
この場合の設定は「マテリアルバリエーションを生成する ー複数ジオメトリで1モデルを構成している場合ー」を参照してください。