[3dsMax]
あるオブジェクトのローカルZ方向を軸に
複数のオブジェクトを回転させる


赤い矢印の向く方向を軸にして、
複数のティーポットを毎フレーム10度回転させている。

Cylinder001という名前の円柱を作る。
回転させたいオブジェクトを複数作成する。
回転させたい物を全部選択して、↓のスクリプトを実行する。

with redraw off(
with animate on(
	kaiten = quat 10 $Cylinder001.dir
	kaiten = kaiten as matrix3

	for i=1 to 36 do(
		slidertime = i
		for tea in selection do(
			iti = tea.pos
			tea.transform *= kaiten
			tea.pos = iti
		)
	)
)
)

エラーがなければ、円柱の向く方向を軸にして、
選択したオブジェクトが毎フレーム10度回転するアニメーションが作成される。

[3dsMax]
ローカルZ方向を軸に、
複数のオブジェクトを回転させる。

with redraw off(
with animate on(
	for kyuusu in selection do(
		for i=1 to 36 do(
			slidertime = i
			iti = kyuusu.pos
			kaiten = quat 10 kyuusu.dir
			kaiten = kaiten as matrix3
			kyuusu.transform *= kaiten
			kyuusu.pos = iti
		)
	)
)
)

●使い方
回転させたいオブジェクトを選択して、↑のスクリプトを実行。
※コピペはMAXScriptリスナーではなく、MAXScriptエディタへ。
 リスナーでは複数行のコードを実行できない。

●処理内容
選択したオブジェクトそれぞれのローカルZ軸を中心にして、
10度の回転をフレーム毎に行う。

●説明
・ with redraw off():
このカッコ内のスクリプト実行中はビューが更新されない。

・ with animate on():
このカッコ内のスクリプトによる変更はキーが打たれる。

・ for:
forループ文

・ iti = kyuusu.pos:
変数itiにオブジェクトの位置を入れる。

・ kaiten = quat 10 kyuusu.dir:
オブジェクトのローカルZを軸とした10度の回転を、
quat値で変数kaitenに入れる。

・ kaiten = kaiten as matrix3
変数kaitenに入ったquat値をmatrix3値に変換して、
変数kaitenに入れる。

・ kyuusu.transform *= kaiten
オブジェクトのトランスフォーム(matrix3値)に、
変数kaitenに入ったmatrix3値を乗算する。

・ kyuusu.pos = iti:
オブジェクトの位置を、変数itiに入った値にする。

●3dsMax公式ヘルプへのリンク
スクリプトでのプログラム フロー制御
For ループ
ノード変換プロパティの使い方
Quat 値
Matrix3 値

[3dsMax]ノード変換行列について


位置、回転、スケールを別々のオブジェクトから取り出し、合成する。
実行後の白ティーポットは赤の位置、緑の回転、青のスケールで構成されている。

 ノード変換行列 = コントローラのスケール * コントローラの回転 * コントローラの位置

赤ティーポットからは位置を取得
緑ティーポットからは回転を取得
青ティーポットからはスケールを取得

変換行列 = スケール行列 × 回転行列 × 位置

白ティーポットに合成した変換行列を割り当てる

●スクリプト

iti = transMatrix $teapot01.pos --赤ティーポット
kaiten = (inverse $teapot02.rotation) as matrix3 --緑ティーポット
kakusyuku = scaleMatrix $teapot03.scale --青ティーポット

gousei =  kakusyuku * kaiten * iti
$teapot04.transform = gousei --白ティーポット
●要点
・回転を取り出す際にinverseメソッドで反転している理由。
3dsMax内部では、回転は逆向きで扱われているため。
↓公式ヘルプから引用

内部的には 3ds Max は 左手規則 を使用して回転をノード行列に保存します。
transform および objectTransform プロパティを使用して、
直接ノード変換行列の作業をするときは、
この逆転を覚えておくことが重要になります。
3ds Max の回転と MAXScript の標準の回転を両方使用するときは、
回転を逆にする必要があります

●公式ヘルプへのリンク
AUTODESK 3DS MAX 2017 ヘルプ
ノード変換プロパティの使い方
Matrix3 値

[3dsMax]rotationについて

選択した複数のオブジェクトの向きを、
ある任意のオブジェクトの向きと一致させようとして、
↓のスクリプトを実行したら、オブジェクトが意図しない位置へ移動してしまった。

for i in selection do(
	i.rotation = $teapot001.rotation
)


向きは合っているけど、位置がおかしい。

位置を保持し、向きを合わせてから、元の位置へ戻すようにした。

for i in selection do(
	iti = i.pos
	i.rotation = $teapot001.rotation
	i.pos = iti 
)


意図通り、位置はそのままに、向きだけが合う様になった。

↓の処理でも同じ結果になる。

for i in selection do(
	iti = transMatrix i.pos
	kaiten = inverse($teapot01.rotation as matrix3)
	i.transform = kaiten * iti
)

↓回転させるティーポットが全部同じ向きなら、原点を基準に回転しているのが分かる。
(回転の中心のティーポットが原点に居るやつ)

↓向きがバラバラだと回転の規則性が分かりにくい。

↓位置を維持する処理

[3dsMax] MAXスクリプトエディタの便利技


Ctrlキー + マウスホイール上下回転で文字の大きさを変更。


選択した行に一括インデント、インデント解除。

※画像は旧MAXScriptエディタ。通常エディタでも操作は同じ。
※Ctrl + マウスホイール上下回転は、webブラウザでも使える。
 (他の色々なソフトでも拡大縮小的なショートカットになってる)

[3dsMax]
ギズモのON・OFFトグルボタンを作る。


以前の3dsMaxだとXキーを押すことで、ギズモをON・OFFする事が出来たけど、
今の3dsMaxだと、Xキーは検索窓を出すためのショートカットになってしまっている。

ギズモを非表示にすると、
移動をX軸だけに制限したいのに、ギズモに触れてしまい、
XY制限などに変わってしまったりするのを防げる。

スペースキーで選択状態をロックすれば、
意図せず他のオブジェクトを選択する事も防げ便利。

zyoutai = tmGizmos.useGizmo  --ギズモの表示状態を取得

--↓if文を使い、ギズモの状態により、表示・非表示を切り替える。
if zyoutai==true then(
	tmGizmos.useGizmo = false  --ギズモを非表示にする。
	)else(
	tmGizmos.useGizmo = true  --ギズモを表示する。
	)
max views redraw -- ビューポートを更新する。

MAXScriptエディタにコピペして、文を全選択してから、
文をツールバーにドラッグ&ドロップすれば、
スクリプトをボタン化する事が出来る。

[3dsMax]スクリプトをボタン化する

[3dsMax]
レイヤーが削除出来ない問題

●概要

削除できないレイヤーがある。
シーン内のオブジェクトを全部削除して、
レイヤーマネージャーに表示されているオブジェクトは無くなった。
それでも、そのレイヤーは削除できない。

原因は、”レイヤーマネージャーに表示されないオブジェクト” が入っているせいだった。
スクリプトを使い、レイヤーの中身を見たら、パーティクル系のオブジェクトが入っていた。

スクリプトを使い、これらのオブジェクトを削除、または、移動し、
レイヤーを削除できるようにする。

●スクリプトを使って、シーン内のオブジェクト数をカウントする。

objects.count
↑この一行を実行するだけで、シーン内のオブジェクト数を確認できる。
何も無いと思っていたシーン内にオブジェクトが11個もあった。

●スクリプトを使って、一見空に見えるレイヤーの中身を確認する。

 中身を確認したいレイヤーをカレントにして、↓のスクリプトを実行。
hako = layerManager.current
--↑hakoという名前の変数に、カレントレイヤーを入れる。

hako.nodes & nakami
--↑カレントレイヤーの中に入っているものを、変数nakamiに入れる。

for i in nakami do print i.name
--↑forループを使い、変数nakamiの中身を全部リスナーに出力する。

↓実行結果
続きを読む

[3dsMax]
スクリプトでオブジェクト名を使うときの注意点

例:hako001という名前のオブジェクトが存在するとき、それをスクリプトで選択したい場合

taisyou = "$'" + "hako" + "001" + "'"
select taisyou

↑の記述だとエラーになる。

select $’hako001’と記述すれば、ちゃんと動作するのに、
なぜ変数taisyouに入った$’hako001’だとエラーになってしまうのか。

続きを読む

[3dsMax]スクリプトでオブジェクトを別のレイヤーへ移動する。

●説明する内容

カレントレイヤーの中身を、NG録レイヤーという名前のレイヤーに移動する。

●状況説明

適当なオブジェクトをカレントレイヤー内にいくつか作り、
スクリプトを使い、それらを別のレイヤー内に移動する。

続きを読む