v3.5
オペレータ評価サイクルのグラフを確認します。 評価サイクルとは、そのサイクル自体によって計算が変わるループ グラフの依存関係です。
この機能は、指定の階層にサイクルがあるかどうかを識別し、サイクル内のオペレータまたはサイクル内でデータにアクセスしているオペレータをスクリプト ウィンドウに出力します。 チェックの終了したサイクルごとに、「Cycle Breaking Point」というオペレータ名がスクリプト ウィンドウに出力され、「Cycle through」オペレータとラベルの付けられたオペレータ名が多数出力されます。
「Cycle Breaking Point」オペレータは、グラフにおける評価チェックの終了位置です。 評価が開始された位置に応じて、ブレーキング ポイントの位置はわずかに変化することがあります。 ブレ-キング ポイントは、グラフ内で問題のあるサイクルにおいて、シーン評価の相違、予期せぬ結果や動作をユーザが確認する上で重要となります。 なぜならば、接続スタック内におけるブレーキング ポイントの位置によっては、評価要求の結果を得るためにデータが使用するループが無限ループに陥ってしまうためです。 実際の結果は、サイクル自身の再評価にはなりません。
「Cycle through」オペレータもサイクルに影響を及ぼすオペレータであり、このオペレータの重要な依存関係が 1 つでも壊れると、依存関係サイクルも壊れます。 注: このサイクルにアクセスするオペレータはほかにも存在し、シーンの評価時にサイクルを不安定にすることがあります。しかしその影響は小さく、このようなオペレータが1つ削除されてもサイクルは壊れません。
ユーザが検索するサイクルを修正するには、サイクル内の重要な因子を特定し、削除します。 これを実行する上で推奨される方法があります。 まず、ブレーキング ポイントを孤立させてそのサイクルを再実行し、周期オペレータ内でデータがその階層に属しているのか、または他の階層のデータであるのかを確認し、サイクルの深さと幅のハンドルを取得します。 次に、サイクル内でラベルが付いている重要な因子を探します。 これを実行するには、「Cycle Breaking Point」で開始し、「Cycle through」のラベルが付いた同一の「Cycle Breaking Point」オペレータが見つかるまで、「Cycle through」オペレータ内の出力を辿ります。 これらのオペレータが因子です。 次に、「Expression」、「ScriptedOp」、「kine.Constraints」など、馴染みのあるサイクル作成因子を調べます。 問題を含むサイクルの重要な因子の書式は、「kine.local.PoseCompensatorOp」、「kine.global.ParentPoseCns_E」、「kine.local.ParentPoseAndPoseCns_D」、または「kine.global.SkeletonCtrlOpProp」ではありません。 注: "*_D"および"*_E"のラベルが付いているオペレータは、それぞれ"kine.Constraints"の定義オペレータと実行オペレータです。
サイクルのチェックは複数の方法でカスタマイズできます。
ヒント 1: サイクルの現在のフレームのみをチェックするには、Check Current FrameパラメータをTrueに設定できます。 コンストレイントのいずれかがサイクルのオン/オフがアニメートするサイクルに組み込まれている場合は特に有効です。
ヒント 2: スクリプトからこのコマンドを実行する場合は、CycleChecking コマンドを実行する前に Refresh コマンドを実行すると、確実にタイムフレームの現在の値を最新の値にすることができます。
ヒント 3: ユーザ設定の[Disable cycle checking when applying animation operators]をオンにし、FollowCycleCheckUserPref パラメータを True に設定すると、パフォーマンスを最大限に引き出せます。 デフォルト値のまま(False)にしておくと、このコマンドはユーザ設定とは無関係にサイクル チェックを実行します。
ヒント 4: デフォルトでは、サイクルチェッカーは下の階層も含めて全体をチェックします。最初は、StartingGraphPtパラメータに指定されているシーンエレメントからチェックを開始します。 StartingGraphPt エレメントのみをチェックするには、CheckFullNestedHier フラグを False に設定します。
注: このコマンドは、出力引数を使用します。C# および一部のスクリプト言語(JScript、PerlScript、Python など)は、リファレンスによって渡される引数をサポートしていません。通常、出力引数は XSIApplication.ExecuteCommand メソッド(C#)または ISIVTCollection (スクリプト言語)を介して取得できますが、このコマンドはすでに値を返しています。
この場合の唯一の回避策は、出力引数と戻り値の両方を 1 つの配列で戻す VBScript のカスタム コマンドを作成することです。詳細については、「関数がすでに値を戻している場合の処理について」を参照してください。
oBoolean = CycleChecking( [StartingGraphPt], [Check Current Frame], IsCycle, [DisableCycleCheck], [CheckFullNestedHier], [OutputObjs] ); |
サイクルチェックの結果を Boolean として戻します(サイクルが存在する場合は True)。
パラメータ | タイプ | 説明 |
---|---|---|
StartingGraphPt | 文字列 |
サイクル チェックを開始するオブジェクト(開始ポイント)。 デフォルト値: 現在選択されている値 |
Check Current Frame | Boolean |
True の場合、サイクルの現在のフレームのみをチェックします。 デフォルト値: false |
IsCycle | Boolean | サイクルがある場合は True |
DisableCycleCheck | Boolean |
ユーザ設定をチェックし、サイクル チェックが有効であるかどうかを確認します。 デフォルト値: false |
CheckFullNestedHier | Boolean |
有効にすると、下の階層も含め階層全体をチェックされます。 無効にすると、指定のオブジェクトのみがチェックされます。 デフォルト値: true |
OutputObjs | Operator オブジェクトの XSICollection。 | サイクル内の出力。 |
' Example: A cyclical expression NewScene CreatePrim "Sphere", "MeshSurface" Translate , -7.20756310877914, 2.07707676083662, -0.207707676083662, siRelative, siView, siObj, siXYZ GetPrim "Null" Translate , 3.82040230356053, 0.744612423696161, -7.44612423696161E-02, siRelative, siView, siObj, siXYZ SelectObj "sphere", , True InspectObj "sphere.kine.local" AddExpr "sphere.kine.local.posy" SelectObj "null", , True SetExpr "sphere.kine.local.posy", "null.kine.posy" Translate , 0.118156772275078, 0.235140765377718, -2.35140765377718E-02, siRelative, siView, siObj, siXYZ AddExpr "null.kine.local.posy" SetExpr "null.kine.local.posy", "sphere.kine.posy" Translate , 0.669555043461009, 1.01894331750266, -0.101894331750266, siRelative, siView, siObj, siXYZ Translate , -0.712516724951656, 1.96939066659309, -0.196939066659309, siRelative, siView, siObj, siXYZ Dim bCycle bCycle = CycleChecking( "Scene_Root" ) Logmessage bCycle ' The output is: 'WARNING : "3000 - Cycle Breaking Point sphere.kine.local.pos.posy.Expression" 'WARNING : "3000 - Cycle through sphere.kine.global.ParentPoseCns_E" 'WARNING : "3000 - Cycle through sphere.kine.local.PoseCompensatorOp" 'WARNING : "3000 - Cycle through null.kine.local.pos.posy.Expression" 'WARNING : "3000 - Cycle through null.kine.global.ParentPoseCns_E" 'WARNING : "3000 - Cycle through null.kine.local.PoseCompensatorOp" 'WARNING : "3000 - Cycle through sphere.kine.local.pos.posy.Expression" 'WARNING : "3000 - PROBLAMATIC EVALUATION CYCLES ARE IN THE SPECIFIED GRAPH" 'CycleChecking "Scene_Root" 'INFO : "True" |
' Example: A cyclical constraint NewScene CreatePrim "Cube", "MeshSurface" Translate , -7.75896137939607, -0.235140765377774, 2.35140765377774E-02, siRelative, siView, siObj, siXYZ CreatePrim "Sphere", "MeshSurface" Translate , 8.12409703994715, -0.284640094775458, 2.84640094775458E-02, siRelative, siView, siObj, siXYZ ApplyCns "Pose", "sphere", "cube" SelectObj "cube", , True ApplyCns "Position", "cube", "sphere" SelectObj "Scene_Root" Dim bCycle bCycle = CycleChecking( "Scene_Root" ) Logmessage bCycle ' The output is: 'WARNING : "3000 - Cycle Breaking Point cube.kine.global.IndpCns_E" 'WARNING : "3000 - Cycle through sphere.kine.Constraints.posecns.blends.PosePoseCns_D" 'WARNING : "3000 - Cycle through sphere.kine.global.PoseCns_E" 'WARNING : "3000 - Cycle through cube.kine.Constraints.poscns.blends.PosePoseCns_D" 'WARNING : "3000 - Cycle through cube.kine.global.IndpCns_E" 'WARNING : "3000 - Cycle through cube.kine.local.PoseCompensatorOp" 'WARNING : "3000 - Cycle through sphere.kine.local.PoseCompensatorOp" 'WARNING : "3000 - PROBLAMATIC EVALUATION CYCLES ARE IN THE SPECIFIED GRAPH" 'CycleChecking "Scene_Root" 'INFO : "True" |