コントローラ スクリプトの作成

   

アニメーション コントローラ - クイック ナビゲーション

3ds Max は、[スクリプト]テキスト ボックスに入力したテキストを MAXScript ブロック式の本体として解釈するので、必要に応じて行数や式を入力することができます。式は順番に評価され、最後の式がコントローラ値として採用されます。この値は、浮動小数点には Float 、位置には Point3 、回転には Quat など、コントローラに対して正しいタイプを生成する必要があります

スクリプト コントローラによって返される値は、[トラック ビュー]やコマンド パネルに表示される値や、MAXScript でプロパティ値にアクセスして返される値と必ずしも同じではありません。MAXWrapper プロパティ定義の一部はスケール値で、コントローラに保存された true 値を読み込むとき、または設定するときに適用されます。たとえば、多数のジオメトリ プリミティブに関連付けられている slice_to プロパティと slice_from プロパティは度単位で表示されます。これらのプロパティに関連付けられているコントローラに保存される実際の値の単位はラジアンです。このスケール係数は maxwrapper プロパティの内部プロパティで、コントローラの内部プロパティではありません。3ds Max および MAXScript は、プロパティにアクセスするときに指定したスケール係数を自動的に適用するため、このスケールは通常、ユーザには見えません。スクリプトまたは式のコントローラが使用されている場合は、例外です。これらのコントローラでは、3ds Max が出力値にスケール係数を適用するため、返されるデータ値はスケールされていない値でなければなりません。maxwrapper クラスの記述では、プロパティに適用されるすべてのスケールが表示されます。スケールがリストされていない場合は、そのプロパティにスケールは適用されません。たとえば、Capsule の記述の一部は以下のようになります。

<Capsule>.radius Float default: 0.0 -- animatable
<Capsule>.height Float default: 0.0 -- animatable
<Capsule>.slice_from Float default: 0.0 -- animatable, angle
<Capsule>.slice_to Float default: 0.0 -- animatable, angle

これにより、スクリプト コントローラは radius および height プロパティに対してはスケールされていない値を、 slice_from および slice_to に対してはラジアンの値を返します。スケールのタイプ、保存される値、および実際のコントローラ値に適用されるスケール値は以下のようになります。

角度 -- ラジアンで保存される値です。出力は 57.29578 でスケールされます。

パーセント -- 分数 (0 から 1) で保存される値です。出力は 100 でスケールされます。

Color 値タイプのプロパティの場合、コントローラの出力は自動的に 255 でスケールされます。point3_script をこれらのプロパティに割り当てる場合は、各コンポーネント値を 0 ~ 1 の分数で格納される必要があります。Color 値の Point3 値への変換は、スケール係数に適用されないことに注意してください。つまり、 red as point3red as point3 は、 [255,0,0] の値を返します。したがって、Color 値がスクリプト コントローラによる出力の場合は、255 で除算して明示的に Color 値をスケールする必要があります。

スクリプト コントローラのスクリプトの本体は、適切なデータ タイプを評価する有効な MAXScript 式であり、グローバル変数、ローカル変数、関数、構造体定義を含めることができます。スクリプトは独自のローカル スコープでコンパイルされ、ローカルはスクリプト コントローラのスコープ内だけで可視です。スクリプト コントローラのローカル変数は、通常の (スタック ベースの) ローカルと多少異なるヒープ ベースのローカルです。通常のローカルは現在のスコープ内で可視であり、そのスコープの実行が終了するまでの寿命があります。ヒープ ベースのローカルは、現在のスコープ内でのみ可視となっていますが、寿命はこのローカルが定義されているトップ レベルの式の寿命と同じです。スクリプト コントローラのローカルは、はじめてスクリプトが実行されるとき作成され、スクリプトを再定義しない限り永久にヒープ内に保持されます。つまり、スクリプト コントローラが 1 つでも実行中であればローカル変数に値を格納でき、これらの値は次の評価でも存在し続けます。スクリプト コントローラのローカルはスクリプト コントローラのスコープ内から実行されていないため、別のユーティリティやリスナーからはアクセスできません。詳細については、「変数のスコープ」を参照してください。

特殊な場合には、 return <expr> を使用して、スクリプト コントローラのスクリプトを終了できます。

3ds Max は常に、特定のアニメーション時間についてコントローラを評価します。これは、現在の時間を示すタイム スライダか、アニメーションの再生中やレンダリング中の場合は、増分しているフレーム タイムになります。

スクリプト コントローラの場合、評価される時間を使用して「その時点の」コントローラ スクリプト周辺の自動コンテキストを設定し、(その他の「その時点の」明示的な式の外側で) アクセスしたあらゆるプロパティが現在のコントローラ評価時間について正しい値を生成するようにします。これは、正しい時間に作動するようにするために、スクリプトで特別なことを何もする必要がないことを示しています。必要な場合には、標準 MAXScript 変数 currentTime で評価時間にアクセスすることができます。また、通常の MAXScript プログラミングのように、スクリプトに「その時点の」明示的な式を使用することで他の時間のシーン プロパティを参照することができます。

MAXScript を使用すると、複数行の文字列リテラルを作成できることに注意してください。

-- A position script keeping the object at the center of all other objects
-- in the scene as they move about:
(
local pos = [0,0,0]
for o in objects where o != $foo do
pos += o.pos
pos / (objects.count - 1)
)

上のスクリプトは、 $foo 以外のすべてのオブジェクト中を繰り返すローカル変数を設定することによって、現在のオブジェクト(ここでは $foo )を除くすべてのオブジェクトの平均位置を計算し、位置ベクトルの合計を累算し、最終行で平均を計算します。

-- A position script keeping the object attached to the highest vertex in a
-- given object:
local high_index = 1, high_z = (getVert $foo 1).z
for i in 2 to $foo.numVerts do
if (getVert $foo i).z > high_z then
(
high_index = i
high_z = (getVert $foo i).z
)
getVert $foo high_index

上記のスクリプトは、頂点をすべて参照して $foo に最大値 z の頂点のインデックスを記憶し、新しい位置の頂点座標を返します。

3ds Max 8 より前のバージョンにおける制限事項

dependsOn を使用して明示的な従属関係を定義するか、シーン ノードを変数に割り当てない限り、依存しているオブジェクトをインタラクティブに変更しているときにスクリプト コントローラは自動更新されません。

タイム スライダを動かした場合、または変更内容をアニメートしてからアニメーションを再生した場合は、変更内容は自動的に反映されます。このスクリプトは、間接的な方法または条件付きの方法で他のオブジェクトを参照できるので、スクリプトが依存しているオブジェクトを MAXScript が自動的に判別することはできません。これらのオブジェクトは常に明示的に指定する必要があります。