Q100351:如何从 C++ Op 内部查询系统图状态数据以对时间相关值做出反应

关注

概括

本文将解释如何从自定义 Op 访问当前图形状态的系统参数,例如当前帧时间或样本数量。

如果您正在寻找有关如何编写和编译自定义 Op 的信息,请参阅Q100326:如何编写和测试您的第一个自定义 Op

更多信息

实现自定义 Op 时的一个常见障碍是,返回当前时间(shutterOpen 或 ShutterClose 值)或时间样本数量的 Cook 接口函数可能不会返回正确的结果,除非设置了自定义 Op 所属 Op 链的节点正确地起来。

例如,这与以下调用相关:

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

为了能够从这些函数中获得预期的返回值,有必要添加系统操作参数。通常由节点(或通过interface.execOp托管 Op)负责提供这些。

如果 Op 是通过 GenericOp 节点实例化的,则其addSystemOpArgs参数需要设置为Yes

如果 Op 是通过自定义 NodeTypeBuilder 注册的,则发送到buildOpChain()接口对象具有addOpSystemArgs()方法,该方法会将“系统”GroupAttribute 添加到 Op 参数。 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 链时添加“系统”Op arg 的相关代码如下:

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”组(图形状态变量)的组。该组应设置为“系统”Op arg; CookInterface 调用(例如GetCurrentTimeGetGraphStateVariables是调用getOpArg("system.[...]")的便捷函数。

进一步的帮助

如果您对本文中包含的信息遇到任何问题,请打开支持票证,让我们知道您遇到的问题以及您迄今为止采取的故障排除步骤。

有关如何开立支持票证的更多信息,请参阅Q100064:如何提出支持票证

附件

我们很遗憾听到

请告诉我们