生成・複製
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で確かめる。
関連
- 作ったあとに動かす: 「変形・配置」章
- 親子・グループにまとめる: 「階層・グループ」章
コメント