変形・配置
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になる。
コメント