Q100326:如何编写和测试您的第一个自定义操作

关注

概括

Ops 是在Katana中创建和操作 3D 场景数据的操作构建块。 Ops 是用 C++ 编写的名为Op Types的插件的实例他们可以使用KatanaOp API执行各种操作,操作场景图并修改属性

本文提供了基于$KATANA_ROOT/plugins/Src/Ops下的 HelloWorld 示例 Op 编写、编译和测试自定义 Op 的分步示例

更多信息

在创建自定义 Op 之前,查看位于$KATANA_ROOT/plugins/Src/Ops中的示例 Ops 可能会有所帮助。本教程专门基于 HelloWorld 示例 Op。

以下步骤描述了如何修改此 Op 的源代码以创建一个可以读取和设置场景图中位置的属性的 Op。

  1. 修改$KATANA_ROOT/plugins/Src/Ops/HelloWorld/src/HelloWorldOp.cpp中的cook()函数如下:
static void cook(Foundry::Katana::GeolibCookInterface& interface)
{
   FnAttribute::StringAttribute typeAttr = interface.getAttr("type");
   interface.setAttr("testType",  typeAttr);

    if (interface.atRoot())
    {
       interface.setAttr("hello", FnAttribute::StringAttribute("world!"));
    }

}

  1. 要构建示例 Op 插件,请按照 $KATANA_ROOT/plugins/Src/README.md 中给出的说明进行操作

    确保源文件路径在cmake命令中指向正确的Katana版本。没有必要在cmake命令中包含 -DCMAKE_PREFIX_PATH,因为这是指定我们在本例中不感兴趣的其他 Op 示例的依赖项。

  1. 构建并安装插件后,请确保安装目录是KATANA _RESOURCES的一部分。使用 README.md 中给出的命令,MyKatanaResources 目录应包含在KATANA _RESOURCES中。

  1. 启动Katana ,创建一个 CameraCreate 节点并将其连接到一个 GenericOp 节点。

  1. 将 GenericOp 节点的opType参数设置为“HelloWorld”。其结果应该是在每个位置上设置一个名为testType的属性,并且该属性的值将是该位置的类型。此外,名为“hello”的属性将在/root上设置为“world!”的值。

还可以修改 cook() 函数来读取或设置您在某个位置感兴趣的任何属性,或执行许多其他操作cook()

有关可在自定义 Ops 中使用的更多功能,请参阅Cook Interface (C++) 上的Katana开发人员指南

注意:默认情况下,Op 在所有位置运行(由GenericOp 节点中的applyWhere参数指定),因此它将在每个场景图位置执行。在上面的示例中,这会导致在所有位置设置testType属性。

因为这并不总是可取的,所以上面的示例还包含一个 if 语句,检查接口是否为atRoot() - 这将导致 if 块内的语句仅当 Op 运行在已被烘焙的最顶层位置时才执行at,并且您可以在 if 语句之后使用interface.stopChildTraversal()来阻止 Op 遍历该最顶层位置下方的整个场景图。

如果您想创建自定义节点类型来使用您的 Op,请参阅$KATANA_ROOT/plugins/Src/Ops/Messer/RegisterMesserNode.py下找到的基于 NodeTypeBuilder 的节点类型示例。

Katana开发人员指南中记录了一些NodeTypeBuilder API 函数

如果您在执行这些步骤时遇到任何问题,请打开支持票证并告知我们您遇到的问题以及您迄今为止采取的故障排除步骤。

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



    我们很遗憾听到

    请告诉我们