Q100351:如何从 C++ 操作内部查询系统图状态数据以响应时间相关值

概括

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

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

更多信息

实现自定义操作时常见的绊脚石是,返回当前时间( shutterOpenshutterClose值)或时间样本数的 cook 接口函数,除非自定义操作所属的操作链的节点设置正确,否则可能不会返回正确的结果。

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

Foundry ::Katana::GetCurrentTime(接口)
Foundry ::Katana::GetShutterOpen(接口)
Foundry ::Katana::GetShutterClose(接口)
Foundry ::Katana::GetNumSamples(接口)

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

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

如果操作是通过自定义的 NodeTypeBuilder 注册的,则发送给buildOpChain()接口对象具有addOpSystemArgs()方法,该方法会将一个“system”GroupAttribute 添加到操作参数中。然后,操作可以检索并使用此属性。

注意: 相关的 NodeTypeBuilder 函数可以在Katana开发者指南中找到。

示例实现

附件是一个基于 NodeTypeBuilder 的简单节点类型示例,它在/root/world/geo/hello_world创建一个类型hello world的位置,并对其运行 HelloWorld 操作。(在本例中,在/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 参数;诸如GetCurrentTimeGetGraphStateVariables之类的 CookInterface 调用是便捷函数,它们调用getOpArg("system.[...]")

更多帮助

如果您在使用本文信息时遇到任何问题,请提交支持工单,并告知我们您遇到的问题以及您目前已采取的故障排除步骤。

有关如何提交支持工单的更多信息,请参阅Q100064:如何提交支持工单

附件

我们很遗憾听到

请告诉我们