我一开始并不想做矢量编辑器。
我想做的是虚拟人:它会转头,会在被触发时露出表情,也会在等待时保留呼吸和眼神。它不该机械地循环一段动画,而要根据状态连贯回应。
真正动手后,动画和模型还没出现,一个更基础的问题先拦住了我:我连一张脸都不能稳定地画出来。
画布从哪里打开?画歪的曲线怎么修?两只眼睛和脸部轮廓如何保持独立,又组成同一个角色?这些问题不解决,关键帧和状态机只会把混乱放大。
于是我先做了一个看起来不太像“虚拟人”的东西:一张能打开工程、容纳图形、编辑路径和管理图层的工作台。
这是三篇系列文章的第一篇。我们先不谈动画和模型,只回答一个问题:在角色动起来之前,怎样把它稳稳地放进编辑器?
图 1:编辑器先给工程一个入口,再把画布交到手里。
我既是设计者,也是那个会被卡住的用户
这个项目目前只有一个长期用户:我自己。
这不能代表所有创作者,却带来一种很直接的检验。演示时能绕开的坑,每天使用时一定会再次出现。
我的工作流很简单:想到一个角色,新建或打开工程,画轮廓,整理图层,再回画布检查。发现哪里别扭,就折回去修改。这个循环一天会发生很多次。
反复使用后,我在意的不再是某个功能有多抢眼,而是几个细小的确定感:工程能否找回?我改的是不是眼前这个对象?误操作能否撤销?画布上的结果与图层树里的结构能否对应?
这些问题很少出现在功能海报上,却决定了我第二天是否还愿意打开编辑器。
第一笔落下之前,先决定从哪里出发
最早的版本会直接进入编辑器。它打开得很快,却跳过了创作的第一个选择:新建、继续上次的工程,还是从已有结构出发?
如果每次回来都要先考古,快速打开画布只是把迷路提前了几秒。
所以 Home 把 New file、Open project 和 Import 放在最显眼的位置,把 Recent files、Templates 和 Projects 留在左侧。它先回答“今天从哪里继续”,再把我送进画布。
文件边界也必须清楚。.labpixi 是主工程格式,负责带走文档与资源;JSON 只承担兼容导入和导出。Recent files 会检查缓存、原文件和权限,打不开时明确要求重新选择或授权,不用空白工程掩盖错误。Projects 目前只整理项目条目,不另造一条打开文档的路径。
模板则提供另一种起点。它不是成果展柜,而是一份可拆解的样本。打开脸部模板,我能看见轮廓和双眼如何分层,也能立刻进入 Edit 模式继续修改。
图 2:模板提供一个能继续编辑的起点,而不只是一排预览图。
创作并非从第一笔才开始。找到旧工程、确认文件来源,或放心选择空白与模板,本身就是编辑体验的一部分。
工作区要让结果与结构彼此对应
新建空白工程时,中央画布占据主要视野。左侧收纳图层与资源,右侧放文件、主题、工具和选择属性,底部工具栏提供移动、画板、基础图形与钢笔。
图 3:空白工程先给出一块可以开始的地方。
但编辑器不能只在空白时显得清爽。工程出现 Frame、脸部轮廓和双眼后,工作区要同时回答三件事:
- 画布:它们最后长什么样?
- 图层树:它们如何组成?
- 属性面板:当前对象还能怎么改?
图 4:同一个 Frame,在画布上是边界,在图层树中是容器,在属性面板里是可编辑对象。
三处界面不该各记一本账。它们应当展示同一份编辑状态。我在图层树点击 face,画布立即标出脸部轮廓,右侧同时切换到它的属性。
图 5:选择不是某个面板的高亮,而是整个工作区共享的上下文。
所有修改都写回同一份文档,并以一次明确操作进入撤销历史。于是我不必猜:“这里改的会不会是另一份?”
工作区需要维护的不是更多面板,而是一份前后一致的事实。
钢笔好不好用,要看画坏以后
钢笔很容易被理解成一个画线按钮:点几下,生成路径,然后结束。
我的实际过程从不这样顺利。脸要再圆一点,顶部要更平,两侧要更对称。第一天看起来像张脸,第二天也可能像一颗态度坚定的土豆。
所以路径的完整旅程不是“生成”,而是绘制、选择、修改、删除,再退后两步检查。选中可编辑路径后,钢笔菜单除了 Path,还会提供 Add Point、Edit Path、Bend Segment、Cut Segment、Lasso Points 和 Paint Region;条件不满足时,对应操作保持禁用。
图 6:钢笔不是一次性的生成器,而是一组围绕路径组织的工具。
我最常用 Edit Path。进入编辑状态后,白色轮廓露出骨架:蓝边锚点标出曲线经过的位置,橙色控制柄决定曲线进入和离开锚点的方向。
图 7:编辑状态直接叠在最终图形上,不必跳去另一个路径面板。
这些标记只服务编辑,不会进入作品或导出结果。它们像施工脚手架:需要时解释结构,完成后退到幕后。
图 8:完整视口保留路径编辑与周围面板的对应关系,锚点和控制柄仍可在原图中放大检查。
连续拖动会合并成一次可撤销操作,不让每个像素的移动挤进历史记录。钢笔体验的核心不是“一遍画对”,而是画错后仍敢继续改。
图层树是作品的另一张地图
画布把白色脸型和蓝色眼睛呈现为一张脸。编辑时,我还需要看见它们的结构:face、eye left 和 eye right 是三个对象,共同位于一个 Frame;每个对象的显隐、锁定和顺序都会影响结果。
图层树就是这张结构地图。
右键菜单把重命名、复制、前后顺序、显隐和锁定放在手边,并在条件满足时提供分组与 Mask。当前对象不支持的动作会直接变灰。
图 9:图层菜单既说明当前能做什么,也坦白此刻做不了什么。
显隐和锁定看起来只差一个图标,却处理两件不同的事。
隐藏 face 后,画布只剩双眼。对象没有消失,它仍在图层树里,只是暂时离开舞台。
图 10:显隐改变眼前的结果,不改变对象是否存在。
锁定正好相反:脸部轮廓继续显示,却不再参与普通选择和拖动。我可以锁住已经稳定的脸型,专心调整眼睛。
图 11:锁定保留视觉结果,同时收紧交互范围。
画布用空间关系展示作品,图层树用层级与顺序展示同一份作品。只有选择、显隐、锁定和层级稳定对应,我才能在“看起来哪里不对”和“结构哪里不对”之间顺畅切换。
属性面板让选择变成行动
图层树告诉我选中了 face,画布显示它的位置,属性面板则展开位置、宽高、旋转、透明度、填充与描边。
图 12:画布、图层树与属性面板从三个角度描述同一个矢量对象。
输入数值或更换填充时,我清楚自己正在修改哪个对象。选择不再只是一圈蓝框,而成为下一步行动的起点。
这还只是一张脸
现在,我能把空白工程变成一张由多个矢量对象组成的脸,也能随时回到某条路径继续修改。我知道对象如何归入 Frame,也能藏起干扰项,锁住稳定部分。
但它还不是虚拟人。
它没有时间,不会变化;没有参数,不懂“微笑”和“闭眼”;没有状态,也无法在等待、回应和惊讶之间选择。
前面的工作却不是热身。工作区、钢笔和图层定义了角色的静态事实,后面的动画、模型和状态都从这里生长。地基不负责表演,但每场表演都站在它上面。
第二篇会把位置、旋转、缩放、透明度和路径放进时间,让静态形状开始运动。第三篇则进入模型与状态动画,讨论角色如何根据当前状态组合反应。
在那之前,我得先确信:工程能打开,路径能修改,图层能找到。即使第二天回来,我也不会和昨天的自己失联。
文中截图均来自当前 Vectania Editor 的本地测试环境,使用内置模板数据,未读取个人历史工程。