リファレンス / 3ds Max / MaxScript チートシート

マテリアル・マップ

  • 3dsMax
  • MaxScript
  • チートシート
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                                      -- ビューポートに表示
  • マップスロット名(diffuseMap bumpMap opacityMap …)はマテリアルのクラスごとに異なります。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 はコンパクト マテリアル エディタのスロット。

関連

← MaxScript チートシート へ