Linked Parameters

 
 
 

When you link parameters, you create a relationship between them in which one parameter depends on the animation state of another. In Softimage, you can create simple one-to-one links with one parameter controlling another or you can have multiple parameters controlling one.

After you link parameters, you set the values that you want the parameters to have, relative to a certain condition (when A does this, B does this).

You can link any animatable parameter together—from translation to color—to create some very interesting or unusual animation conditions. For example, you could create a chameleon effect so that when object A approaches object B, it changes color. Basically, if you can animate it, you can link it.

Simple Links

When you link one parameter to another, you specify that its value is to be controlled by another parameter.

Linked parameters are similar to expressions, but the value of one parameter drives the other as dictated by a function curve rather than by a mathematical formula. They provide you with a quick and easy way to create relationships between parameters without having to work out the mathematical expressions involved.

They are especially useful with custom parameters, such as creating a custom control panel to control a rig with sliders.

Multiple Links

When you link many parameters to one parameter, its value is controlled by a combination of those parameters (many inputs to one output). Unlike simple linked parameters, where the link is represented by a function curve representing the one-to-one relationship, a multi-linked parameter has an interpolator (contained within an expression) that calculates how all the parameters are combined together to come up with a result.

Links to an Object's Orientation

As well as linking multiple parameters, you can link the orientation of an object to an animatable parameter. You don't link to the object's individual Euler X, Y, and Z rotation parameters; instead you link to the "complete" orientation of an object (calculated in quaternion space).

The same interpolation technique used for multiple parameters is also used for linking an object's orientation to a parameter. The interpolator for multi-linked parameters computes "how far" it is from one of its relative values by using a distance metric; for orientation, the interpolator uses the orientation (or quaternion) distance.

Creating and Accessing Links

When you link parameters you are basically setting an expression on a parameter that uses the path to another parameter in its definition. You can use the SetExpr command to create an expression using one of the following expression functions:

  • l_fcv()—simple (one-to-one) link. Only one parameter appears inside parentheses.

  • l_interp()—multiple link. List of parameters to link to appears inside parentheses.

  • l_interpOri()—link to object's orientation.

Accessing linked parameters is like accessing any regular parameter. However, because the linked parameters contain an Expression property, you can access its four parameters:

  • Active—true by default; setting this parameter to false mutes the link.

  • Target—returns the name of the target parameter (that is, the parameter that owns the expression). Read only.

  • Definition—this is the real meat of the expression: you can change this string definition if you need to change the link or even remove the link entirely.

  • Comment—nothing specified by default.

Important

While you can edit the definition of an existing expression entirely through the object model, there is no equivalent to the SetExpr command in the object model, and the Expression object does not implement any functionality of its own.

Example: setting and getting expressions on linked parameters

	'-----------------------------------------------------
	'	SETUP
	'
	' Set up scene with a null, a cube and a disc
	NewScene , false
	set root = ActiveSceneRoot
	set actor1 = root.AddNull()
	set actor2 = root.AddGeometry( "Disc", "MeshSurface" )
	set target = root.AddGeometry( "Cube", "MeshSurface" )

	'-----------------------------------------------------
	'	CREATION
	'
	' Set up a simple link using an expression with l_fcv()
	SetExpr target.posx, "l_fcv( " & actor1.posx & ")"

	' Set up a multiple link using an expression with l_interp()
	SetExpr target.sclx, "l_interp( " & actor1.sclx & "," _
				& actor1.scly & "," & actor1.sclz & " )"

	' Set up a multiple link using an expression with l_interpOri()
	SetExpr target.rotx, "l_interpOri( " & actor2.rotx & "," _
				& actor2.roty & "," & actor2.rotz & " )"

	'-----------------------------------------------------
	'	INFO
	'
	' Get pointers to the linked parameters and print the info
	set lnk1 = target.posx
	TestLinks lnk1
	set lnk2 = target.sclx
	TestLinks lnk2
	set lnk3 = target.rotx
	TestLinks lnk3


	'-----------------------------------------------------
	'	HELPER
	'
	function TestLinks(lnk)
	' NB: Since the definition is itself a parameter on the
	'     Expression object, we could just as easily assign
	'     a new definition to the expression using 'Value':
	'           expr.Parameters( "definition" ).Value = new_expr
		if TypeName(lnk) <> "Nothing" then
			LogMessage lnk.FullName & " is a " & TypeName(lnk)
			set expr = lnk.Source
			if TypeName(expr) <> "Nothing" then
				LogMessage vbTab & "Name:" & vbTab & expr.FullName 
				LogMessage vbTab & "Type:" & vbTab & TypeName(expr) 
				LogMessage vbTab & "Definition:" & vbTab _
					& expr.Parameters( "definition" ).Value
			else
				LogMessage "No expression found."
			end if
		else
			LogMessage "Could not find linked parameter."
		end if
	end function

	'-----------------------------------------------------
	'	OUTPUT
	'
	'INFO : "cube.kine.local.posx is a Parameter"
	'INFO : 	"Name:	cube.kine.local.Expression"
	'INFO : 	"Type:	Expression"
	'INFO : 	"Definition:	l_fcv( null.kine.local.posx )"
	'INFO : "cube.kine.local.sclx is a Parameter"
	'INFO : 	"Name:	cube.kine.local.scl.sclx.Expression"
	'INFO : 	"Type:	Expression"
	'INFO : 	"Definition:	l_interp( null.kine.local.sclx, null.kine.local.scly, null.kine.local.sclz )"
	'INFO : "cube.kine.local.rotx is a Parameter"
	'INFO : 	"Name:	cube.kine.local.ori.euler.rotx.Expression"
	'INFO : 	"Type:	Expression"
	'INFO : 	"Definition:	l_interpOri( disc.kine.local.rotx, disc.kine.local.roty, disc.kine.local.rotz )"