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_position、y_positioin、z_position となっているようです。では、これを使って値を取得してみます。
s.pos.controller.x_osition.keys[1].value
今回はエラーにならず、きちんと値を取得することができました。何だか納得いかないですが、こういうものだと思ってください。MAXScript にはデータにアクセスするためのショートカットが多く存在するのですが、その全てが意図した通りに動くとは限らないのです。
もし、行き詰ってしまった場合は、マニュアルに立ち返って、きちんとした方法でデータにアクセスするようにしましょう。