Q100351: 時間関連の値に反応するために C++ Op 内からシステム グラフ ステート データをクエリする方法

フォローする

まとめ

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

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

詳しくは

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

これは、たとえば次の呼び出しに関連します。

Foundry ::Katana::GetCurrentTime(interface)
Foundry ::Katana::GetShutterOpen(interface)
Foundry ::Katana::GetShutterClose(interface)
Foundry ::Katana::GetNumSamples(interface)

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

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

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

注: 関連する NodeTypeBuilder 関数はKatana開発者ガイドに記載されています。

実装例

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

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

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

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

KATANAの設定の詳細については、 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」Op はこれにアクセスし、たとえば、現在の時刻をルートの属性として設定できます。

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」グループ (「currentTime」、「shutterOpen」、「shutterClose」、「numSamples」) と「variables」グループ (グラフ状態変数) を含むグループを返します。このグループは「システム」演算引数として設定する必要があります。 GetCurrentTimeGetGraphStateVariablesなどの CookInterface 呼び出しはgetOpArg("system.[...]")を呼び出す便利な関数です。

さらなるヘルプ

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

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

添付ファイル

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

理由をお聞かせください