D日記

モーションアーティストの技術ブログだよ。日常も書くよ。

MENU

【MaxScript】マルチマテリアル切り替えリグ

マルチマテリアル内のマテリアルを切り替えるリグを作っていこうと思います。

これから作るもの

アトリビュートの変更でマテリアルをチェンジするリグです。
f:id:ponta565:20170127170757g:plain

シーンの用意

「Body」という名前のついたBoxを用意。
今回はこのボックスに貼り付けたマルチマテリアルの値を切り替えられるようにします。
f:id:ponta565:20170127122912p:plain

適当にマテリアルを用意します。
赤枠内は「標準マテリアル」
それをバックアップ用のマルチマテリアルに接続し、
更にその出力を、「Body」オブジェクトに引っ付ける為のマルチマテリアルに接続します。
インデックスは3番目に接続。 f:id:ponta565:20170127123234p:plain

切り替えスクリプトを書く場所を確保

Bodyオブジェクトのスケールコントローラーに「スケールスクリプト」を割り当てます。
下記スクリプトでもOKです。

$Body.scale.controller = Scale_Script();

※使用しないコントローラーであれば、スケールでなくても構いません。
f:id:ponta565:20170127123936p:plain

アトリビュートを追加する

次にBodyを選択した状態で、モディファイヤパネルに切り替え、
「アトリビュートホルダー」モディファイや~を適用します。
ここに状態制御用のアトリビュートを追加します。
f:id:ponta565:20170127125400p:plain


Bodyを選択した状態で、「Alt + 1」を押して、「パラメータ編集」ウィンドウを開きます。
f:id:ponta565:20170127125633p:plain

下記画像のようにパラメータを追加します。
f:id:ponta565:20170127125813p:plain

すると下記画像のようにアトリビュートが追加されました(๑´•.̫ • `๑)
これらの状態をスケールスクリプト内で制御します。
f:id:ponta565:20170127125915p:plain

スクリプトコントローラー内に変数を用意する

①Bodyオブジェクトのスケールコントローラをダブルクリックして
Body\スケール ウィンドウを表示します。
②変数名を入力します「Body」じゃなくても大丈夫です。
③作成した変数を選択している状態で、「トラック割り当て」をクリック。
④「トラックビュー選択」ウィンドウで「Body」オブジェクトを選択。
f:id:ponta565:20170127151412p:plain

同様に、「Change」変数も追加します。
これは、先程「アトリビュートホルダー」で追加した「Change」アトリビュートを格納するためのものです。
f:id:ponta565:20170127152631p:plain

スクリプトで挙動を試してみる

割り当てた変数が機能するか試してみましょう(๑´•.̫ • `๑)
下記スクリプトを記述し、「評価」を押下。

mats = Body.material.materialList[3];
print mats;

この状態でタイムスライダーを動かすと、大量のマテリアル名が出力されます。
つまり、ちゃんと情報を拾えているということです!
f:id:ponta565:20170127151844p:plain f:id:ponta565:20170127152149p:plain

次は「Change」変数にアクセスしてみましょう。

print Change;

タイムスライダーを動かすと、Changeアトリビュートの現在セットされている値が整数で出力されます!
f:id:ponta565:20170127153552p:plain

用意した素材をスクリプトで繋げる

「ScriptController」は Mayaで言うところのエクスプレッションです。
後は下記コードを記述すれば完成です(๑´•.̫ • `๑)

mats = Body.material.materialList[3];
setMat = Body.material;
setMat.material1 = mats[Change];
[1, 1, 1]

f:id:ponta565:20170127170455p:plain

実際の動作はこんな感じになります。
f:id:ponta565:20170127170757g:plain

応用すれば色々出来ると思います(๑´•.̫ • `๑)