2014年9月12日金曜日

Maxscript その8 「Node共通プロパティへのアクセス 変換(移動/回転/スケール)」

各プロパティについては
「3dsmax オブジェクト>Node : MAXWrapper>ノード共通のプロパティ、演算子、メソッド」
「3dsmax オブジェクト>Node : MAXWrapper>ノード共通のプロパティ、演算子、メソッド>一般的なノードのプロパティ」
を参照

オブジェクトとプロパティについて。以下あくまでもイメージ。実際中身がどうなってるのかは知らない。
Nukeの無駄遣いその1

















オブジェクト指向と呼ばれるプログラムではクラスを定義して、さらに組み合わせてクラスを定義し、それらのインスタンスによって作られるものがオブジェクトと呼ばれているようで・・・Maxの用語と被りまくって余計に混乱する・・・。クラスっていうのがあって、プロパティを持ってて、プロパティ以外にも関数を持っている事もありメソッドと呼ばれているようだ。

プロパティへのアクセス
scriptからオブジェクトが取得出来たら、そのプロパティにアクセスして各パラメーターの取得設定を行う。中には取得しか出来ないものもあるようだ。

<オブジェクト>.<プロパティ名>と「.」ドットを付けてプロパティにアクセスする。プロパティにアクセスする際は、プロパティの持つ型に注意。ここでは名前とトランスフォーム(変換)へのアクセスを見てみる。(コントローラーによってはアクセスの仕方が変わってくる場合もあると思うので一例程度で。ターゲットカメラとかだとまたちょっと違ってくると思うんだ)

変数に代入する際は取得するものによってインスタンスになったり、値を取得するだけだったりするので、何を取得したのかを意識したい。基本的には「オブジェクト(クラス)」を取得するとインスタンス。「基本的なデータ値(integer,float,string,point3など)」を取得すると数値の取得となるようだ。

ノード共通のプロパティ
(名前と変換部分を抜粋)

<node>.name
<node>.transform
<node>.position もしくは <node>.pos
<node>.rotation
<node>.scale




詳しくは「3dsmax オブジェクト>Node : MAXWrapper>ノード共通のプロパティ、演算子、メソッド>一般的なノードのプロパティ>ノード変換プロパティ」を参照

--------------
.name <string>
名前の取得、設定

--------------------
.transform <matrix3>

さらに各値のプロパティにもアクセス可能。値を設定する際は、移動、回転、スケールの各コントローラーに設定されるようだ。

基本操作

値のプロパティへのアクセス等

quat値の場合


--------------
.position 面倒なのでいつも.pos <point3>

基本操作
コントローラーへのアクセス等
コントローラーは.trackとしても同じ obj.pos.track

コントローラーの変数への代入
オブジェクトを変数に代入した場合、オブジェクトのインスタンスを取得するようだ。下はコントローラーオブジェクトを取得した場合。変数に代入する事で長くなりがちなプロパティへのアクセスを省略する事が可能になったり。他のオブジェクトに渡してやったり。


値の取得
point3等の「基本的なデータ値」は、数値を取得するだけのようだ。インスタンス(参照)にはならないようだ。
--------------
.rotation <quat>

--------------
.scale <point3>
UIの表示は%だがプロパティの数値はpoint3のfloatになっている。100% = 1.0。

----------------------------------------------------------------

以上、ノードの変換プロパティのアクセス方法。

こっから下は補足とか

----------------------------------------------------------------
実際には

ノード共通の構造
.name: <string> --名前
.prefix: <string> --オブジェクト作成時の引数
.material <material_class> --マテリアルの取得
.mat <material> --リファレンスにはなかったが.materialと同じ
.target: <node> --変換コントローラーを自動でルックアットコントローラーに
.pos: <point3> -- 位置
.position: <point3> --.posと同じ
.rotation: <quat> --回転
.scale: <point3> -- スケール
.pivot: <point3> --基点の位置
.transform: <matrix3>
.isSelected: <boolean> --選択しているか
.dir: <point3> -- ローカルz方向の単位ベクトルの取得、設定

プロパティ


がノード共通の全プロパティとなるので、ノード共通のプロパティはかなりの量になる。ノードに対してshowで表示されるのはbaseObjectのプロパティ、マニュアルだと「ノードのサブクラス」に分類されているクラスのプロパティらしい。


.baseObject面白いですね
s = $sphere001
b = $box001

s.baseobject = b.baseobject --インスタンス

モデファイヤリストだとの一番下の部分の操作ですね。この操作はUIから出来ただろうか?ちなみに
s.baseobject = copy b.baseobject
とすると独立したコピーになるようだ。
----------------------------------------------------------------
tips1:コレクションとプロパティ

コレクションの中身が同じプロパティ名を持っている場合は以下のようにまとめて処理が出来るようだ。

選択している全てのオブジェクトをx軸方向に-10オフセット

こんなのとか。


ベースクラス(SphereやTeapotなど)が同じプロパティ名を持っていればまとめてアクセスしてくれることもある。

--------
tips2:パラメーター編集
パラメーター編集でパラメーターを追加した場合、プロパティ名としても認識してくれるようだ
--------
tips3:値のインスタンス:参照パラメータ
maxscriptにはc言語等のポインタのようなものが存在する。
「リファレンス>関数の作成>参照パラメータの引き渡し」など


--------
tips4:prefix

.prefix
作成時に(オプション)引数として用いると普段のオブジェクト作成と同じように名前を付ける。prefixというプロパティは持っていないようだ。

こんなものもあった。
uniqueName <prefix> [numDigits:<integer>] 
シーン内にオブジェクトを作成する場合に 3ds Max で行われるのと同様の方法で、一連の数字を追加することによってプレフィックス文字列から固有のシーン ノード名を生成します。この名前は、次のシーン ノードが生成されるまでの間に限り、その固有性が保証されます。
3ds Max 2011 以降で使用できるオプションのキーワード引数 numDigits: で、使用する桁数を制御します。
この値が提供されない場合、3ds Max 2011 およびそれ以降のバージョンでは既定値として 3 桁に設定されます。
3ds Max 2011 以前のリリースではこの桁数は 2 でした。

$Box01.name = uniqueName "MyRenamedBox"
-->"MyRenamedBox001"
--------------

0 件のコメント:

コメントを投稿