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

階層・グループ

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

オブジェクトを構造化する操作です。親子リンク(transform が伝播する)、グループ(まとめて扱う箱)、レイヤー(表示・管理の単位)はそれぞれ別物です。

親子リンク

$Child.parent = $Parent      -- リンクする
$Child.parent = undefined    -- リンクを外す
$Parent.children             -- 直接の子(読み取り専用の配列)
$Child.parent                -- 親(無ければ undefined)
  • 親を動かすと子も追従します(transform が伝播)。
  • ⚠️ parent への代入は 現在の見た目の位置を維持 します(ワールド位置は変わらない)。

階層をたどる

-- 直接の子だけ
for c in $Parent.children do print c.name

-- 子孫すべて(再帰)
fn getDescendants node =
(
    local result = #()
    for c in node.children do
    (
        append result c
        join result (getDescendants c)
    )
    result
)
getDescendants $Parent
  • children直接の子だけ です。孫まで欲しいときは上のように再帰します。

グループ

group selection name:"MyGroup"   -- 選択をグループ化
ungroup $MyGroup                 -- 1階層だけ解除
explodeGroup $MyGroup            -- 入れ子も含めて完全に解除

isGroupHead $MyGroup             -- グループの親ノードか
isGroupMember $Box001            -- グループの中身か
setGroupOpen $MyGroup true       -- グループを開く(中身を個別選択可能に)
  • グループは「グループヘッド」というダミーノードに子をぶら下げた構造です。
  • ⚠️ グループの中身を直接いじるには setGroupOpen ... true で開くか、$MyGroup.children でアクセスします。

レイヤー

lm = LayerManager
lay = lm.newLayerFromName "Props"   -- 作成(同名があると undefined)
lay = lm.getLayerFromName "Props"   -- 取得
lay.addNode $Box001                 -- ノードをレイヤーへ移動

$Box001.layer        -- ノードが属するレイヤー
$Box001.layer.name   -- レイヤー名

レイヤーの表示・状態を変える

lay.on     = false   -- 非表示(レイヤーごと)
lay.isFrozen = true  -- 凍結
lay.current = true   -- カレントレイヤーにする

-- レイヤーに属するノードを集める(参照渡し)
nodes = #()
lay.nodes &nodes
nodes
  • ⚠️ lay.nodes &nodes参照渡し(&)で配列を受け取る独特な API です。戻り値ではなく引数が書き換わります。

落とし穴まとめ

  • parent 代入はワールド位置を維持する(見た目は動かない)。
  • children は直接の子のみ。子孫は再帰で集める。
  • グループの中身は setGroupOpen で開くかヘッドの children 経由。
  • レイヤーのノード列挙は lay.nodes &配列 の参照渡し。

関連

← MaxScript チートシート へ