>   >  スクリプト兵法書 〜MAX Script編〜:Vol.5:MAXScript から見たアニメーションデータ
Vol.5:MAXScript から見たアニメーションデータ

Vol.5:MAXScript から見たアニメーションデータ

MAXScript からアニメーションをコントロールする 01
~キーの一覧を取得~

3ds Max 内部でコントローラやアニメーションデータがどのように扱われているかを理解したところで、MAXScript からアニメーションデータを操作をしてみます。
まずは先ほども紹介した、キーの一覧を取得するコードを見てみましょう。



 s = selection[1]
 classOf s.pos.controller
 s.pos.controller.keys

実はこのコードは、実際の 3ds Max の内部データを理解した後に見ると奇妙なことになっています。なぜなら、先程の解説だと、階層は以下のようになっている筈だからです。



(オブジェクト)/(変換:位置/回転/スケール).pos/(位置:XYZ位置)/アニメーションデータ

これをそのままスクリプトに書くと、以下のようになります。


 s.controller.pos.controller.keys

実際、この方法でもキーを取得することができます。ただし、以下ような書き方ではアクセスできません。



 s.pos.keys
 s.controller.pos.keys

これは、pos だけだと "そのコントローラの値" を取得しようするためです。そのため、キーを取得してようとしてもエラーになってしまいます。混乱しがちですが、気をつけてください。

スクリプトからアニメーションをコントロールする 02
~位置コントローラのアニメーションを制御する~

次に、位置コントローラのアニメーションを、スクリプトから制御してみます(これも意外と曲者です)。
まず、PRS コントローラ を以下の方法で取得しましょう。



 prsCtrl = s.pos.controller

さて、ここからどうしたらいいでしょうか。先ほどの方法だと、keys でキーを取得して色々な操作できそうです。
MaxScript リファレンスを検索すると、keys"コントローラの共通プロパティ、演算子、メソッド" の項目で見つけることができます。そこには;



 .keys MAXKeyArray -- 読み込み専用、コントローラのキー配列

......という記述があります。どうやら MAXKeyArray というのが keys の値の種類みたいです。
そこで MAXKeyArray 値 の項目を見ると、何やら細々と書いてあるのですが;



 <key_array>[<index_integer>]

......『キー配列内のインデックスで指定されたキーを表す MAXKey 値を返します。インデックスは 1 から始まります』とあります。

ほうほう......配列と同じようにキーの値が取れるようです。つまり、 keys[1] のように指定すればコントローラの最初のキーを取得できるはずですね。
さらに、MAXKey への解説のリンクを辿ると、関連項目として "MAXKey の共通プロパティ、演算子、メソッド "へのリンクがあります。これを見れば、キー値を操作するときの機能を知ることができそうです。
と、このように、マニュアルを読んでいくと、以下のように書けば何かの値を得ることができそうな気がします;



 s.pos.controller.keys[1].value

 

......ところが、実はこれでは上手くいきません。



 -- ランタイム エラー: このコントローラのキーにアクセスできません :
    Controller:Position_XYZ

 

なぜ!? きちんとマニュアルを読んで、その通りに操作をしているはずなのに......しかし MAXScript では、こうしたトラブルはよくあるので、慌てず騒がず冷静に!

もう一度、マニュアルを読んでみましょう。
エラーメッセージを見ると、Position_XYZ というクラスのコントローラの値を取得しようとしてエラーになっているのが分かるので、早速、検索します。
すると、Position_XYZ コントローラのプロパティ名が判明しました。



 Position_XYZ:
 .x_position Float default: 0.0 -- アニメート可能
 .y_position Float default: 0.0 -- アニメート可能
 .z_position Float default: 0.0 -- アニメート可能

 

これを見ると、x,y,z それぞれ値を取得するためのプロパティが分かれていて、x_positiony_positioinz_position となっているようです。では、これを使って値を取得してみます。



 s.pos.controller.x_osition.keys[1].value

今回はエラーにならず、きちんと値を取得することができました。何だか納得いかないですが、こういうものだと思ってください。MAXScript にはデータにアクセスするためのショートカットが多く存在するのですが、その全てが意図した通りに動くとは限らないのです。
もし、行き詰ってしまった場合は、マニュアルに立ち返って、きちんとした方法でデータにアクセスするようにしましょう。

その他の連載