CycleChecking

導入

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 サイクル内の出力。

1. VBScript の例

' 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"

2. VBScript の例

' 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"