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

モディファイア

  • 3ds Max
  • MaxScript
  • チートシート
MaxScript チートシート の章一覧

モディファイアスタックの操作です。追加(addModifier)、アクセス(.modifiers[] や名前)、折りたたみ(collapse)が中心です。

追加する

addModifier $Box001 (Bend angle:45)        -- スタックの一番上に追加
addModifier $Box001 (TurboSmooth()) before:1  -- 位置を指定して挿入

-- 作成と同時にプロパティ指定
addModifier $ (Taper amount:0.5 curve:1.0)
  • ⚠️ before: のインデックスは 1 がスタック最上段(評価は下から上)。before:1 で一番上に挿入します。

スタックにアクセスする

$Box001.modifiers          -- スタック全体(配列。[1] が最上段)
$Box001.modifiers.count    -- モディファイア数
$Box001.modifiers[1]       -- 一番上のモディファイア
$Box001.bend               -- 名前で直接アクセス(クラス名)
$Box001.modifiers[#Bend]   -- 名前(Name 値)でアクセス
  • 同じクラスが複数あるときは $.modifiers[1] のように インデックス で指定します。

プロパティを変える

$Box001.bend.angle = 90
$Box001.modifiers[1].angle = 90   -- 同じ意味(最上段が Bend のとき)
$Box001.bend.enabled = false      -- 一時的に無効化(ビューポート)
showProperties $Box001.bend       -- 変更できるプロパティを一覧(→ デバッグ章)

削除する

deleteModifier $Box001 1               -- インデックスで削除
deleteModifier $Box001 $Box001.bend    -- 参照で削除

折りたたむ(collapse)

maxOps.CollapseNode $Box001 true   -- スタック全体を折りたたむ(true=確認プロンプトを抑制)
convertToPoly $Box001              -- 編集ポリゴンに変換(スタックも結果に反映)
convertToMesh $Box001              -- 編集メッシュに変換
  • CollapseNode常にスタック全体 を折りたたみます。第2引数は折りたたみ範囲ではなく noWarning で、true にすると警告ダイアログを出しません(バッチ処理向け)。
  • ⚠️ 折りたたむと モディファイアは消えて結果メッシュだけ が残ります。元に戻せないので必要なら複製を残します。

一部だけ折りたたむ(CollapseNodeTo)

CollapseNodeTo指定したインデックスと、それより下(ベースオブジェクト側) をまとめて折りたたみ、それより上のモディファイアは残します。

-- スタック:  [1]Bend  [2]Taper  [3]Twist  ─ baseobject
maxOps.CollapseNodeTo $Box001 3 true   -- [3]Twist だけを焼き込む([1][2] は残る)
maxOps.CollapseNodeTo $Box001 1 true   -- [1] から下=全部(CollapseNode と同等)
  • インデックスは [1] が最上段、数字が大きいほどベースオブジェクトに近い 並びです([1].[2].[3].baseobject)。
  • CollapseNodeTo node index noWarningその index と下を 1 つの結果に焼き込む。最下段(最大インデックス)を指定すれば、そのモディファイア 1 つだけがベースに統合され、上のモディファイアは生き残ります。第3引数は CollapseNode と同じ noWarning です。

インデックスのずれに注意(追加・コラプスで番号が移動する)

-- 追加は既定で最上段に入るため、既存のインデックスが繰り下がる
-- 追加前:  [1]Bend
addModifier $Box001 (Taper())
-- 追加後:  [1]Taper  [2]Bend  ← 元の [1]Bend が [2] に移動した
  • addModifier は既定で 最上段(index 1)に挿入 するので、元の [1][2] へ、というように 番号が横にずれます
  • コラプスでモディファイアが減ったときも、残ったモディファイアの位置に応じて番号が変わります。

下から順に折りたたむ(逆順の活用)

番号がずれる性質を利用し、最下段から count を使って繰り返す と、上のモディファイアを保ちながら下から 1 つずつ焼き込めます。

-- 一番下のモディファイアだけを焼き込む(上は残す)
maxOps.CollapseNodeTo $Box001 $Box001.modifiers.count true

-- 下から N 個だけ焼き込む(上の保持したい分だけ残す)
keepTop = 1   -- 上から残したい数
while $Box001.modifiers.count > keepTop do
(
    maxOps.CollapseNodeTo $Box001 $Box001.modifiers.count true
)
  • ⚠️ ループ内で固定のインデックスを使い回すと、ずれで対象を取り違えます。毎回 modifiers.count(=最下段)を取り直す か、逆順(大きいインデックスから)で処理するのが安全です。

1つのモディファイアを複数オブジェクトで共有する

b = Bend angle:45              -- 先に作っておく
for o in selection do addModifier o b   -- 同じインスタンスを全員に追加
b.angle = 90                  -- 1か所変えると全オブジェクトに反映
  • 同じモディファイアインスタンスを addModifier すると インスタンスモディファイア になり、一括編集できます。

落とし穴まとめ

  • modifiers[1] が最上段。数字が大きいほどベースオブジェクトに近い。評価順は下から上。
  • CollapseNode は全スタック、CollapseNodeTo node index は指定位置から下だけを焼き込む(上は残る)。
  • addModifier やコラプスでインデックスがずれる。ループでは固定番号を使わず毎回 modifiers.count を取り直すか逆順で処理する。
  • 同クラスが複数ある場合は名前ではなくインデックスで指定する。
  • collapse / convertTo* は不可逆。元が必要なら複製を残す。
  • 同じインスタンスを複数ノードに追加するとインスタンスモディファイアになる。

関連

← MaxScript チートシート へ