MAXScript オブジェクトのトランスフォームをシャッフル

日頃簡単なスクリプトをちょいちょい書くことがあるので、晒してみようかなという試み。需要があるかも不明だし、もっと簡単な書き方とかあるかもしれないけど・・・。

今日書いたのは、オブジェクトのトランスフォームをシャッフルするスクリプト。大量に置いた物体の、これとこれを入れ替えて・・・って面倒なので、このスクリプトを気に入った配置になるまで実行みたいな感じで使いました。
選択しているオブジェクトに対して実行されます。

for文と配列の知識だけあればいいのでとても簡単です。

t = #()
obj = selection as array

num = obj.count

for i = 1 to num do ( t[i] = obj[i].transform )

for i = 1 to num do
(
  x = random 1 obj.count
  obj[x].transform = t[i]
  deleteItem obj x
)


---------------
.transform のところを .pos とかに書き換えれば位置だけ差し替えとかになります。


obj = selection as array という面倒臭い事をしています。
大抵の処理は obj = selection で問題なく走るのですが、obj = selection と定義するとobjの中身は$selectionという状態になります。$selectionは配列のように$selection[1].transformのような書き方が出来るのですが、maxscriptでは「選択コレクション」と呼ばれ、配列ではないので、配列用のメソッド「deleteItem」でリストを編集しようとするとエラーが出てしまいます。なので、今回は面倒ですが、一度obj = selection as arrayとしてオブジェクトの配列として格納させました。

※maxscriptでは大きなくくり「コレクション」があり、selectionやarrayはコレクションに分類される

コレクションのタイプ

コメント