Script Controller - Avoiding Circular Dependency

 

   

Animation Controllers - Quick Navigation

Target and Object variables in Script Controllers will cause the whole object subAnim tree to be evaluated when the controller value is updated.

In cases where the final result of the script controller has to depend on other properties of the same object it is assigned to, creating a Target or Object Variable is prevented by MAXScript with a Runtime error to avoid "vicious circle" conditions. Otherwise, the update of the controller will cause other properties to update and in turn cause the controller to be updated again, without an end.

DOES NOT WORK:

obj = Teapot ()
-->$Teapot:Teapot001 @ [0.000000,0.000000,0.000000]
obj.scale.controller = scale_script()
-->Controller:Scale_Script
obj.scale.controller.addTarget "pos" obj.position.controller
-- Runtime error: Cannot add/set object, would create circular dependency: Controller:Position_XYZ
obj.scale.controller.setExpression "[0.01*pos.x,1,1]"

In these circumstances, a Node Variable can be used instead.

The variable will contain a reference to the scene node and the script controller's expression will access the necessary property from the node instead of pointing directly at a subAnim or MAXWrapper object:

WORKS:

obj = Teapot ()
-->$Teapot:Teapot001 @ [0.000000,0.000000,0.000000]
obj.scale.controller = scale_script()
-->Controller:Scale_Script
obj.scale.controller.addNode "obj" obj
-->true
obj.scale.controller.setExpression "[0.01*obj.pos.x,1,1]"
-->true

Moving the teapot along the X axis will automatically scale its X axis according to the distance to the world origin.

See Also