スクリプト コントローラ

float_script : floatController  point3_script : point3Controller position_script : positionController rotation_script : rotationController scale_script : scaleController 

> MAXWrapper > コントローラ > スクリプト コントローラ

 

   

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

コンストラクタ

float_script ... point3_script ... position_script ... rotation_script ... scale_script ... 

スクリプト コントローラは、3ds Max 8 において大幅に機能強化されました。変更についての詳細は、「スクリプト コントローラの使用」を参照してください。

   

プロパティ

<script_controller>.script String default: varies 

プログラムにより、スクリプト コントローラの式テキストの入手と設定を行います。

3ds Max 8 でプロパティの動作に導入された変更の履歴の説明については、「3ds Max 8 におけるスクリプト コントローラの割り当て動作の変更」を参照してください。

obj = Box ()--create a box
obj.position.controller=position_script ()--assign position script
obj.position.controller.script ="[F,0,0]"--set the expression
--The box will move one unit per frame along X since
--the internal controller variable F contains the current frame

   

<script_controller>.ThrowOnError Bool default:true 

式でエラーが発生したときに放棄するかどうかをコントロールします。

3ds Max 8 以降で使用可能です。

注:

[MAXScript デバッガ](MAXScript Debugger)ウィンドウ、関数公開システムで変数値を取得すること、式コントローラを評価することには一貫性がありません

  • [デバッガ](Debugger)ダイアログ ボックスで作業する場合、変数値は現在のスライダの時間に基づいて表示されます。

  • 関数公開システムでアクセスする場合、返される変数値は現在の MXS 時間に基づきます。

  • コントローラを評価する場合、結果は現在の時間値に基づきますが、コントローラの範囲、コントローラ用に設定された範囲外のタイプ、コントローラに適用されているイーズ カーブにも基づきます。

つまり、「NT」では[デバッガ](Debugger)ダイアログ ボックスに 1 つの値が表示されますが、評価におけるその値は異なることがあります。

インタフェース:

3ds Max 8 以降、すべてのスクリプト コントローラが IScriptCtrl インタフェースを公開しています。

このインタフェースでは、MAXScript でコントローラにアクセスするためのメソッドが提供されます。

インタフェース: IScriptCtrl

メソッド:

ユーザ定義の変数

スクリプト コントローラは 4 種類(一定、ターゲット、オブジェクト、ノード)のユーザ定義の変数をサポートします。これらの変数の主な違いは、値または参照の種類です。スクリプト コントローラが更新されて通知メッセージの種類を決定します。

スクリプト コントローラの UI では、変数と値の作成と割り当ては 2 つのステップで実行されます(作成ボタンは値が 0 の定数を作ります)。MAXScript では、作成と割り当ては 1 つのステップで実行されます。

定数

定数は一定値を含むことができます。

変数に割り当てられた MAXScript の式は戻り値が一定の場合は評価され、変数の値として使われます。定数は他のオブジェクトの従アトリビュートを作成しません。

式が MAXWrapper(ノード、マテリアル、モディファイヤ、コントローラなど)として評価される場合、その結果はオブジェクト変数内に格納され、ダイナミックに更新されます。つまり、 .addConstant() メソッドは .addObject()メソッドのように動作し、その結果の変数は定数以外のオブジェクトの変数になります。

式の評価の結果が subAnim の場合、ターゲット変数として格納されます。つまり、この場合 .addConstant() .addTarget() メソッドのように動作します。

   

<boolean>AddConstant <&TSTR>Name <&fpvalue>Constant 

Name is In parameter 
Constant is In parameter 

定数をコントローラに追加します。スクリプト コントローラの UI 内の[作成](Create)と[定数を割り当て](Assign Constant)ボタンに対応します。

定数は定数に割り当てられた MAXScript 式の値を返します。この式は、値として評価される有効な MAXScript 式となります。

最初の引数は定数の名前です。

2 番目の引数は、定数に割り当てる式です。

成功した場合は true を、失敗した場合は false を返します。

   

<boolean>SetConstant <value>Which <&fpvalue>Constant 

Constant is In parameter 

定数値を設定します。

最初の引数は文字列としての値の名前、または整数としての値のインデックスです。

2 番目の引数は値を与える MAXScript の式です。

   

<fpvalue by value>GetConstant <value>Which 

名前またはインデックスで指定された定数に割り当てられた式の値を返します。

変数の名前が存在しない、または存在はするが定数でない場合、ランタイム エラーが発生します。

obj = Teapot ()
-->$Teapot:Teapot01 @ [0.000000,0.000000,0.000000]
obj.scale.controller=scale_script ()
-->Controller:Scale_Script
obj.scale.controller.addConstant "test" (pi*2)
-->true
obj.scale.controller.getValue"test"
-->6.28319
obj.scale.controller.getValue"test2"
-- Runtime error: IScriptCtrl::GetVarValue - Bad Index or name: "test2"

ターゲット (トラック) 変数

ターゲット変数は、subAnim トラックの参照を含みます。

スクリプト コントローラは subAnim に関する通知が送られた際に更新されます。たとえば、ターゲット変数がティーポットに適用されたベンド モディファイヤの Angle subAnim の参照を含む場合、ティーポットの subAnim、またはベンド モディファイヤの変更によって、ベンド角、ティーポットの半径などの変更を含むスクリプト コントローラの更新が発生します。

ノード トラック自体または変換トラックが参照として選択された場合を除き、ノードの変換によって、スクリプト コントローラの更新は発生しません。

変数に格納される subAnim としてノードを割り当てることはできますが、どの参照ノードの subAnim を変更してもコントローラが更新されるため大変に不効率です。代わりに、ノードを従属させるためにノード変数を使用します。

詳細については、「クリプト コントローラにおけるノードとコントローラの参照」を参照してください。

   

<boolean>AddTarget <&TSTR>Name <value>Target Offset:<time> Owner:<value> 

Name is In parameter 
Offset default value: 0f 
Owner default value: undefined 

定数をコントローラに追加します。スクリプト コントローラの UI 内の[作成](Create)と[トラックに割り当て](Assign Track)ボタンに対応します。

最初の引数はターゲットの名前です。

2 番目の引数は、ターゲットに割り当てる値です。

オプションの Offset: キーワードを使用すると、時間オフセットを定義できます。

オプションの Owner: キーワード引数を使用すると、トラックの所有者を定義できます。

成功した場合は true を、失敗した場合は false を返します。

   

<boolean>SetTarget <value>Which <value>Target Owner:<value> 

Owner default value: undefined 

最初の引数の名前またはインデックスで指定されたターゲット変数は、2 番目の引数で指定されたターゲット(subAnim トラック)値に設定されます。スクリプト コントローラの UI 内の[トラック割り当て](Assign Track)ボタンに対応します。

オプションの Owner: キーワード引数を使用すると、subAnim トラックの所有者を定義できます。

成功した場合は true を、失敗した場合は false を返します。

   

<value>GetTarget <value>Which asObject:<boolean> 

asObject default value: false 

最初の引数の名前とインデックスで指定されたターゲット 変数に格納された参照ターゲットを返します。

オプションの asObject: キーワード引数が true の場合、戻り値は subAnim から MAXObject に変換されます。

obj1 = Teapot ()--Create a teapot
-->$Teapot:Teapot001 @ [0.000000,0.000000,0.000000]
obj2 = instance obj1--Create an instance
-->$Teapot:Teapot002 @ [0.000000,0.000000,0.000000]
obj2.pos = [-100,0,0]--Place the instance 100 units along -X
-->[-100,0,0]
obj3 = Box pos:[100,0,0]--Create abox 100 units long X
--> $Box:Box001 @ [100.000000,0.000000,0.000000]
ctrl = float_script()--Create aFloat Script Controller
-->Controller:Float_Script
obj3.height.controller = ctrl--Assign Controller to Height of Box
-->Controller:Float_Script
ctrl.addTarget "myTeapot" obj1[4]--Add Target Var. with Teapot Obj.
-->true
ctrl.setExpression "myTeapot.Radius"--Set Height to Teapot Radius
-->true
ctrl.getTarget "myTeapot"--Get the Target Track as SubAnim value
-->SubAnim:Object__Teapot
ctrl.getTarget "myTeapot" asObject:true--Get as Object
-->Teapot
ctrl.PrintDetails()--Print the controller details
-->"** Script Control Details **
-->* Description:
-->(null)
-->* Expression:
-->myTeapot.Radius
-->* Variables
-->Members: 5
-->01) T, Constant = 16000.0
-->02) S, Constant = 3.33333
-->03) F, Constant = 100.0
-->04) NT, Constant = 1.0
-->05) myTeapot, Track: $Teapot001.'Object (Teapot)', tick offset = 0
-->"

ObjectVariable

オブジェクト変数は、アニメーション コントローラ、基本オブジェクト、モディファイヤ、マテリアルや、シーン ノードなどを含む MAXWrapper 値を保持できます。

3ds Max のほとんどのsubAnim トラックは、既定でコントーローラに割り当てられません。コントローラは、キーフレーム アニメーションが最初に作成されたとき、またはトラックビューか MAXScript で手動で割り当てられたときに自動的に割り当てられます。したがって、オブジェクト変数は既存のアニメーション コントローラの参照のみを保持でき、コントローラなしのパラメータ subAnim トラックは参照できません。subAnim の参照を作成する場合は、ターゲット変数を使用します。

   

<boolean>AddObject <&TSTR>Name <value>Object 

Name is In parameter 

オブジェクト変数をスクリプト コントローラに追加します。スクリプト コントローラの UI 内の[作成](Create)と[コントローラ割り当て](Assign Controller)ボタンに対応します。

最初の引数はオブジェクト変数の名前です。

2 番目の引数は、オブジェクト変数に割り当てるコントローラです。

成功した場合は true を、失敗した場合は false を返します。

   

<boolean>SetObject <value>Which <value>Object 

最初の引数の名前またはインデックスで指定されたオブジェクト変数は、2 番目の引数で指定されたコントローラ オブジェクト値に設定されます。

成功した場合は true を、失敗した場合は false を返します。

   

<maxObject>GetObject <value>Which 

最初の引数の名前またはインデックスで指定されたオブジェクト変数で参照されたコントローラ オブジェクトを返します。

ノード変数

ノード変数はシーン ノードのみの参照を保持できます。

スクリプト コントローラは、ポジション、回転、スケール変換、およびノードの削除など、ノードが変更された場合のみ更新されます。ノード、またはその sub-anim にアタッチされたオブジェクトの変更によって、スクリプト コントローラの更新は発生しません。

この変数タイプは、循環従属問題を起こさずに割り当てられたオブジェクト スクリプト コントローラ からデータにアクセスするのに大変便利です。詳細については、「スクリプト コントローラ - 循環従属の回避」を参照してください。

   

<boolean>AddNode <&TSTR>Name <node>Node 

Name is In parameter 

ノード変数をコントローラに追加します。スクリプト コントローラ UI の[作成](Create)および[ノードを追加](Add Node)ボタンに対応します。

ノード変数はシーン ノードの参照を含有します。参照は、名前に従属しないため、変数に格納されたノードの名前を変更してもスクリプト コントローラの動作は影響されません。

最初の引数はノード変数の名前です。

2 番目の引数は、変数に割り当てるシーン ノードです。

成功した場合は true を、失敗した場合は false を返します。

   

<boolean>SetNode <value>Which <node>Node 

所定のノード変数を、指定のシーン ノード値に設定します。成功した場合は true を、失敗した場合は false を返します。

   

<node>GetNode <value>Which 

指定のノード変数に格納されているシーン ノード値を返します。

   

変数の削除

<boolean>DeleteVariable <value>Which 

名前、またはインデックスで指定されたユーザ定義の変数を削除します。

インデックス 1 から 4 の変数は読み込み専用なので削除されません。削除しようとすると、ランタイム エラーが表示されます。詳細は、後の .NumVariables() メソッドの説明を参照してください。したがって、引数は、4 よりも大きいインデックス、またはユーザが定義した既存の変数の名前である必要があります。

成功した場合は true を、失敗した場合は false を返します。

一般変数のアクセス

変数調査のメソッド

<integer>NumVariables () 

コントローラで定義されている変数の数を返します。

ユーザ定義でない変数を含む既定のコントローラは、4 つの事前に定義された変数へのアクセスを提供します。

1 - T、現時点のトリック、(Ticks)、一定

2 - S、現時点の秒 (Seconds)、一定

3 - F、現時点のフレーム (Frames)、一定

4 - NT、現在の通常時間 ( Normalized Time、 一定

ユーザ定義の変数のインデックスは、通常、4 よりも大きくなります。

   

<boolean>VariableExists <&TSTR>Name 

Name is In parameter 

所定の変数名がコントローラに存在する場合には true、存在しない場合には false を返します。

   

<enum>GetType <value>Which 

GetType enums: {#unknown|#target|#constant|#object|#node} 

名前またはインデックスで指定された変数のタイプを返します。

変数の名前とインデックス

<TSTR by value>GetName <index>Index 

インデックス付きの変数の名前を返します。

   

<boolean>RenameVariable <value>Which <&TSTR>Name 

Name is In parameter 

1 番目の引数で指定された名前のシーン エクスプローラの名前を 2 番目の引数で指定された名前に変更します。

成功した場合は true を、失敗した場合は false を返します。

   

<index>GetIndex <&TSTR>Name 

Name is In parameter 

名前で指定された変数のインデックスを返します。

変数値のアクセス

<value>GetValue <value>Which asObject:<boolean> 

asObject default value: false 

指定の変数に格納されている値を返します。

オプションの asObject 引数が true の場合、戻り値はオブジェクト参照に変換されます。

   

<value>GetVarValue <value>Which 

指定の変数に格納されている値を返します。

obj = Teapot()--Create a teapot
-->$Teapot:Teapot001 @ [0.000000,0.000000,0.000000]
obj.scale.controller = scale_script ()--Add a Scale Script Controller
-->Controller:Scale_Script
obj.scale.controller.numVariables ()--Default Variables Count
-->4
obj.scale.controller.addConstant "test" (pi*2)--Add a Variable
-->true
obj.scale.controller.variableExists "test"--See if it exists
-->true
obj.scale.controller.variableExists "someValue" --This one does not
-->false
obj.scale.controller.GetType "test" --Check Variable Type
-->#constant
obj.scale.controller.numVariables ()--Check Variable Count
-->5
obj.scale.controller.getIndex "test" --Get the variable's index
-->5
obj.scale.controller.getName 5--Get the 5th variable's name
-->"test"
sliderTime = 1f--Set the current scene time to frame 1
-->1f
obj.scale.controller.getValue 1--Time in Ticks
-->160.0
obj.scale.controller.getValue"T"--Time in Ticksaccessed by Name
-->160.0
obj.scale.controller.getValue 2--Time in Seconds
-->0.0333333
obj.scale.controller.getValue"S"--Time in Secondsaccessed by Name
-->0.0333333
obj.scale.controller.getValue 3--Time in Frames
-->1.0
obj.scale.controller.getValue"F"--Time in Framesaccessed by Name
-->1.0
obj.scale.controller.getValue 4--Normalized Time in Range 0-100
-->0.01
obj.scale.controller.getValue"NT"--Normalized Timeby Name
-->0.01
obj.scale.controller.getValue 5--User Constant Variable
-->6.28319
obj.scale.controller.getValue"test"--User Constant by Name
-->6.28319
obj.scale.controller.getValue"sunPos"--User Constant by Name
-- Runtime error: IScriptCtrl::GetVarValue - Bad Index or name: "sunPos"
obj.scale.controller.renameVariable"test" "someValue"--Rename...
-->true
obj.scale.controller.getValue"someValue"--User Constant by New Name
-->6.28319

変数時間のオフセット

時間のオフセットはどの変数にも適用でき、変数が評価される時間コンテキストを定義します。既定値のオフセットは 0 です。変数値は同じ場合とコントローラが評価される時間とは異なる場合があります。

<boolean>SetOffset <value>Which <time>Offset 

指定された時間値に、名前またはインデックスで指定された変数の時間オフセットを設定します。

   

<time>GetOffset <value>Which 

指定された変数のオフセット時間を返します。

この式は 最終の値を確定するスクリプト コントローラで評価された MAXScript の式です。

<boolean>SetExpression <&TSTR>Expression 

Expression is In parameter 

参照で渡される文字列にスクリプト コントローラの式文字列を設定します。

成功した場合は true を返し、成功しなかった場合は false を返します。

   

<TSTR by value>GetExpression () 

スクリプト コントローラの式文字列を返します。

   

<void>Update() 

再評価された式でコントローラを更新します。

説明と詳細

説明は、コントローラを含んだ 3ds Max シーンの他のユーザによって読み込まれているスクリプトの機能を説明したユーザ定義の文字列の値です。

<TSTR by value>GetDescription () 

説明の文字列を返します。

   

<boolean>SetDescription <&TSTR>Description 

Description is In parameter 

説明の文字列を設定します。

   

<TSTR by value>PrintDetails () 

説明文字列、式コード、変数の詳細など、スクリプト コントローラの情報を出力します。

   

関連した例

平面の位置を 3 ポイント ヘルパーに合わせておく方法

テキスト シェイプ内のテキストをダイナミックに変更する方法はありますか。

関連事項