オペレータはデータを読み込み、計算を実行して、データを書き出します。
オペレータの入力と出力は、他のシーン エレメントから接続されます。 たとえば、あるオペレータには、オブジェクトのローカル キネマティクスへの入力接続と、別のオブジェクトのローカル キネマティクスへの出力接続があります。
function ApplyMyFirstOperator_Execute( ) { // Create an Operator object var newOp = XSIFactory.CreateObject("MyTestOp"); // Define the input and output ports newOp.AddInputPort("Camera_Root.kine.local"); newOp.AddOutputPort("Camera_Interest.kine.local"); // Make the connections newOp.Connect(); return newOp; }
各オペレータは入力ポートと出力ポートを定義しますが、これらのポートを介して、オペレータがローカル キネマティクス プロパティなどのシーン エレメントに接続されるのです。
Softimage では、特別な API を介してカスタム オペレータの作成をサポートしています。この API では、Update コールバックとしてメインの計算を実装し、同じプラグインのプロパティ ページ API を介してユーザの操作とカスタマイズを実現します。
Update コールバックでは、OperatorContext または OperatorContext オブジェクトを使用して入力値を取得してから、出力ターゲットに書き込みます。
function MyFirstOperator_Update( ctxt ) { // Get the input value from the first port (port indexing is 0-based) var trans = ctxt.GetInputValue( 0 ).Transform; // Perform some sort of operator on the transformations... // Apply the result to the target of the output port ctxt.OutputTarget.Transform = trans ; return true; }
入力ポートは kine.local に接続されているため、GetInputValue(0)は KinematicState または KinematicState オブジェクトを戻します。
ポートが実際のパラメータ(kine.local.posx など)に接続されていた場合は、GetInputValue は X 位置の値を返します。
オペレータでは、必ずしも入力接続の正確な数を認識している必要はありません。 たとえば、選択されたオブジェクトそれぞれに入力ポートがある場合もあれば、ユーザが選択したポートそれぞれに入力ポートがある場合もあります。 不定数の接続を処理するには、コンテキストから CustomOperator または CustomOperator オブジェクトを取得してから、実際の接続の数を取得します。
function MyFirstOperator_Update( ctxt ) { // Get the CustomOperator and use it to // find out how many inputs are connected var oOp = ctxt.Source ; // There is only one port group, containing all the inputs and // the single output var cntInputs = oOp.GetNumPortsInGroup(0) - 1 ; // Add all the input objects positions for ( var i = 0 ; i < cntInputs ; i++ ) { var oInputKinematicState = ctxt.GetInputValue( i /* port */, 0, 0) ; } }
これまでのところ、扱ってきたコードはすべて、Connect()の呼び出し後に接続が変化しないスタティック オペレータ向けのものです。 接続を動的に追加および削除するためのダイナミック オペレータを作成する場合は、「スタティック オペレータとダイナミック オペレータ」を参照してください。
カスタム オペレータを作成する場合にお勧めなのは、自己インストール カスタム オペレータ(「SICO」と略されることもあります)API を使用する方法です。これについては、この章で詳細に説明しています。 これ以外にも、カスタム オペレータを作成する方法はあります。たとえば、ランタイムまたはレガシーです。ただし、この章で使用されている「カスタム オペレータ」という用語は、特に指定しない限り、常に自己インストール タイプのカスタム オペレータを指します。
さらに、「カスタム オペレータ」という用語は Fx およびシミュレーション オペレータには適用されません(これらは、Softimage における他のタイプのオペレータの例です)。 Fx オペレータのカスタマイズの詳細については、「カスタム Fx オペレータ」を参照してください。シミュレーション オペレータは、Softimage で使用するためにカスタム ビルドすることはできませんが、カスタム オペレータを使用して似たような効果を出すことはできます。
ここでは、Softimage でのカスタム オペレータ実装の基本的な概要を説明します。
Update コールバック内にアルゴリズムを実装します。これにより、OperatorContext または OperatorContext 引数を使用して、そのオペレータに定義されたカスタム オペレータ、接続、および任意のパラメータにアクセスできます。
ユーザ データを保存する必要がある場合は、Init コールバックと Term コールバックを実装します。これらのコールバックは、オペレータがインスタンス化されたときにユーザ データを保存し、オペレータが削除されたときにそのデータを解放するための手段となります(たとえば、ポインタをカスタム C++ オブジェクトに保存する、など)。 キャッシュ データは保存されません。
カスタム パラメータをセットアップするには、これらのパラメータを、DefineLayout コールバック実装の一部としてオペレータに追加する必要があります。その後、DefineLayout でそれらをフォーマットできます(カスタム プロパティと同様です)。
オペレータの接続定義を作成するコールバックや、接続を解決するコールバックはありません。 これは、オペレータを作成するコードによって処理されます。詳細については、「Softimage でのオペレータの適用」を参照してください。
すべてのコールバックでは、引数を 1 つしか取りません。 この引数は、Context または Context オブジェクト、OperatorContext または OperatorContext オブジェクトのいずれかです。
ほとんどの場合、実装コードを実際に記述する前に、カスタム オペレータ ウィザードを使用して細かい設定作業の大部分を終えることができます。
詳細については、「オペレータ コールバック」リファレンスを参照してください。
ジェネレータ: メッシュ ジオメトリを作成するオペレータ
デフォーマ: ジオメトリ上のポイントの位置を変更するオペレータ
オペレータの拘束: オブジェクトの位置に影響を与えたり、パラメータの値を操作したりするオペレータ
トポロジの変更: ポイントを追加または削除するオペレータ(一部のみサポート)
ジェネレータ オペレータは、独自のメッシュを作成します。たとえば、プログラム的に生成される新しいタイプのプリミティブや、他のメッシュや入力の処理済みの結果を含むメッシュなどです。
ジェネレータ オペレータは、オペレータ スタックの最下部に位置する必要があります。 この位置にないと、ジオメトリに適切に書き込まれません。
通常、ジェネレータ オペレータを適用するには、単純なプリミティブを作成し、それをフリーズしてから(Softimage ジェネレータ オペレータを消去するため)、カスタム ジェネレータを適用します。 これによってオペレータが適切にインストールされ、デフォーメーションや他のオペレータをその上に追加できます。
(同じグループ上の)入力ポートおよび出力ポートを、変形させるオブジェクトの Primitive または Primitive にアタッチする必要があります。まず、出力ポートを指定する必要があります。
デフォーメーション オペレータがジオメトリのポイントを追加または削除することはありません。ポイントの位置を変更するだけです。 つまり、シェイプを変更しますが、オペレータのトポロジを変更することはありません。Softimage SDK のインストール フォルダにある examples フォルダのデフォーム オペレータのサンプルを参照してください。
組み込み Softimage コンストレイントに似た 2 つ以上のエレメントの間にコンストレイントと同様の関係を確立できます(コンストレイントとカスタム オペレータの違いの詳細については、「コンストレイントとカスタム(スクリプト)オペレータの比較」を参照)。 たとえば、複数のシーン エレメントの平均に基づいてオブジェクトの位置を計算するカスタム オペレータを作成することができます。
Softimage SDK のインストール フォルダにある examples フォルダのコンストレイント オペレータのサンプルを参照してください。
トポロジ オペレータはデフォーマに似ていますが、トポロジ オペレータはジオメトリから実際にポイントを追加または削除する点が異なります。 組み込みトポロジ オペレータの例は、押し出しジオメトリ コンポーネントです。 ジェネレータ オペレータと異なり、このタイプのオペレータはスタックの最下部にはありません。代わりに、一部の初期ジオメトリを読み込み、同じジオメトリに新しいトポロジを出力する入力ポートがあります。
現在、Softimage はカスタム トポロジ オペレータを完全にはサポートしていません。 問題点は、トポロジ オペレータがクラスタに属するポイントを追加または削除したときに、クラスタやクラスタ プロパティが適切に更新されないことです。 最悪の場合、Softimage がクラッシュすることもあります。 このため、トポロジ オペレータを使用する場合は、クラスタを持たないオブジェクトというシナリオに限定する必要があります。 ジオメトリの準備が整ったら、オブジェクトをフリーズしてカスタム トポロジ オペレータを削除し(ただし、その評価の結果は残します)、クラスタや他のオペレータを追加することができます。
また、ポート グループのインスタンスを実装する方法を示すVertexColorMixer オペレータのサンプルを参照することもできます。このサンプルは、Softimage SDK のインストール フォルダにある examples フォルダにあります。