フィルタ関数のコールバックの機能を理解するために、テスト関数を登録して、コールバックから渡される引数を調べることができます。
たとえば、「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 コントローラが割り当てられています。
次のコールは、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 のパフォーマンスを向上させる方法など、フィルタ関数のいくつかの使用例については、「トラックバー フィルタ コールバック関数の例」を参照してください。