[3dsMax]MAXScript、配列要素の順番を、位置を基準に並び替える。

10個あるboxオブジェクトを配列に入れる。

hairetu = $ as array --選択したオブジェクトを配列として変数hairetuに入れる。

配列の中身を見ると、順番がバラバラ。

$Box:Box06 @ [50.000000,0.000000,0.000000]
$Box:Box02 @ [10.000000,0.000000,0.000000]
$Box:Box03 @ [20.000000,0.000000,0.000000]
$Box:Box04 @ [30.000000,0.000000,0.000000]
$Box:Box05 @ [40.000000,0.000000,0.000000]
$Box:Box10 @ [90.000000,0.000000,0.000000]
$Box:Box07 @ [60.000000,0.000000,0.000000]
$Box:Box08 @ [70.000000,0.000000,0.000000]
$Box:Box09 @ [80.000000,0.000000,0.000000]
$Box:Box01 @ [0.000000,0.000000,0.000000]

このバラバラな配列の順番を、各オブジェクトのX位置を元にして並び替える。(ソートする)

MAXScriptにはソートするためのメソッド、sortとqsortがあるけど、
スクリプトリファレンスの説明が分かり難い。
例にあったqsortメソッドを使い、ソートする方法は理解出来なかった。
なので、ソートの処理を自分で用意する事にした。

▼配列の中身を、X位置を元に整列するスクリプト

--X位置によるソート

hairetu = $ as array --選択したオブジェクトを配列として変数hairetuに代入する。

kazu = $.count --選択したオブジェクトの数を数えて、変数kazuに入れる。

kuri = 1 --後で使う繰り返し処理用の変数kuriに1を入れる。

retu = #() --変数retuに、空の配列を入れる。

kazoeru = 0 --変数retusuuに0を入れる。

print hairetu --変数hairetu(配列)を表示。

for kuri=1 to kazu do --X位置を比較して、オブジェクトの順番を決めるための処理
	(
	kazoeru = 0
	for i=1 to kazu do
		(
		if hairetu[kuri].pos.x < hairetu[i].pos.x do kazoeru += 1
		)
	retu[ kazu-kazoeru ] = hairetu[kuri]
	)

print retu --変数retu(配列)を表示。

▼スクリプトを実行した結果

▼処理の説明
forループを使用し、オブジェクトのX位置を一つ一つ比べ、
順番調査対象オブジェクトのX位置よりも先にある、オブジェクトの数を数える。
数えたオブジェクトの数を、選択したオブジェクトの総数から引けば、
順番調査対象オブジェクトが、X軸方向に向かって、何番目の位置にあるのかが分かる。

順番調査対象オブジェクトのX位置よりも先にあるオブジェクトの数を数えるには、if文を使う。
もし、順番調査対象オブジェクトよりも、比較対象オブジェクトのX位置が大きい場合は、
変数kazoeruに1を足す。
順番調査対象オブジェクトと、比較対象オブジェクト全てを比較した後に、変数kazoeruの値を見ると、
順番調査対象オブジェクトのX位置よりも先にあるオブジェクトの数が分かる。

▼処理の流れ
例:hairetu[40,20,10,30]という配列がある。
今回のスクリプトを使って、配列の要素を数の大きさ順に並び替える。
その処理の流れを解説したgifアニメ↓

広告

コメントを残す

メールアドレスが公開されることはありません。

スパム対策用の計算式と画像認証です。↓の欄を入力しないとコメントが出来ません。 *

*