Drawing、art layer 与 subart¶
一张 Harmony drawing 不是一张图像。它是四层堆叠 —— Underlay、Colour Art、Line Art、Overlay —— 而 OSA 让你把画稿指向其中任何一层,在同一层上叠多张图,并且可以逐个曝光地做。
四个 art layer¶
按 Harmony 的绘制顺序,从上到下:
| 层 | 标签 | 一般放 | |
|---|---|---|---|
| Overlay Art | OL |
画在所有东西之上的效果 | |
| Line Art | LA |
画稿的线条 —— 默认 | |
| Colour Art | CA |
平涂和上色 | |
| Underlay Art | UL |
草稿、参考线,以及任何在颜色之下的东西 |
没有 art-layer 标签的画稿会进 Line Art。这个默认值是一个常量,由收集器、Inspector 和堆叠逻辑共同读取,所以"没打标签的画稿落在哪里?"只有一个答案。
读懂这张表¶
Inspector 的 Art Layers 表是关于一张 drawing 的真相:
| 列 | 说明什么 |
|---|---|
| Art Layers | 四个层,以及嵌套在它们下面的所有 subart |
| Type | Vector 或 Bitmap —— 按层,不是按 drawing |
| Frames | 该层实际上有画稿的曝光数 |
一张 drawing 可以同时是矢量和位图
Line Art 用矢量、Colour Art 用位图,在 Harmony 里是合法的,而 OSA 能这样编排。这就是为什么 Type 是这张表里的一列,而不是 drawing 上的一个设置:类型属于每一层,由落在它上面的画稿决定。容器上的单个开关,注定会对其中一半说错话。
每一行都带有自己的按钮:
| 按钮 | 作用 |
|---|---|
+ |
给这一层添加画稿 —— 一个文件,或者一整个序列 |
⟳ |
替换已有的内容 |
✕ |
清空该层 |
subart layer:一个 art layer,多张图¶
一个 art layer 可以容纳不止一张图。那些多出来的图就是 subart layer,它们按堆叠来读。
Overlay Art ← the layer
└── Subart-000 ← a track on it
一张图不必为层级付出代价。 第一条到达某一层的序列,就平铺在 art-layer 那一行本身上 —— 没有轨道可展开,因为还没有什么需要排序。
第二张走到下面,第一张原地不动。 art layer 保留自己的画稿,新来的成为子级,落在这叠的最下面。你手底下没有任何东西被挪走:你刚导入的那一行,就在你留下它的地方。
这来自模型,而不是偏好:在这里,一个槽位可以同时携带画稿并且拥有子级 —— 这正是 Photoshop 对待图层的方式,也正是收集器读取它的方式。把第一张图推到别处去,只是重新排列这棵树,去说它本来就在说的话。
提升依然存在,为了唯一真正需要它的情形: 把一条轨道放在这一层自己的画稿之上。层这一行之上没有索引可用,所以把一个槽位拖到那里,会把那份画稿压进一条轨道里,而新来的占据最上方。手势就只是拖拽;右键菜单用文字说着同一件事 —— "Move this layer's artwork into the stack"。
树的顺序就是堆叠顺序:第一个子项在最上面。 收集器读的正是这个,所以你在树里看到的就是 Harmony 里合成出来的。
为什么是嵌套而不是并列的兄弟
两个兄弟争抢同一个 art layer,在本应用里是错误 —— OSA 会把两个都标红并拒绝该操作。嵌套保持了不变量:这一帧上仍然正好只有一个 Overlay,而堆叠是它的内容。
名字是你的,深度没有上限¶
Subart-000 只是一条新轨道出生时带的默认名字 —— 和 Octo Vector Bridge 给 pass 命名时用的默认值相同。在两个工具里的任何一个,把它改成这个镜头该叫的名字。下游没有任何东西是按这个字符串去匹配的:OSA 是按结构读取一个轨道文件夹的,带编号的(01_contour、02_detail)按编号排序,不带编号的按字母顺序排在它们之后。你改名成 rim_light 的 pass,和一条没动过的 pass 导入起来一模一样。
文件夹名字必须说清楚的,是 art layer:OSA 会读 Underlay、Colour Art / Color Art、Line Art、Overlay,以及线索词 ink 和 line,还有 UL / CA / LA / OL 这些完整单词形式的代号 —— 和 OVB 写出来的是同一套语法,所以它的导出可以直接落进来。(坚持完整单词是刻意的:一个叫 Fola 的文件夹,不能因为字母里含着 la 就变成 Line Art。)
而且堆叠没有上限。 一条轨道里可以再有轨道,你想要多少层就有多少层 —— 任何一行上的 + 都会在那一行内部添加序列,文件夹导入会递归读取嵌套的轨道文件夹,在树里拖拽也一样。无论嵌得多深,最终都会压平进它底下那唯一的一个 art layer;深度是给你按自己的思路整理用的,而不是 Harmony 有朝一日会看到的东西。
每条轨道说明自己是哪种数据¶
subart 行带着它内容类型的图标,这个类型是从源文件读出来的 —— 不是某个设置:
| 含义 | |
|---|---|
矢量 —— 写成原生笔画的 .svg,或一个 .tvg |
|
| 栅格 —— PNG、TGA、TIFF、JPEG,或一个 PSD 图层 |
两者是为了让你一眼分清而画的,因为在 14 像素下,你读到的是形状,不是细节:
- 矢量是曲线上的一个锚点 —— 一个实心蓝方块,坐落在一条穿过它的浅色 S 形曲线上。这就是每个绘图程序都会显示的贝塞尔手柄:一条由数学定义的线上,一个你可以抓住的点。
- 光栅是一块棋盘格 —— 灰色边框里,明暗方块组成的二乘二网格。这是像素网格,也是每个图像编辑器用来表示"这些是采样值,不是形状"的那种棋盘格。
一个是你还能去编辑的曲线;另一个是数值的网格。两种格式的差别就在这里,两个图标的差别也就在这里。
一个 art layer 不能混合矢量和栅格
Harmony 的 art layer 只能是其中一种。把一个 .svg 和一个 .png 叠在同一个 Colour Art 上,它们无法都被写入。
最上面的轨道决定该层的类型,另一种类型的轨道会被跳过 —— 并在导入报告里逐个点名:
vector and bitmap in one art layer: the top track is vector, so 2 bitmap track(s) were skipped (flats.png, shadow.png)
这是一条 note,不是失败:搭建发生了,只是没有全部完成。而被跳过的轨道留在你的 staging 树里 —— OSA 只压平真正落地的东西,所以你编排的东西不会因为在堆叠中落选就被删掉。把它们移到另一个 art layer,或者转换它们,下次它们就会落地。
同一层上有两条或更多矢量轨道是没问题的:它们并存,从底往上绘制,最后画的那条在最上面。
把画稿挪来挪去¶
这里没有单行道。两个右键菜单负责这些移动,它们回答的是两个不同的问题。
在树里:把一层送到另一层¶
在暂存树里右键点击一个 art layer
,会出现三个子菜单,每个都列出四个层:
| 动词 | 做什么 |
|---|---|
| Move to | 画稿离开这一层,落到那一层 |
| Copy to | 落到那边,同时还留在这边 |
| Swap with | 两层交换各自的内容 |
于是进到 Line Art 的平涂可以不重新导入就送去 Colour Art,一对进反了的层,一次 Swap 就摆正了。
每个目标在你看到它之前就由一份计划决定:OSA 会算出四个层各自会发生什么,只点亮真正有事可做的那些。做不成的目标会变灰、并把原因放进工具提示,而不是干脆消失 —— 在一个没有预览的应用里,无声死掉的条目读起来就像 bug。
在容器上,等于对所有 frame 生效
右键点击 drawing
而不是某一层,同样这三个动词会一次作用于它的所有 frame。还是同一份计划、同一个动作,只是把容器里所有可移动的层都交给了它 —— 一百个 frame 一个手势改完,一次 Ctrl+Z 撤销。
在 Art Layers 面板里:容器 ⇄ 堆叠¶
在 Inspector 的 Art Layers 面板里右键点击某一行,菜单会给出那一行能做的移动:
图标就是面板自己用的那些。drawing 那一行戴着 frame 图标,每一层戴着自己的标志 —— 而轨道戴的是它的数据类型:矢量或位图,从它的文件里读出来。上面两条轨道行显示同一个位图图标,只是因为那是同一条示例轨道:这两个菜单项在任何轨道上都存在,无论它是哪种类型。
不用拖拽就说出"这张要放在最上面",用的就是这一对:把容器的画稿推进堆叠里,再把你想要的那条轨道提到它原来的位置。
拒绝是写出来的,不是藏起来的。菜单项变灰,并说明属于哪一种:
- "this slot carries no artwork" —— 没有可移动的东西;
- "this slot has slots inside it — its children would be left with no parent";
- "
<Layer>already has its own artwork — move that one into the stack first"。
最后一条正是整个面板赖以成立的不变式:一行,一份画稿。两张图悄悄落在同一个槽位上,就会覆盖掉某个人的作品,而这恰恰是"提升"存在的理由。
序列落在层上,不是落在 drawing 上¶
把一个 120 个文件的序列拖到 Colour Art 上,OSA 会逐帧算出落点。在动手之前它就告诉你:
- 这个序列会强制新增多少新帧(它比容器长),
- 有多少已有帧在这一层上会没有画稿(它比容器短),
- 哪些 art layer 会被提升为容器。
序列偏长或偏短都不是错误。两者都会被说出来。
为什么容器仍然可以携带画稿¶
这是树反复引出的问题,而答案和 概念 里的一样:
每一行都是同一种行。不同的只是勾选了哪些框。
一张以扁平 PNG 形式到来的 drawing,在你往它上面拖东西的那一刻就能变成容器。如果成为父级意味着失去你的画稿,那每一次拖拽都是一次悄无声息毁掉一张 drawing 的机会。所以容器保留它原有的东西,画稿作为子级的同辈存在,而不是被子级取代。
这就是为什么你会看到,也是为什么这样是对的:
- 一个 frame 既有自己的画稿又在下面有 art layer,
- 一个 art layer 既有自己的图像又在下面有 subart layer。
这两种行是仅有的持有画稿的行。 drawing 节点不持有 —— 它是一个指向元素的 Read,而在 Harmony 里像素永远住在一个已曝光的 cel 里。结构节点、生成器和效果也都不持有。
所以当一个携带画稿的行变成 drawing 节点时,画稿既不会消失也不会原地不动:OSA 创建内在的 Frames 文件夹,里面有一个 frame 1,画稿向下迁移进去。只有一个家,绝不会有两个 —— 两份副本会让收集器把同一个源读两遍,而写入器会把第二次读取记为一次损失。
关于什么持有画稿、什么不持有的完整表格,见 概念。
这种组合是在 Assemble 时由合并策略解决的,而不是靠丢掉任何东西:
| 情形 | Assemble 怎么做 |
|---|---|
| 一个 frame 既有自己的画稿又有 art layer | 该 frame 的画稿合并覆盖在它指向的 art layer 之上 |
| 一个 art layer 有多条轨道 | 它们按树的顺序压平成一张图,最上面的优先 |
| 一个容器指向一个已经有画稿的层 | 被指向的层接收;其他什么都不动 |
| 一个携带画稿的行变成 drawing 节点 | 出现一个 Frames 文件夹和 frame 1,画稿移进这一帧 |
这套堆叠只存在于 OSA 里¶
这一点值得说得非常清楚,因为它改变了你之后应该期待在 Harmony 里看到什么。
Harmony 没有 subart layer。 那里的一张 drawing 恰好有四个内部层 —— Underlay、Colour Art、Line Art、Overlay —— 词汇表就这么大。你在树里搭的堆叠是一个创作期的结构:一种说"这五张图都归 Overlay,按这个顺序"的方式,而不必事先手工合并它们。
到了 Assemble,这个堆叠就被用掉了。其中每一张图都会按堆叠顺序,向下合成进它所瞄准的那一个 art layer,落到 Harmony 里的是一张普通 drawing、一个普通的 Overlay。场景里没有任何东西记得曾经有五条轨道 —— 那份记忆活在你的暂存树里,以及 OSA 保存的会话里。
顺序,从上到下¶
三条规则决定谁盖住谁,并且它们是叠加生效的:
- frame 自己的画稿永远在最上面 —— 压在它的 art layer 所持有的一切之上。它落在 frame 的 Target Layer 所指的那一层。所以一个指向 Line Art 的 frame,会盖住 Line Art 容器自己的图像以及它的全部轨道。
- 容器在自己的子级之上。 一个既有自己图像、下面又有 subart layer 的 art layer,会把自己的图像放在它自己那叠的最上面。
- 树的顺序就是堆叠顺序,第一个子级在最上 —— art layer 彼此之间如此,某个 art layer 里的轨道之间也如此。
把它读成一张图,以一个指向 Line Art 的 frame 为例:
第 4 行值得停下来看。它是矢量层上的一条位图轨道,而 Harmony 无处安放它:一个 art layer 只能是其中一种类型。由这叠的最上面决定 —— 这里最上面是矢量,所以那个位图被排除在外,在导入报告里被点名,并且留在你的树里,你可以移动它、转换它,或者重排堆叠再试一次。
把同一个位图移到 Colour Art,就什么也不会丢,因为在那里它就是最上面的:
这张 drawing 其余的 art layer 以同样方式各自搭建,每个进入自己的层 —— Underlay、Colour Art、Line Art 和 Overlay 之间永远不会相互混合。
所以这棵树值得留着
因为 Harmony 装不下这个堆叠,暂存树就是这份拆解唯一能存活的地方。重新打开 OSA,会话会带着完整的轨道回来;单看组装好的场景,说不出什么被压进了什么。
Assemble 之后,节点不再是"新"的¶
按下 Assemble 会同时做两件事,而第二件很容易被忽略:节点在 Harmony 里被搭建出来,而搭建它们的那个槽位不再是新
,变成了已存在
—— 也就是 Inspector 里的状态标记。从那以后,那一行描述的是外面真实存在的东西。
压平也发生在同一刻。无论之前那叠是什么,现在每个 art layer 在 Harmony 里都只装着一张图 —— 那是 Harmony 唯一装得下的。
所以从场景里读回来的 drawing 是平的。 无论你是在昨天组装过的场景里重新打开 OSA,还是从 Node View 里拉进一张已有的 drawing,你拿到的都是真正带画稿的那些 frame,每个都填好了自己的 art layer —— 而且没有 subart layer,因为外面根本没有可供上报的。在 Original Bitmap 里连 art layer 也没有:画稿就在
frame 上。
你可以完全照旧继续在它上面工作:
- 把画稿从容器里取出来变成一条轨道(右键 → Move this layer's artwork into the stack),再往上叠;
- 添加新轨道、重新排序、改变目标层;
- 再按一次 Assemble —— 一个已存在的节点会增删发生变化的部分,而不是从零重建。
删除场景里的画稿是一个决定,不是一次事故
来自场景的画稿,在 OSA 里被你删除时并不会被销毁。那一行会被标记为待移除 —— 琥珀色边框,加上一句工具提示说它 "will be removed from the scene on the next Assemble" —— 而右键菜单会提供 Revert to original sequence。
也就是说,这个删除在你按下组装之前一直可以撤销,只有到那时它才真正触碰场景。这段余地正是重点:从 Node View 拉进一张 drawing 然后改主意,不应该有任何代价;而当画稿是别人的时候,一个只活在单次会话里的 undo 是不够的。
Target Layer¶
Target Layer 是容器在说 "我自己的画稿放这里"。
它是这张 drawing 对自己画稿的答案 —— 上面列出的那些 art layer 是它子级的事。当一个 frame 直接携带画稿时,树的 Details 列会显示它将落在哪一层([Overlay]、[Colour Art]……),这样你不用逐个选中就能读完一百个 frame。
在 Original Bitmap 模式下根本没有 art layer,Details 列改为显示 [Original Bitmap] —— 在那里说出一个层名会是谎言。见 Original Bitmap。
Frame、Start / End 与 Z-Depth¶
表格下面的三个字段作用于容器自己的画稿:
| 字段 | 含义 |
|---|---|
| Frame(带 Start / End) | 这份画稿占据的曝光;Start ≠ End 就是一个 hold |
| Z-Depth | 在合成顺序中把这张 drawing 往前或往后推 |
| Target Layer | 由哪个 art layer 接收它 |
Z-Depth 也可以直接写进名字里,作为一个标签:Z0.1、0.5F、10B。
树里的多条轨道¶
当一层持有不止一条轨道时,树的 Details 列会说明:
Overlay Art [Overlay] 3 tracks
一条轨道什么都不宣告 —— 那是正常的扁平状态。从两条起才出现计数,因为否则想知道那里叠了画稿,唯一的办法就是展开那一行。

