接続の作成

 
 
 

組み込みの Softimage オペレータのオペレータ接続に関する全般的な情報については、「コネクション セットについて」を参照してください。

ポートについて

各オペレータは、少なくとも 1 つの出力ポートを持ちますが、入力ポートはゼロの場合もあります。 各ポートには方向があるため、特定のオブジェクトに対して読み書きを実行する場合は、2 つのポート(入力および出力)が必要です。 デフォーマは、既存のジオメトリを読み込み、入力ポートと出力ポートを介してそのジオメトリを変形させるオペレータの例です。

ポート接続は、読み書きを実行する必要のある特別なデータに対して行われます。 接続先の有効なオブジェクトには、任意の Property または PropertyClusterProperty または ClusterPropertyKinematicState または KinematicStatePrimitive または Primitive または Parameter または Parameter などがあります。接続では、X3DObject 自体ではなく、X3DObject または X3DObject 内の特定のデータにアクセスする必要があります。このルールを維持するために、オブジェクト モデルまたは C++ API は、X3DObject または X3DObject のネスト データを検索するように設計されている一部のメソッドやプロパティへのアクセスを回避します。たとえば、Geometry.Clusters または Geometry::GetClusters は、オペレータがアクセスを求める各クラスタに接続すると予測されるため、カスタム オペレータ内ではブロックされます。

カスタム オペレータの作成時の主な作業の 1 つとして、ポートの定義があります。ポートを定義することによって、必要な入力データすべてが読み込まれ、計算の結果が出力オブジェクトを更新するために使用されるようになります。

ポートのインデックス

Update 関数内のポートにアクセスするには、名前またはインデックスでポートを指定できる OperatorContext.GetInputValue または OperatorContext::GetInputValue を使用します。名前よりもインデックスでポートにアクセスする方が迅速です。インデックスは、ポートが追加された順序でわかります。

  • オペレータが AddCustomOp コマンドまたは Parameter.AddCustomOp または Parameter::AddCustomOp メソッドによって作成された場合、インデックスは、入力または入力引数の順序に基づいて簡単に特定できます。

  • オペレータが手動で作成されている場合、インデックスは CustomOperator.AddInputPort または CustomOperator::AddInputPort または CustomOperator.AddIOPort または CustomOperator::AddIOPort への呼び出しの順番に基づいて特定できます。

Update 関数以外でポートにアクセスするには、Operator.InputPorts または Operator::GetInputPorts および Operator.OutputPorts または Operator::GetOutputPorts を使用できます。

注:

ポートをインデックスで取得できるメソッドは他にもあります(Operator.PortAt または Operator::GetPortAt)。ただし、このメソッドがインデックスをどのように読み込むかを理解することが重要です。実装される順序に関わらず、すべての入力ポートが出力ポートに優先します。

代わりに、OperatorContext.GetInputValue または OperatorContext::GetInputValue(または Operator.GetInputValue または Operator::GetInputValue)および Operator.InputPorts または Operator::GetInputPorts または Operator.OutputPorts または Operator::GetOutputPorts を使用することをお勧めします(はるかに安全です)。

ポート グループ

ポート グループは、オペレータのポートを構成するための優れたツールです。 各ポートは単一のグループに属す必要があり、オペレータは複数のグループを定義できます。

ヒント:

ここで使っている「グループ」という単語は、Softimage の Group または Group オブジェクトとは一切関係がありません。

ポート グループの主な目的は以下の 2 つです。

  • 作成時にオペレータへの接続を簡単にする。

  • 1 つのオペレータに接続するためのオブジェクトの数を自由に設定する。

ダイナミック オペレータや、不定数の入力から読み込みを行う複雑なオペレータなど、高度なオペレータを作成しているのでない限り、ポート グループに関しては特別な注意は必要ありません。詳細については、「スタティック オペレータとダイナミック オペレータ」を参照してください。

ターゲットとは?

ターゲットは、ポート経由でオペレータに接続されているオブジェクト(Primitive または PrimitiveKinematicState または KinematicStateProperty または PropertyParameter または Parameter など)です。 パラメータに接続する場合は、パラメータの現在の値(倍精度数値など)を取得します。それ以外の場合、接続されたオブジェクト(Primitive または Primitive オブジェクトなど)を取得します。

使用するメンバ

パラメータ コネクション

非パラメータ コネクション

OperatorContext.GetInputValue または OperatorContext::GetInputValue

パラメータの値を返します。

オブジェクトを返します。

OperatorContext.OutputTarget または OperatorContext::GetOutputTarget

 

出力ポートに接続されたオブジェクトを戻します。

OperatorContext.OutputPort または OperatorContext::GetOutputPort

ポートオブジェクト自体を戻します。続けて、OutputPort.Value または OutputPort::PutValue を使用して、ポートに接続するパラメータに新しい値を書き込むことができます。