モディファイア
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* は不可逆。元が必要なら複製を残す。
- 同じインスタンスを複数ノードに追加するとインスタンスモディファイアになる。
関連
- 対象オブジェクトを集める: 「選択・取得」章
- 変更できるプロパティ名を調べる: 「デバッグ・調査」章