2014年9月11日木曜日

Maxscript その7 「オブジェクト(Node)の取得」

実際scriptを運用する際は3dsmax内の色んな情報の取得、設定がメインになってくると思う。

ここではNode(シーン内のオブジェクト)の取得、プロパティへのアクセスの方法を見てみる。(Maxscriptでは3DのオブジェクトはNodeと呼ばれているようだ)。ノードの取得の方法はいくつかあるようだが、多分一番使われている「$」を使った方法を見てみる。

詳しくは
「リファレンス>コレクション>コレクションのタイプ>PathName値」
「リファレンス>名前、リテラル定数、および式>リテラル定数>パス名リテラル」
「リファレンス>名前、リテラル定数、および式>リテラル定数>パスに使用するスペースと他の特殊文字」

$はパス名の書き方によって取得する値が動的に変化するようだ。
シーン内に適当にオブジェクトを作成。



選択しているオブジェクトの取得
パス名(オブジェクト名)を何も記述しない場合は現在選択しているオブジェクトを取得するようだ。


と、結果が異なる。なので変数に代入する際は変数の型(タイプ)がどうなっているか注意が必要。


変数objの中身が異なる。複数選択しているときはselection値になるんすね。
--------------
名前による取得





この場合も変数の型が異なるようだ。また、オブジェクト名も大文字小文字関係ないようだ。
--------------
コレクションは配列のように[]で番号を指定する事で、要素にアクセス出来るようだ。

--------------
オブジェクト名に特別な記号があって取得できない場合は''で囲んであげるとよいらしい。
--------------

「コレクションじゃないんかいっ!!」と突っ込みを入れた所で今回はここまで。
----------------------
tips1:maxscriptからシーン内の情報にアクセスする方法は大きく分けて2つあるように感じる。

・システムグローバル変数、関数を呼び出してダイレクトに取得、設定する方法
・オブジェクトを取得し、そのクラスが持つプロパティにアクセスする方法。

例えば、スライダーの時間に関しては「slidertime」というシステムグローバル変数が準備されている。この変数にアクセスする事でスライダーの現在の時間の設定、取得が可能。実際にスライダーが動く。


(integer値、time値、と異なる型のやり取りをしているけど、この辺は自動で変換してくれるようだ。integer値、float値、time値あたりはほとんど自動でやってくれている気がする。親切設計)

もう1つがオブジェクトを取得し、クラスのプロパティにアクセスして値の取得、設定を行う方法。maxscriptでいうオブジェクトとはジオメトリなどの3Dの物体ではなく、レンダーパネルなどのユーザーインターフェースなども含んだもっと広い意味らしい。かなりの部分にアクセス出来るが準備されていないものもあるようだ。(準備されていない場合は、基本的にはscriptからはアクセス出来ないという事になる)。スクリプトでは3Dのオブジェクトはノード(Node)と呼ばれている。

詳しくは「Maxscript 言語リファレンス>3ds Max オブジェクト」の項を参照

ノード(3Dオブジェクト)は「Node : MAXWrapper」


まずは「値」と「3ds Max オブジェクト」の項を見ればやりたい事が見つかるのではないかと思う。そしてMaxscriptの闇。リファレンスがとにかく分かりづらい。調べづらい。というMaxscript最大の問題に直面する事になる。
-----------------------
tips2:Maxはオブジェクト名に同じ名前を付ける事が出来てしまう。マテリアル名、マップ名なども同じく。この問題にscriptでどのように対応するかが非常に悩ましい・・・。普通に管理出来ているという事は内部的には何か管理する仕組みがあると思うのだが、scriptでこの問題を簡単に解決する方法はあるのだろうか?

0 件のコメント:

コメントを投稿