ラベル 3dsMax の投稿を表示しています。 すべての投稿を表示
ラベル 3dsMax の投稿を表示しています。 すべての投稿を表示

2008/11/26

Multi/Sub-Object Material Script

Maxで、一つのオブジェクトに複数のマテリアルを割り当てる場合、
フェースごとにIDを割り振って、マテリアルを当てる必要があります。

このときに使用するのがMulti/Sub-Objectというマテリアル。
しかし、こいつがなかなか使いづらい。

使用していないマテリアルの削除や、IDの整理ができなかったり、
複数オブジェクトのマテリアルを一つにしたい場合に、IDを振り直さなければならないなど、
なかなか手でやるにはめんどくさいことがあります。

私自身もVrayMeshを使う際、IDの振り直しをしてマテリアルを1つにする、ということをやってて、
常々めんどくさいな、と思っていました。
そこでスクリプトでやってみようと思い、勉強がてら組んでみました。

スクリプトはコチラ


機能

・複数オブジェクトのマテリアルを一つのマルチサブマテリアルにする
・インスタンスマテリアルの整理
・使用していないマテリアルの削除
・使用していないID、重複するIDの整理


使用法

まず、一つのマテリアルにしたいオブジェクトを選択。
WS000081.jpg



WS000082.jpg
現在、赤、青、緑、白、グレーの5種類のマテリアルが使われています。同色はインスタンスされたもので、
マテリアルエディターにはオブジェクトごとに4つのマテリアルが作成されています。
参考に一番右のマルチサブに使用しない黒いマテリアルを入れておきました。

空いているスロットをアクティブスロットに設定し、スクリプトを実行。
WS000083.jpg
すると、アクティブスロットにまとめられたマテリアルが作成され、オブジェクトに割り当てられます。
インスタンスも一つにまとめられ、不要なマテリアルは削除されます。

WS000084.jpg
IDも自動で割り振られます。



現在の欠点

・EditableMeshに変換される
・スプライン等には適応されない
・モディファイアがスタックされる
・閉じたグループは無視される
・オブジェクトのインスタンスが解除される







つくってみれば案外簡単な構造でした。
まず、全部のフェースのID、マテリアルを取得し、その配列を整理、
整理したものをもとにIDを変更、マテリアルを作成し、割り当てています。

100万ポリ程度でも遅いですが動くと思います。
もっと多いとメモリ不足で落ちるかもしれません。

まだ、荒削りですのでバグが出るかもしれません。使う際は自己責任でお願いします。

2008/11/19

MaxScript Toggle MEMO

Maxスクリプトで切り替えをやるときの記述。忘れないうちにメモ。


macroscript PV_PickPaintToggle category:"VertexPaint"

(
  global VPset

 if VPset == 1 then
 (
  (macros.run "VertexPaint" "VertexPaint_PaintMode")
  VPset = 0
 )
 else
 (
  (macros.run "VertexPaint" "VertexPaint_PickMode")
  VPset = 1
 )
)



この例文はVertexPaintでのピッカーとペイントの切り替えを行うスクリプト。
uid000012_20081118171231141928bf.gif
ショートカットに登録すれば楽にペイント、スポイトを切り替えれる。


こういう切り替え系のスクリプトはちょっとした作業のときにあると便利だったりする。
例えば、オブジェクトの表示非表示、フロントピュー、バックビューの切り替え...などなど。

基本的な構造は同じなのでコピペでいろいろ作れると思う。
今回妙なとこでつまずいたのでメモしとく。

まず、

macroscript PV_PickPaintToggle category:"VertexPaint"


で、スクリプトの名前、カテゴリを決定しておく。
これが無いと、Run Scripts...でしか実行できない。
ショートカット等に登録するにはこの記述は必要。

次に、変数指定。

global VPset


変数指定って聞くと何だそれ?と疑問に思っていましたが、結構重要。
ここで、VPsetは変数ですよって宣言しないと、どうやら初期起動などで認識しない。

はじめ、この変数指定をやっていなかったせいか、
Maxを起動後実行しても、結果がよろしくないということが起こりました。
MaxScript Editor上で一度実行すれば正常に動作するのですが、Maxを再起動すると駄目でした。


最後にif文。

if VPset == 1 then
(
 (macros.run "VertexPaint" "VertexPaint_PaintMode")
 VPset = 0
)
else
(
 (macros.run "VertexPaint" "VertexPaint_PickMode")
 VPset = 1
)


ここで条件分岐させ、
VPsetが1のときはAを実行し、VPsetに0を代入。
VPsetが0のときはBを実行し、VPsetに1を代入させます。
こうすることで実行するたびにAとBが交互に入れ替わるようになる。

また、Case of~文にすれば、3段階~の切り替えもできるようになります。


case VPset of
(
 1:print A
  VPset = 2
 2:print B
  VPset = 3
 3:print C
  VPset = 1
 default:print A
      VPset =2
)


というように、順繰りになるように変数に代入してやればいい。
defaultは初期起動時になにも代入されていない時に使います。