リンクパラメータ

 
 
 

パラメータをリンクすると、あるパラメータが別のパラメータのアニメーション状態に依存する関係をパラメータ間に作成することができます。 Softimage では、1 つのパラメータで別のパラメータを制御する 1 対 1 の簡単なリンクを作成できるほか、複数のパラメータで 1 つのパラメータを制御することも可能です。

パラメータをリンクしたら、パラメータに特定の条件(A がこうなった場合には B はこうなる)に関連づける値を設定します。

移動からカラーまで、アニメート可能な任意のパラメータをまとめてリンクし、非常におもしろく独特なアニメーションの条件を整えることができます。 たとえば、オブジェクト A がオブジェクト B に近づくとカラーが変わるカメレオンのようなエフェクトを作成することもできます。 基本的に、アニメートが可能であればリンクも可能です。

簡単なリンク

1 つのパラメータを別のパラメータにリンクする場合は、パラメータの値が別のパラメータによって制御されるように指定します。

リンク パラメータはエクスプレッションに似ています。しかし、リンク パラメータの値は、数式ではなくファンクション カーブの影響を受けつつ他のパラメータを左右します。 リンク パラメータを使用すれば、数式を使用せずともパラメータ間の関係をすばやく簡単に作成できます。

スライダ付きのリグを制御するカスタム コントロール パネルを作成する場合など、カスタム パラメータを使用する際に特に便利です。

複数のリンク

複数のパラメータを単一パラメータにリンクする場合は、単一パラメータの値が複数のパラメータによって制御されます(複数入力対単一出力)。 1 対 1 の関係を示すファンクション カーブで表現される簡単なリンク パラメータとは異なり、マルチリンク パラメータには、全パラメータの組み合わせ方とそれに応じた結果を計算する補間オペレータ(エクスプレッション内に包含)が用意されています。

オブジェクトの向きへのリンク

複数のパラメータをリンクする場合と同様に、オブジェクトの向きをアニメーション可能なパラメータにリンクすることができます。 オブジェクトの X、Y、Z オイラー回転パラメータのそれぞれにリンクするのではなく、「完全な」オブジェクトの向きにリンクします(クォータニオン空間で計算されます)。

また、複数のパラメータで使用される補間技術は、オブジェクトの向きをパラメータにリンクする場合にも使用されます。 マルチリンク パラメータの補間オペレータは、距離を測定基準として、パラメータの相対値を元に「どの程度離れているか」を計算します。一方、向きをパラメータにリンクする場合、補間オペレータは向き(またはクォータニオン)の距離を使用します。

リンクを作成し、リンクにアクセスする

パラメータ間をリンクする場合、基本的には定義で別のパラメータへのパスを使用するパラメータにエクスプレッションを設定します。 SetExpr コマンドを使用して、次のエクスプレッション関数のいずれか 1 つを使ってエクスプレッションを作成できます。

  • l_fcv(): 簡単な(1 対 1 の)リンク。 括弧内には 1 つのパラメータのみを記述します。

  • l_interp(): 複数のリンク。 括弧内にはリンク対象のパラメータのリストを記述します。

  • l_interpOri(): オブジェクトの向きへのリンク。

リンク パラメータにアクセスすることは、通常のパラメータにアクセスすることと似ています。 ただし、リンク パラメータには Expression プロパティが含まれているため、その 4 つのパラメータにアクセスできます。

  • Active: デフォルトは true です。このパラメータを false に設定すると、リンクはオフになります。

  • Target: ターゲット パラメータ(エクスプレッションを所有するパラメータ)の名前を返します。 読み取り専用です。

  • Definition: エクスプレッションの本体部分です。リンクを変更したり、リンクを完全に削除する場合は、この文字列定義を変更できます。

  • Comment: デフォルトでは何も指定されていません。

重要:

オブジェクト モデルを通じて既存のエクスプレッションの定義全体を編集できますが、オブジェクト モデルには SetExpr コマンドと同等のコマンドはありません。また、Expression オブジェクトは、その独自の機能を実装しません。

例: リンク パラメータに対するエクスプレッションを設定および取得する

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