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

変形・配置

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

オブジェクトを動かす操作です。プロパティを直接書き換える方法と、変形関数(move / rotate / scale)で相対的に動かす方法 の2系統があります。コード中の $ は現在選択しているオブジェクトです(→「選択・取得」章)。以下の例は Box001 を 1 つ選択した状態を想定しています。

位置・回転・スケールを読む / 書く

$.position        -- 位置 [x,y,z]。Point3 という 3 成分の値。$.pos と同じ
$.pos.x = 10      -- X だけ変更
$.rotation        -- 回転。Quat(クォータニオン=四元数)という 4 成分の値で、角度ではない
$.rotation.z_rotation  -- UI の [回転] Z と同じ値(度)
$.scale           -- スケール [x,y,z]
$.transform       -- ワールド変換行列(Matrix3)。位置+回転+スケールをまとめて持つ
  • $.pos = [0,0,0] のように丸ごと代入もできます。
  • $.rotation は Quat なので、角度で見たいときは .x_rotation / .y_rotation / .z_rotation を使います(既定の回転コントローラ(オイラー XYZ)の値)。
  • $.pos.x = 10 のような 成分だけの代入 もできます(Python 版と違い、そのまま効きます)。pos / rotation / scale は親がある場合も 既定ではワールド座標 で読み書きされます。親基準の値が欲しいときは次節の in coordsys parent を使います。

相対的に動かす(move / rotate / scale)

move $ [10,0,0]                  -- 現在位置から +X に10
rotate $ (eulerAngles 0 0 45)    -- Z軸まわりに45度(X, Y, Z の順の角度)
rotate $ (angleAxis 90 [0,0,1])  -- [0,0,1](Z軸)まわりに90度。軸と角度で指定
scale $ [2,2,2]                  -- 2倍に拡大
  • move / rotate / scale は 現在の状態に対する相対変形 です。絶対指定したいときはプロパティ代入を使います。
  • move objects [0,0,5] のように objects / selection / 配列を渡すと、中のオブジェクト全部に一括で適用されます。
  • 回転・スケールの中心は各オブジェクトの基点(ピボット)です。別の点を中心に回したいときは about [0,0,0] rotate $ (eulerAngles 0 0 90) のように about を付けます。

座標系を指定する(in coordsys)

in coordsys world move $ [10,0,0]      -- ワールド基準
in coordsys local rotate $ (eulerAngles 0 0 90)  -- 自分のローカル軸基準
in coordsys parent move $ [0,0,5]      -- 親の座標系基準
in coordsys $Other move $ [0,0,5]      -- 別オブジェクトの座標系基準
  • 既定はワールド基準。オブジェクトを回転させてあると、ワールドの X とオブジェクト自身の X は向きが違います。「自分の前方に10進める」のような操作は in coordsys local を付けます。

別オブジェクトに合わせる(位置合わせ)

$A.pos = $B.pos               -- 位置だけ合わせる
$A.rotation = $B.rotation     -- 向きだけ合わせる
$A.transform = $B.transform   -- 位置・向き・スケールを丸ごと一致させる
  • 「基点の位置・向き・スケールを一致させたい」なら transform の代入が最短です。基点(ノード変換)が一致するだけなので、形が違うオブジェクト同士では見た目は重なりません。

バウンディングボックスと接地

$.min      -- バウンディングボックスの最小コーナー
$.max      -- 最大コーナー
$.center   -- バウンディングボックス中心

$.pos.z -= $.min.z   -- 一番下(min.z)が0になる分だけ位置を下げる → 底面がZ=0に来る
  • min / max / center は既定(in coordsys なし)では ワールド空間 の値です。サイズは $.max - $.min で求まります。
  • min / max はワールド軸に沿ったボックスなので、回転したオブジェクトでは実物より大きくなります。自分の向きでの大きさは nodeLocalBoundingBox $ で取れます(最小・最大の2要素配列)。

ピボット(基点)を操作する

ピボット(3ds Max の UI では「基点」)を操作します。

$.pivot = [0,0,0]      -- ピボットをワールド原点へ
$.pivot = $.center     -- ピボットをバウンディングボックス中心へ
CenterPivot $           -- [中心オブジェクト] と同じ
WorldAlignPivot $        -- [ワールド座標に位置合わせ] と同じ
ResetXForm $             -- [Xフォームをリセット](XFormモディファイヤが載る)
  • $.pivot を変えても メッシュは動きません(基点だけが移動)。UI の [基点にのみ影響] と同じ挙動です。

よく使う形

-- 選択を等間隔に並べる
for i = 1 to selection.count do selection[i].pos = [(i-1)*30, 0, 0]

-- すべて原点に集める
for o in selection do o.pos = [0,0,0]
  • 何も選択していないと $ は undefined で、$.pos はエラーになります。

落とし穴まとめ

  • move/rotate/scale は相対、プロパティ代入は絶対。混同しない。
  • ローカル軸で動かすなら in coordsys local を明示する。
  • $.pivot の変更はメッシュを動かさない(基点のみ)。
  • min/max/center は既定ではワールド空間。ローカルサイズが欲しいときは nodeLocalBoundingBox を使う。
  • 何も選択していないと $ は undefined になる。

関連

← MaxScript チートシート へ