音视频视频处理图形学桌面应用【免费下载链接】NatronOpen-source video compositing software. Node-graph based. Similar in functionalities to Adobe After Effects and Nuke by The Foundry.项目地址https://gitcode.com/gh_mirrors/na/Natron点击查看免费下载Backdrop背板是 Natron 节点式合成器中为数不多的组织型内建节点它本身不处理任何图像数据而是作为节点图Node Graph中的分组容器帮助你把功能相关的节点圈在一起并添加文字标识。本指南以官方插件文档Documentation/source/plugins/fr.inria.built-in.BackDrop.rst为核心结合仓库源码带你掌握 Backdrop 的创建、拖动、缩放、删除与脚本化操作并深入理解其底层实现机制。一、Backdrop 是什么分组与标识官方文档Documentation/source/plugins/fr.inria.built-in.BackDrop.rst对 Backdrop 的定位非常明确The Backdrop node is useful to group nodes and identify them in the node graph. You can also move all the nodes inside the backdrop.即 Backdrop 的核心用途有两项分组group nodes用一块矩形区域把若干节点圈起来在视觉上形成模块标识identify them通过可编辑的文字标签说明该区域的用途例如Color Grade、Roto Paint、Output。同时你可以移动 Backdrop 内部的全部节点——这一点在源码层面表现为拖动 Backdrop 时其内部所有节点会随之一起移动详见下文四、拖动与内部节点联动。从引擎架构看Backdrop 是NoOpBase的子类见 Engine/Backdrop.h即无操作基类节点不参与渲染计算。它由AppManager::loadBuiltinNodePlugins()在启动时作为内建插件注册Engine/AppManager.cppregisterBuiltInPluginBackdrop(QString::fromUtf8(NATRON_IMAGES_PATH backdrop_icon.png), false, false);其插件 ID 定义为#define PLUGINID_NATRON_BACKDROP (NATRON_ORGANIZATION_DOMAIN_TOPLEVEL . NATRON_ORGANIZATION_DOMAIN_SUB .built-in.BackDrop)定义在 Engine/EffectInstance.h。注意源码中特别注明DO NOT change the capitalization, even if its wrong——插件 ID 中的BackDrop大小写是历史遗留但必须原样保留的规范。这也解释了本文档文件名的由来fr.inria.built-in.BackDrop.rst。文档说明本.rst插件文档头部注有Do not edit this file! It is generated automatically by Natron itself.表明它由 Natron 内部插件信息机制自动生成与Backdrop::getPluginDescription()见 Engine/Backdrop.cpp返回的描述文本一一对应。二、输入Inputs零输入节点官方文档中的 Inputs 表格为空确认Backdrop 没有任何输入端口。源码同样印证了这一点——Backdrop::getNInputs()直接返回0Engine/Backdrop.hvirtual int getNInputs() const OVERRIDE FINAL WARN_UNUSED_RETURN { return 0; }更进一步Node::canOthersConnectToThisNode()对 Backdrop 返回falseEngine/Node.cpp意味着其他节点也无法向 Backdrop 输出连接。也就是说Backdrop 完全游离于数据处理链之外纯粹是节点图上的二维组织元素——它不会出现在渲染管线中也永远不会触发计算或刷新。三、控件ControlsLabel 参数详解官方文档给出的控件表格如下字段参数/脚本名、类型、默认值、功能Parameter / script nameTypeDefaultFunctionLabel /LabelString空Text to display on the backdrop.这是 Backdrop 唯一暴露的用户控件一个文本字符串用于在节点图区域的背景上显示说明文字。3.1 源码中的参数行为在Backdrop::initializeKnobs()中Engine/Backdrop.cpp这个 Label 参数被构建为KnobString并设置了多项关键属性void Backdrop::initializeKnobs() { KnobPagePtr page AppManager::createKnobKnobPage(this, tr(Controls)); KnobStringPtr knobLabel AppManager::createKnobKnobString(this, tr(Label)); knobLabel-setAnimationEnabled(false); // 不可做动画关键帧 knobLabel-setAsMultiLine(); // 多行文本 knobLabel-setUsesRichText(true); // 支持富文本HTML 样式 knobLabel-setHintToolTip(tr(Text to display on the backdrop.)); knobLabel-setEvaluateOnChange(false); // 修改时不会触发效果重算 page-addKnob(knobLabel); _imp-knobLabel knobLabel; }这些属性对应的实际体验是多行 富文本Label 支持换行与基本 HTML 富文本颜色、字体见BackdropGuiPrivate::refreshLabelText()Gui/BackdropGui.cpp——换行符\n被替换为br并用KnobGuiString::parseFont()解析字体与颜色最终通过label-setHtml()渲染到节点图上不可动画Label 仅是一个静态标识不参与时间轴关键帧不触发求值setEvaluateOnChange(false)确保修改标签不会导致上游节点重算符合其纯组织性定位脚本名Label在 Python 脚本与序列化文件中该参数以Label作为标识名访问getKnobByName(Label)见 Gui/BackdropGui.cpp。3.2 标签变化信号的传播当 Label 值被修改时Backdrop::knobChanged()Engine/Backdrop.cpp会通过 Qt 信号labelChanged(QString)通知 GUI 层if (k _imp-knobLabel.lock().get()) { QString text QString::fromUtf8(_imp-knobLabel.lock()-getValue().c_str()); Q_EMIT labelChanged(text); return true; }GUI 侧BackdropGui::createGui()Gui/BackdropGui.cpp将该信号连接到onLabelChanged()槽实时刷新节点图上的NodeGraphTextItem文本。此外Backdrop 会自动随文本内容调整自身大小adjustSizeToContent()Gui/BackdropGui.cpp保证高度不小于标签包围盒的 1.5 倍、宽度不小于文本宽度避免文字溢出区域。四、实战操作创建、拖动与联动虽然官方文档只给了两句话的功能描述但结合源码可以还原出完整的交互行为这些正是使用 Backdrop 的核心实战点。4.1 创建自动包裹当前选中节点在节点图中通过菜单或快捷键创建 Backdrop 时若当前已有选中的节点新 Backdrop 会自动定位并缩放到恰好包裹全部选中节点。相关逻辑位于NodeGraph::createNodeGUI()Gui/NodeGraph.cppif (isBd) { BackdropGui* bd dynamic_castBackdropGui*(node_ui.get()); NodesGuiList selectedNodes _imp-_selection; if (bd !selectedNodes.empty()) { ///make the backdrop large enough to contain the selected nodes and position it correctly QRectF bbox; for (NodesGuiList::iterator it selectedNodes.begin(); it ! selectedNodes.end(); it) { QRectF nodeBbox (*it)-mapToScene((*it)-boundingRect()).boundingRect(); bbox bbox.united(nodeBbox); } // ... 计算边框留白并设置位置与尺寸 bd-setPos(bd-mapToParent(bd-mapFromScene(scenePos))); bd-resize(bbox.width() 2 * border, bbox.height() 2 * border - headerHeight); } }操作技巧先在节点图中框选或 Shift 加选若干节点再创建 Backdrop即可一步完成包裹成组 定位省去手动拖拽调整。4.2 拖动内部节点随动与 Ctrl 排除这是文档强调的 move all the nodes inside the backdrop 的底层实现。交互细节如下鼠标按下时NodeGraph::mousePressEvent()会对每个被选中的 Backdrop 调用getNodesWithinBackdrop()把当时完全位于其中的节点记录到_imp-_nodesWithinBDAtPenDown映射中Gui/NodeGraph10.cpp拖拽过程中moveSelectedNodesBy()Gui/NodeGraph20.cpp把映射中的内部节点一并加入待移动集合因此默认拖动 Backdrop 时其内部所有节点同步平移天然保持相对位置按 Ctrl 拖动源码中if (!controlDown foundBd ! ...end)的判断表明按住 Ctrl 时只移动 Backdrop 本身相当于把框挪走而节点留在原地可用于重新圈选范围而不打乱节点布局。拖动结束后位移通过MoveMultipleNodesCommand压入撤销栈Gui/NodeGraph15.cpp因此整组移动与单节点移动一样支持 CtrlZ 撤销。4.3 调整大小与其它联动操作缩放鼠标靠近 Backdrop 右下角会出现调整手柄进入eEventStateResizingBackdrop状态实时通过ResizeBackdropCommand记录每次缩放Gui/NodeGraph20.cpp同样可撤销删除deleteSelection()在删除 Backdrop 时会先调用getNodesWithinBackdrop()收集其中的节点一并加入删除列表Gui/NodeGraph30.cpp避免删了框却留下散落节点复制/剪切NodeGraph40.cpp中的复制copy与剪切cut逻辑同样会连带收集 Backdrop 内部节点Gui/NodeGraph40.cpp与Gui/NodeGraph40.cpp保证成组复制的完整性内部节点的判定方式getNodesWithinBackdrop()Gui/NodeGraph45.cpp并非记录显式的成员关系而是实时计算几何包含——把 Backdrop 的boundingRect()映射到场景坐标凡完整落入该矩形的节点即视为内部。这解释了为什么缩小 Backdrop 后部分节点会自然脱出分组。五、通过 Python 脚本创建与访问Backdrop 作为内建插件同样可以通过 Natron 的 Python API 创建。仓库自带的 PyPlug 示例Gui/Resources/PyPlugs/Glow.py第 1064 行提供了现成用法lastNode app.createNode(fr.inria.built-in.BackDrop, 1, group)其中fr.inria.built-in.BackDrop正是前面提到的插件 ID含奇怪但必须保留的大小写1为插件主版本号group参数指定创建所在的分组容器。创建后可通过脚本名访问 Label 控件node.getKnob(Label).setValue(Color Grade) # 设置背板标题由于Label已声明为不可动画脚本层面只能做静态赋值配合setEvaluateOnChange(false)脚本批量调整标签也不会引发无谓的渲染重算。六、与普通节点的关键差异一览维度Backdrop普通节点如 Merge、Blur数据输入无getNInputs() 0至少一个输入端口可被连接否canOthersConnectToThisNode()返回 false是参与渲染否NoOpBase子类是用户参数仅Label一个字符串视插件而定求值触发setEvaluateOnChange(false)永不触发参数变化通常触发重算拖动行为默认带动内部节点整体平移仅移动自身七、小结Backdrop 是 Natron 节点图工作流中一个轻量但高频的组织工具它以零输入、零渲染开销的NoOpBase实现通过唯一的Label参数提供分组标识并在 GUI 层完成了创建时自动包裹选中节点、拖动时内部节点随动、删除/复制时连带收集内部节点等一系列贴心行为。理解了getNodesWithinBackdrop()基于包围盒的几何判定与_nodesWithinBDAtPenDown的按下时快照机制你就掌握了 Backdrop 全部交互背后的设计思路可以在大型合成项目中高效地用背板划分镜头、环节与工序区域。参考源码索引插件文档Documentation/source/plugins/fr.inria.built-in.BackDrop.rst引擎实现Engine/Backdrop.cpp、Engine/Backdrop.h插件 ID 定义Engine/EffectInstance.h内建插件注册Engine/AppManager.cppGUI 实现Gui/BackdropGui.cpp节点图交互Gui/NodeGraph.cpp、Gui/NodeGraph10.cpp、Gui/NodeGraph15.cpp、Gui/NodeGraph20.cpp、Gui/NodeGraph45.cppPython 调用示例Gui/Resources/PyPlugs/Glow.py赞分享音视频视频处理图形学桌面应用【免费下载链接】NatronOpen-source video compositing software. Node-graph based. Similar in functionalities to Adobe After Effects and Nuke by The Foundry.项目地址https://gitcode.com/gh_mirrors/na/Natron点击查看免费下载相关推荐Natron「Other」节点组全解析从 Backdrop 到 Precomp 的组织、缓存与辅助节点实战指南Natron「Other」节点组全解析从 Backdrop 到 Precomp 的组织、缓存与辅助节点实战指南 在 Natron开源节点式视频合成软件功能音视频视频处理图形学桌面应用Natron 滤镜Filter节点组完全指南37 个节点的参数、原理与实战用法Natron 滤镜Filter节点组完全指南37 个节点的参数、原理与实战用法 Natron 的 Filter 节点组 Filter group集中了音视频视频处理图形学桌面应用Natron GMIC Rainbow 节点完全指南彩虹特效参数解析与节点图实战Natron GMIC Rainbow 节点完全指南彩虹特效参数解析与节点图实战 GMIC Rainbow eu.gmic.Rainbow 是 Nat音视频视频处理图形学桌面应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考