Q100351: C++ オペレーション内からシステム グラフ状態データを照会して時間関連の値に反応する方法

まとめ

この記事では、現在のフレーム時間やサンプル数などの現在のグラフ状態のシステム引数にカスタム Op からアクセスする方法について説明します。

カスタム Op の作成およびコンパイル方法に関する情報を探している場合は、 「Q100326: 最初のカスタム Op の作成およびテスト方法」を参照してください

詳細情報

カスタム Ops を実装する場合の一般的な障害は、カスタム Op が含まれる Op チェーンのノードが正しく設定されていないと、現在の時間 ( shutterOpenまたはshutterClose値) または時間サンプル数を返すクック インターフェイス関数が正しい結果を返さない可能性があることです。

これは、たとえば次のような呼び出しに関係します。

Foundry ::Katana::GetCurrentTime(インターフェース)
Foundry ::Katana::GetShutterOpen(インターフェース)
Foundry ::Katana::GetShutterClose(インターフェース)
Foundry ::Katana::GetNumSamples(インターフェース)

これらの関数から期待される戻り値を取得するには、System Op Args を追加する必要があります。通常、これらの引数の提供はノード(またはinterface.execOpを介してホスト Op)が行います。

Op が GenericOp ノードを介してインスタンス化される場合、そのaddSystemOpArgsパラメータをYesに設定する必要があります。

Op がカスタム NodeTypeBuilder 経由で登録されている場合、 buildOpChain()に渡されるインターフェースオブジェクトにはaddOpSystemArgs()メソッドがあり、このメソッドは Op 引数に「system」GroupAttribute を追加します。Op はこれを取得して使用できます。

注: 関連する NodeTypeBuilder 関数については、 Katana開発者ガイドを参照してください。

実装例

添付されているのは、 NodeTypeBuilder ベースのシンプルなノード タイプの例です。これは/root/world/geo/hello_worldhello worldタイプの単一の場所を作成し、その上で HelloWorld Op を実行します (この例では、 /rootにいくつかの属性を設定しています)。

Opソースは使用前にコンパイルする必要があります。コンパイルするには、 Katanaインストールディレクトリに含まれる$KATANA_ROOT/plugins/Src/README.mdファイルの指示に従ってください。

より詳細なガイダンスについては、 「Q100326: 最初のカスタム Op を作成してテストする方法」を参照してください

C++ ソースを .so または .dll ファイルにコンパイルしたら、このファイルをKATANA _RESOURCESディレクトリのOpsサブフォルダに配置し、NTB.py をKATANA _RESOURCESディレクトリのPluginsサブフォルダに配置する必要があります。

KATANA _RESOURCES の設定の詳細については、 Katanaインストール ガイドを参照してください。

Op をノードの Op チェーンに追加するときに 'system' Op 引数を追加するための関連コードは次のとおりです。

opArgs = FnAttribute.GroupBuilder()
interface.addOpSystemArgs(opArgs)

interface.appendOp('HelloWorld', opArgs.build())

これは以下を実行することと同じです。

graphState = interface.getGraphState()
opArgs = FnAttribute.GroupBuilder()
opArgs.set('system', graphState.getOpSystemArgs())
interface.appendOp('HelloWorld', opArgs.build())

「HelloWorld」オペレーションはこれにアクセスし、たとえば現在の時刻をルートの属性として設定できます。

static void cook(Foundry::Katana::GeolibCookInterface& interface)
{
    if (interface.atRoot())
    {
        interface.setAttr("Hello", FnAttribute::StringAttribute("World!"));
        interface.setAttr("CurrentTime", FnAttribute::FloatAttribute(Foundry::Katana::GetCurrentTime(interface)));
    }
    interface.stopChildTraversal();
}

技術的な説明

GraphState::getOpSystemArgs()は、 timesliceグループ ( currentTimeshutterOpenshutterClosenumSamples ) とvariablesグループ (グラフ状態変数) を含むグループを返します。このグループは「system」Op引数として設定する必要があります。GetCurrentTime やGetCurrentTimeなどの CookInterface 呼び出しはGetGraphStateVariables getOpArg("system.[...]")を呼び出す便利な関数です。

さらなる支援

この記事に記載されている情報に関して問題が発生した場合は、サポート チケットを開いて、発生している問題とこれまでに行ったトラブルシューティング手順をお知らせください。

サポート チケットを開く方法の詳細については、 「Q100064: サポート チケットの発行方法」を参照してください

添付ファイル

私たちはそれを聞いて申し訳ございません

理由をお聞かせください