パラメータをリンクすると、あるパラメータが別のパラメータのアニメーション状態に依存する関係をパラメータ間に作成することができます。 Softimage では、1 つのパラメータで別のパラメータを制御する 1 対 1 の簡単なリンクを作成できるほか、複数のパラメータで 1 つのパラメータを制御することも可能です。
パラメータをリンクしたら、パラメータに特定の条件(A がこうなった場合には B はこうなる)に関連づける値を設定します。
移動からカラーまで、アニメート可能な任意のパラメータをまとめてリンクし、非常におもしろく独特なアニメーションの条件を整えることができます。 たとえば、オブジェクト A がオブジェクト B に近づくと色が変わるカメレオンのようなエフェクトを作成することも可能です。基本的に、アニメートが可能であればリンクも可能です。
簡単なリンク パラメータとして、エクスプレッションで定義する方法で接続されるパラメータが挙げられます。
あるパラメータを別のパラメータにリンクすると、リンク元のパラメータ値がリンク先のパラメータ値に依存するという簡単な関係が確立されます。
マルチリンク パラメータを使用すると、複数のパラメータを 1 つのパラメータに接続できます。
これにより、1 つのパラメータ出力を作成するために複数のパラメータ入力が補間されるような複雑な関係をつくることができます。
orientation でリンクされているパラメータを使用すると、アニメート可能な任意のパラメータにオブジェクトの向きをリンクできます。
1 つのパラメータを別のパラメータにリンクする場合は、パラメータの値が別のパラメータによって制御されるように指定します。
リンク パラメータはエクスプレッションに似ています。しかし、リンク パラメータの値は、数式ではなくファンクション カーブの影響を受けつつ他のパラメータを左右します。 リンク パラメータを使用すれば、数式を使用せずともパラメータ間の関係をすばやく簡単に作成できます。
スライダ付きのリグを制御するカスタム コントロール パネルを作成する場合など、カスタム パラメータを使用する際に特に便利です。
複数のパラメータを単一パラメータにリンクする場合は、単一パラメータの値が複数のパラメータによって制御されます(複数入力対単一出力)。 1 対 1 の関係を示すファンクション カーブで表現される簡単なリンク パラメータとは異なり、マルチリンク パラメータには、全パラメータの組み合わせ方とそれに応じた結果を計算する補間オペレータ(エクスプレッション内に包含)が用意されています。
複数のパラメータをリンクする場合と同様に、オブジェクトの向きをアニメーション可能なパラメータにリンクすることができます。 オブジェクトの X、Y、Z オイラー回転パラメータのそれぞれにリンクするのではなく、「完全な」オブジェクトの向きにリンクします(クォータニオン空間で計算されます)。
また、複数のパラメータで使用される補間技術は、オブジェクトの向きをパラメータにリンクする場合にも使用されます。 マルチリンク パラメータの補間オペレータは、距離を測定基準として、パラメータの相対値を元に「どの程度離れているか」を計算します。一方、向きをパラメータにリンクする場合、補間オペレータは向き(またはクォータニオン)の距離を使用します。
パラメータ間をリンクする場合、基本的には定義で別のパラメータへのパスを使用するパラメータにエクスプレッションを設定します。 以下のいずれかのエクスプレッション関数を使用するエクスプレッションを作成するには、SetExpr コマンドを使用します。
リンク パラメータにアクセスすることは、通常のパラメータにアクセスすることと似ています。 しかし、リンク パラメータは Expression プロパティを持っているため、その 4 つのパラメータにアクセスすることが可能です。
オブジェクト モデルを使用して既存のエクスプレッション全体の定義を編集できますが、オブジェクト モデルには 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 )"