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

生成・複製

  • 3dsMax
  • MaxScript
  • チートシート
MaxScript チートシート の章一覧

オブジェクトを新しく作る・複製する・消す操作です。オブジェクトは クラス名を関数のように呼ぶ(box ...、sphere ...)と作れ、プロパティはキーワード引数(radius:5 の形)でまとめて渡せます。複製は copy / instance / reference の3種 を使い分けます。

プリミティブを作る

b  = box length:10 width:10 height:10     -- ボックス
s  = sphere radius:5 pos:[10,0,0]         -- 球(位置も同時指定)
c  = cylinder radius:5 height:20          -- 円柱
pl = plane length:50 width:50             -- 平面
t  = teapot radius:8                      -- ティーポット
  • length / radius のようなクラス固有のパラメータと、pos: name: wirecolor: などノード共通のプロパティを混ぜてまとめて指定できます。
  • 戻り値が作ったノードなので、変数で受けて続けて操作できます。
  • ⚠️ name: は重複チェックされません。連番付きの一意な名前は uniqueName "Pillar"(→ "Pillar001")で作ります。

作れる主なクラスの例

sphere()        cone()          torus()
geoSphere()     pyramid()       tube()
point()         dummy()         -- ヘルパー
omniLight()     targetSpot()    freeCamera()   -- ライト / カメラ(targetSpot() はターゲット付き=本体+ターゲットの2ノード)
targetCamera pos:[0,-200,100] target:(targetObject pos:[0,0,0])  -- ターゲット付きカメラ
line()          circle()        rectangle()    text()  -- シェイプ
  • 引数を1つも付けないときは クラス名() のように () が必要です(付けないとクラスそのものを指してしまい、オブジェクトは作られません)。既定値のオブジェクトが作られます。指定できるプロパティは showProperties で確認できます(→「デバッグ・調査」章)。
  • line() は中身が空のシェイプで、ビューポートには何も表示されません。点から形を作るには splineShape + addNewSpline + addKnot + updateShape を使います。
  • ターゲット付きのカメラ・ライトは本体とターゲットの2ノードで構成され、本体を削除するとターゲットも消えます。

複製する(copy / instance / reference)

c = copy $Box001        -- 完全に独立したコピー
c = instance $Box001    -- インスタンス(基本オブジェクトとモディファイヤを共有。どちらを編集しても全部に反映)
c = reference $Box001   -- リファレンス(基本オブジェクトは共有。複製側に後から足したモディファイヤはその複製だけに効く)
関数 関係 使いどころ
copy 独立 あとで別々に編集する
instance 基本オブジェクトとモディファイヤを共有 同じ形を量産し一括編集したい
reference 基本オブジェクトは共有。複製側に後から載せたモディファイヤはその複製だけに効く 共通の形を保ちつつ、個別にモディファイヤを足したい
  • ⚠️ 複製は 元と同じ位置に重なって 生成されるので、ビューポートでは増えたように見えません。c.pos += [30,0,0] のようにずらして確認します。

複数まとめて複製する

-- 一列に5個コピー
for i in 1 to 5 do (c = copy $Box001; c.pos = $Box001.pos + [i*20, 0, 0])

-- 選択全体を複製してオフセット(newNodes に結果が入る)
maxOps.cloneNodes selection offset:[0,50,0] cloneType:#copy newNodes:&nn
  • newNodes:&nn の & は参照渡しです。戻り値ではなく、& を付けた変数に結果が書き込まれます。変数は事前に用意しなくてよく、nn は自動的に作られます。
  • offset: を付けると複製と同時にずらせるので、あとから for でずらすループが不要になります。
  • [編集] → [クローン] と同じで、ライト/カメラのターゲットやグループの一部など、従属するノードも一緒に複製されます。子まで複製するには expandHierarchy:true を付けます(既定は false で子は複製されません)。
  • ⚠️ undo off (...) の中では使えません(3ds Max がクラッシュします)。

削除する

delete $Box001       -- 1つ削除
delete selection     -- 選択を削除
delete objects       -- 全削除(注意)
  • delete selection は mapped なのでループは不要です。条件付きで消すなどループが必要なときは、ループ中の削除は取りこぼしに注意し、for o in (getCurrentSelection()) do delete o のように コピーを取ってから 回します(→「選択・取得」章)。
  • ⚠️ 削除したノードを変数で持ち続けても使えません。触る前に isValidNode n で確かめます。

落とし穴まとめ

  • 複製は元と同位置に重なる。生成直後に pos をずらす。
  • instance は基本オブジェクトとモディファイヤを共有、reference は基本オブジェクトのみ共有(複製側に足したモディファイヤは複製だけに効く)。
  • maxOps.cloneNodes の結果は newNodes:&変数 の参照渡しで受け取る。子まで複製するには expandHierarchy:true。undo off の中では使えない。
  • ループ削除はコピーを取ってから回す。削除済みノードは isValidNode で確かめる。

関連

← MaxScript チートシート へ