マテリアル・マップ
MaxScript チートシート の章一覧
質感まわりの操作です。マテリアルを作ってノードの .material に代入、マップをマテリアルの各マップ用プロパティに差し込む、マテリアル エディタのサンプル スロットを読み書き が基本パターンです。
マテリアルを作って割り当てる
3ds Max 2022 の既定は フィジカル マテリアル(PhysicalMaterial)です。standardMaterial は旧来のスタンダード マテリアルで、プロパティ名が異なります。
$.material = standardMaterial diffuse:(color 255 0 0) -- 旧来のスタンダード マテリアル
m = PhysicalMaterial name:"Metal" -- フィジカル マテリアル(2022 の既定。name: はマテリアル エディタに表示される名前)
m.base_color = color 200 200 200
$.material = m
for o in selection do o.material = m -- 選択全体に同じマテリアル
.materialがノードに付いているマテリアルです。undefinedを代入すると解除されます。- 同じマテリアルを複数のノードに入れると共有されます。パラメータを変えるとそのマテリアルを持つ全ノードに反映されるので、別々にしたいときは
copy mしたものを入れます。
マップ(テクスチャ)を差し込む
m = standardMaterial()
m.diffuseMap = bitmapTexture filename:((getDir #maxroot) + "maps\\uvwunwrap\\UV_Checker.png") -- ディフューズにビットマップ(3ds Max 同梱の画像)
m.bumpMap = noise size:5.0 -- バンプにノイズ
m.bumpMapAmount = 50 -- バンプの強さ(%。既定 30)
$.material = m
showTextureMap m on -- ビューポートに表示
- マップスロット名(
diffuseMapbumpMapopacityMap…)はマテリアルのクラスごとに異なります。showProperties mで一覧できます。フィジカル マテリアルならbase_color_map/bump_map/bump_map_amt(0〜1)。
マテリアルエディタを操作する
meditMaterials[1] -- スロット1のマテリアル
meditMaterials[1] = m -- スロット1に入れる(同じことを setMeditMaterial 1 m でもできる)
MatEditor.mode = #basic -- コンパクト エディタで開く(#advanced はスレート)
MatEditor.Open() -- マテリアルエディタを開く
meditMaterialsは コンパクト マテリアル エディタの24個のサンプル スロット に対応する配列です。MatEditor.modeが#advanced(スレート マテリアル エディタ)のままだと、スロットに入れても見えません。
マルチ/サブオブジェクト マテリアル
mm = multiMaterial numsubs:3 -- サブマテリアル3つ
mm.materialList[1] = standardMaterial diffuse:red
mm.materialList[2] = standardMaterial diffuse:green
mm.materialList[3] = PhysicalMaterial()
mm.materialIDList -- 各サブのマテリアルID
$.material = mm
- サブマテリアルの並び順とマテリアル ID は別物です。面に割り当てるのは ID の方で、既定では
#(1, 2, 3)と並びます(materialIDListで変えられます)。 - ⚠️ どのサブが効くかは 面のマテリアルID で決まります(編集可能ポリゴンに変換してから:
convertToPoly $→polyop.setFaceMatID $ #{1..2} 2)。
シーンのマテリアルを走査する
-- 全ノードのマテリアルを集める(重複あり)
for o in objects where o.material != undefined do print o.material.name
sceneMaterials -- シーンで使われているマテリアルとルート レベルのマップ
sceneMaterials.count
sceneMaterialsは更新が遅れることがあり、削除したノードのマテリアルが残ることもあります。UpdateSceneMaterialLib()で強制更新できます。確実なのはノードから集める方法です。
落とし穴まとめ
- マップスロット名はマテリアルクラスごとに違う。
showPropertiesで確認する。 - マップの効き具合は
bumpMapAmount(スタンダード、%)/bump_map_amt(フィジカル、0〜1)のような別プロパティで決まる。 - マルチ/サブオブジェクト マテリアルは面のマテリアルIDと連動する。
meditMaterialsはコンパクト マテリアル エディタのスロット。
関連
- マテリアルのプロパティ名を調べる: 「デバッグ・調査」章
- 面のマテリアルID操作: 「メッシュ・ポリゴン」章
コメント