2012年5月6日日曜日

MAXScript とにかく収集するrefs.dependents

この refs.dependents という命令を知っておくと意外と便利なので紹介したいと思います。

リファレンスをみると
3ds Max の重要な内部機能で、3ds Max オブジェクト間の従属関係が定義されます。たとえば、マテリアルはさまざまなマップに、パス コントローラはパーセント コントローラに、シーン ノードは基本オブジェクトに従属します。以下のメソッドでは、指定した MAXWrapper オブジェクトに従属する MAXWrapper オブジェクトが返されます。

とあります。
何を言っているのかさっぱり分かりません。
refs.dependentsを使うとある指定したものに関係する全てのものを収集する事が出来ます。

書式は
refs.dependents <従属があるか確認したい奴>

です。関係ある奴は結構なんでもいけます。オブジェクトだったりモデファイヤだったりマテリアルだったり・・・。

ということで実用例。


3つのオブジェクトにインスタンスでターボスムースを適用しました。
MAXで作業していると、複数のオブジェクトに インスタンスでモデファイヤを適用するということはよくあると思います。そして、作業しているうちにどれとどれがインスタンスだったか見失ったり・・・。そこでrefs.dependents。

まず、ターボスムースが適用されているオブジェクトを1つ選択
そして、次のスクリプトを実行します。
-----
a = refs.dependents $.modifiers[1]

obj =#()

for o in a do
(
    if superclassof o == GeometryClass then append obj o
)

select obj
-----
すると、選択したオブジェクトのターボスムースとインスタンス関係にあるオブジェクトが全て選択されます。
<解説>
 a = refs.dependents $.modifiers[1]

 $.modifiers[1]は「選択しているオブジェクトの一番上のモデファイヤ」という意味になります。選択しているオブジェクトの一番上のモデファイヤと関係しているものを集めて a に格納します。
で、このaにはオブジェクトやらモデファイヤやら色んなものが格納されているので・・・そこからオブジェクトだけ仕分けます。

obj =#()

オブジェクト仕分け用の空の配列を用意

for o in a do
(
    if superclassof o == GeometryClass then append obj o
)

for文でaに入っているものを片っ端から判定してジオメトリだったらobjに追加する。
(superclassofはそのものが何者かを調べる関数です。もっと細かく調べたいときはclassof <調べたい奴>)

select obj

objを選択します。

こんな感じの使い方が出来るのですが、他にもパーティクルフローやテクスチャー等、色んなものに使えるので覚えておくと便利です。ちなみに僕はつづりが全く覚えれないので使うたびにカンニングしています(笑)

0 件のコメント:

コメントを投稿