トラックバー フィルタ コールバック関数の確認

フィルタ関数のコールバックの機能を理解するために、テスト関数を登録して、コールバックから渡される引数を調べることができます。

スクリプト:

fn testCallbackFilterFunction theAnimatable theParent theSubAnimIndex theGrandParent theNode=(
format "theAnimatable: %\n" theAnimatable
format "theParent: %\n" theParent
format "theSubAnimIndex: %\n" theSubAnimIndex
format "theGrandParent: %\n" theGrandParent
format "theNode: %\n\n" theNode
true ) --always returns true, means show all keys
fn testCallbackAdditionFunction arg1 arg2 = (true)
theInterface = maxOps.trackbar
theIndex = theInterface.registerFilter testCallbackFilterFunction\
callbackAdditionFunction "Test Filter" 8 active:true stopTraversal:false

たとえば、「Sphere01」と呼ばれる球シーン ノードを選択した場合、コールバックはすべてのサブ アニメーション トラックを走査し、関数自身を複数回呼び出します。呼び出された関数は、すべての引数をリスナーに出力します。

理解を深めるために、いくつかの例を見てみます。

theAnimatable: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]
theParent: undefined
theSubAnimIndex: 1
theGrandParent: undefined
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]

この例では、シーン ノード Sphere01 がフィルタされています。祖父母および親は未定義、フィルタされるアニメート可能なノードはノード自身、subAnim のインデックスは 1 です。 このノードは、「トップ レベル」ノードです。このノードは、「トップ レベル」ノードです。

theAnimatable: Controller:Bezier_Float
theParent: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]
theSubAnimIndex: 1
theGrandParent: undefined
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]

この例では、祖父母は未定義、親は球ノード自身、フィルタされるアニメート可能Fはインデックス 1 の subAnim (可視トラックのベジェ コントローラ)です。これは、この球の可視性がアニメートされたことを示します。アニメートされていない場合、アニメート可能は未定義になります。

theAnimatable: undefined
theParent: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]
theSubAnimIndex: 2
theGrandParent: undefined
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]

この例では、祖父母は未定義、親は球ノード自身、フィルタされるアニメート可能はインデックス 2 の subAnim (未定義)です。 すべてのノードのトラック 2 は、Space_Warps subAnim トラックです。次のようにリスナーに入力すれば、このことを確認できます。

$Sphere01[2]
$Sphere01[2].controller
--results:
SubAnim:Space_Warps
undefined
theAnimatable: Controller:Position_Rotation_Scale
theParent: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]
theSubAnimIndex: 3
theGrandParent: undefined
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]

この例では、祖父母は未定義、親は球ノード自身、フィルタされるアニメート可能はインデックス 3 の subAnim (変換コントローラ、この場合は Position_Rotation_Scale コントローラ)です。

theAnimatable: Controller:Position_XYZ
theParent: Controller:Position_Rotation_Scale
theSubAnimIndex: 1
theGrandParent: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]

次に、1 つ下のレベルを確認してみます。祖父母は球、親は変換コントローラ(Position_Rotation_Scale)、この親に含まれる subAnim のインデックスは 1 (位置トラックに対応、この場合は Position_XYZ コントローラ) です。比較のために、次のようにリスナーに入力してみてください。

$Sphere01[3][1].controller
Controller:Position_XYZ
theAnimatable: Controller:Bezier_Float
theParent: Controller:Position_XYZ
theSubAnimIndex: 1
theGrandParent: Controller:Position_Rotation_Scale
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]

次に、もう 1 レベル下を確認します。祖父母はノード変換トラック(PRS コントローラ)、親は位置トラック(Position_XYZ)になり、フィルタされるアニメート可能はインデックス 1 の subAnim (このノード位置の X 軸に割り当てられたベジェ コントローラ)です。

theAnimatable: Controller:Bezier_Float
theParent: Controller:Position_XYZ
theSubAnimIndex: 2
theGrandParent: Controller:Position_Rotation_Scale
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]
theAnimatable: Controller:Bezier_Float
theParent: Controller:Position_XYZ
theSubAnimIndex: 3
theGrandParent: Controller:Position_Rotation_Scale
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]

これらの 2 つのトラック(位置トラックの Y サブコントローラと Z サブコントローラ)も同様ですが、インデックスはそれぞれ 2 と 3 です。次のようにアクセスした場合も同様です。

$Sphere01[3][1][3].controller
--result
Controller:Bezier_Float
theAnimatable: Controller:Euler_XYZ
theParent: Controller:Position_Rotation_Scale
theSubAnimIndex: 2
theGrandParent: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]

次に、1 レベル上に戻り、PRS コントローラのインデックス 2 の subAnim (回転トラック)を確認します。この subAnim には、Euler_XYZ コントローラが割り当てられています。次の 3 回のコールは、この回転の X、Y、および Z サブコントローラを走査します。

theAnimatable: Controller:Bezier_Float
theParent: Controller:Euler_XYZ
theSubAnimIndex: 1
theGrandParent: Controller:Position_Rotation_Scale
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]
theAnimatable: Controller:Bezier_Float
theParent: Controller:Euler_XYZ
theSubAnimIndex: 2
theGrandParent: Controller:Position_Rotation_Scale
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]
theAnimatable: Controller:Bezier_Float
theParent: Controller:Euler_XYZ
theSubAnimIndex: 3
theGrandParent: Controller:Position_Rotation_Scale
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]

次に、1 レベル上に戻り、PRS コントローラのインデックス 3 の subAnim (スケール トラック)を確認します。このサブ アニメーションには、サブコントローラを持たない Bezier_Scale コントローラが割り当てられています。

theAnimatable: Controller:Bezier_Scale
theParent: Controller:Position_Rotation_Scale
theSubAnimIndex: 3
theGrandParent: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]
theAnimatable: Sphere
theParent: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]
theSubAnimIndex: 4
theGrandParent: undefined
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]

球オブジェクト レベルに戻り、インデックス 4 の subAnim (球オブジェクト)を確認します。

次のようにリスナーに入力します。

$Sphere01[4]
$Sphere01[4].controller
--results:
SubAnim:Object__Sphere
undefined
theAnimatable: ReferenceTarget:ParamBlock
theParent: Sphere
theSubAnimIndex: 1
theGrandParent: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]

現在の場所は、球の ParamBlock の内部です。祖父母は球ノード自身、親は球、subAnim インデックスは 1、アニメート可能なトラックはパラメータ ブロックです。このパラメータ ブロックにはキーがないため、球のアニメート可能なパラメータを持っている subAnim トラックを走査できます。

theAnimatable: undefined
theParent: ReferenceTarget:ParamBlock
theSubAnimIndex: 1
theGrandParent: Sphere
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]

これは、ParamBlock のインデックス 1 の subAnim (球の半径)です。この球の半径はアニメートされなかったので、コントローラは割り当てられていません。theAnimatable パラメータは未定義として渡されます。

リスナーと比較します。

$Sphere01[4][1]
$Sphere01[4][1].controller
--results:
SubAnim:Radius
undefined
theAnimatable: Controller:Bezier_Float
theParent: ReferenceTarget:ParamBlock
theSubAnimIndex: 2
theGrandParent: Sphere
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]

これは、ParamBlock のインデックス 2 subAnim (球のセグメント数)です。この球のセグメントはアニメートされているので、Bezier_Float コントローラが割り当てられています。

リスナーと比較します。

$Sphere01[4][2]
$Sphere01[4][2].controller
--results:
SubAnim:Segments
Controller:Bezier_Float

次のコールは、ParamBlock および球自身の残りのトラックを走査しますが、コントローラが割り当てられていないことがわかります。これらのコールはすべて、theAnimatable を未定義として返します。

theAnimatable: undefined
theParent: ReferenceTarget:ParamBlock
theSubAnimIndex: 3
theGrandParent: Sphere
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]
theAnimatable: undefined
theParent: ReferenceTarget:ParamBlock
theSubAnimIndex: 4
theGrandParent: Sphere
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]
theAnimatable: undefined
theParent: ReferenceTarget:ParamBlock
theSubAnimIndex: 5
theGrandParent: Sphere
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]
theAnimatable: undefined
theParent: ReferenceTarget:ParamBlock
theSubAnimIndex: 6
theGrandParent: Sphere
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]
theAnimatable: undefined
theParent: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]
theSubAnimIndex: 5
theGrandParent: undefined
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]
theAnimatable: undefined
theParent: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]
theSubAnimIndex: 6
theGrandParent: undefined
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]
theAnimatable: undefined
theParent: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]
theSubAnimIndex: 7
theGrandParent: undefined
theNode: $Sphere:Sphere01 @ [-40.683792,-17.994026,0.000000]

ここでコールしたテスト関数は、常に true を返します。テスト関数の機能がわかったので、実際のフィルタ処理に合わせてこの関数を変更します。

トラックバーに表示されるキーの数を制限して 3ds Max UI のパフォーマンスを向上させる方法など、フィルタ関数のいくつかの使用例については、「トラックバー フィルタ コールバック関数の例」を参照してください。

関連事項