Graphite 2024 年第一季度开发进展全解析:网格吸附、程序化散布节点与矢量编辑能力升级
2026/9/11 1:31:58 网站建设 项目流程

Graphite 2024 年第一季度开发进展全解析:网格吸附、程序化散布节点与矢量编辑能力升级

【免费下载链接】GraphiteCommunity-built comprehensive 2D content creation appplication for graphic design, digital art, and interactive real-time motion graphics powered by a node-based procedural graphics engine项目地址: https://gitcode.com/GitHub_Trending/gr/Graphite

Graphite 是一款基于节点化程序化生成引擎的 2D 矢量图形编辑器,本篇技术报告聚焦其在 2024 年 Q1(1 月至 3 月)的里程碑式更新:全新的网格覆盖层与形状吸附系统、Copy to PointsPoisson-Disk Points等程序化散布节点、MorphSolidify Stroke节点,以及钢笔/路径/自由手绘工具的精细化改造。读完本文,你将掌握这些特性的设计动机、使用方式与仓库内的源码实现位置,并能直接复用Isometric Fountain等演示作品探索其效果。

说明:本文依据仓库内 website/content/blog/2024-05-09-graphite-progress-report-q1-2024.md 进度报告撰写,并结合当前仓库源码(位于editor/srcnode-graph目录)进行印证与延伸。文中涉及的演示作品源文件位于 demo-artwork 目录。


背景:从季度报告看 2024 年的 Graphite 开发节奏

Graphite 自 2024 年起改为按季度发布开发进度报告,用于总结新增功能与改进项。Q1 2024 报告发布于 5 月 9 日,是该系列的第二篇(前一篇为 2023 年度回顾)。报告提到,项目在这一阶段获得了大量新老贡献者的支持,并通过 Google Summer of Code 2024 实习计划 吸引了学生参与。

从仓库结构看,Q1 的成果横跨两大核心代码库:

  • editor:编辑器的消息系统、工具、叠加层与画布交互逻辑(Rust + WASM / 桌面);
  • node-graph:基于节点的程序化生成引擎,包括各类节点实现(nodes/)、核心类型库(libraries/)与编译器(graph-craft/)。

Q1 最具代表性的两个新特性是**网格(Grid)吸附(Snapping)**系统,报告中展示的Isometric Fountain等轴喷泉演示作品正是对这两项能力的实战检验。


新增特性详解(Additions)

以下按功能板块逐一解析 Q1 新增的核心能力,每个特性均给出仓库内的实现位置以便深入阅读。

1. 画布网格覆盖层:矩形与等轴网格

Q1 引入了可自定义的矩形与等轴网格覆盖层(相关 PR:#1521),为画布提供了精确布局的参照系。

从源码看,网格渲染与参数配置集中在 grid_overlays.rs:

  • grid_overlay_rectangular/grid_overlay_rectangular_dot:绘制矩形网格(含点状变体);
  • grid_overlay_isometric/grid_overlay_isometric_dot:绘制等轴网格,需要y_axis_spacing(Y 轴间距)与angle_a/angle_b(两轴角度)三个参数;
  • grid_overlay作为统一入口,按GridType枚举(Rectangular { spacing }Isometric { y_axis_spacing, angle_a, angle_b })分发到具体绘制函数。

网格类型在弹层(popover)中通过单选切换,切换时参数会在两种类型间保持(见overlay_optionson_update回调)。等轴网格绘制时会调用GridSnapping::compute_isometric_multiplier计算随缩放级别(document_ptz)自适应的间距乘数,确保网格在不同缩放比例下保持视觉稳定。

使用建议:矩形网格适合像素级对齐的 UI/图标设计,等轴网格适合技术插图、等轴建筑与游戏场景素材绘制——Isometric Fountain演示作品即采用等轴风格。

2. 全新吸附系统:形状互相对齐 + 网格对齐

与网格配套,Q1 重构了吸附系统,支持将形状与形状、形状与网格进行对齐(相关 PR:#1521、#1567、#1547、#1570、#1574)。

吸附实现位于 editor/src/messages/tool/common_functionality/snapping 模块,采用多路吸附器(snapper)协作的架构:

  • grid_snapper.rs:负责网格吸附,提供free_snap(自由吸附)与constrained_snap(受约束吸附,如沿轴)两个入口;
  • layer_snapper.rs:负责图层/形状之间的对齐吸附;
  • alignment_snapper.rsdistribution_snapper.rs:负责对齐与分布吸附;
  • snap_results.rs:汇总各吸附器的结果。

各吸附器将候选点(SnapCandidatePoint)与约束(SnapConstraint)输入,计算后写入SnapResults,由上层工具统一取用。这套架构使得钢笔、路径、形状、选择等工具都能复用同一套吸附逻辑。

使用建议:绘制工程图、图标或需要精确对齐的插图时开启吸附;绘制自由线条时建议临时关闭,避免锚点被强制吸附到网格。

3.Copy to Points节点:规模与旋转的随机化散布

Copy to Points节点可将任意内容(图形、矢量、字符串、栅格、颜色、渐变等)复制到一组点上,Q1 为其新增了带偏置(bias)的随机规模与随机旋转能力(相关 PR:#1540、#1541、#1592 等)。

节点定义位于 vector_nodes.rs,其输入参数充分体现了随机化的精细程度:

参数类型/默认值作用
pointsList<Vector>散布的目标点集合(可来自其他采样节点)
contentList<Graphic/Vector/String/Raster/Color/Gradient>要复制放置的内容
random_scale_min/random_scale_maxMultiplier,默认1,范围0..2每个副本随机缩放的最小/最大值(倍率)
random_scale_biasf64,范围-50..50随机尺寸概率分布的偏置:0 为均匀,负数偏小尺寸,正数偏大尺寸
random_scale_seedSeedValue尺寸随机的随机种子
random_rotationAngle,范围0..360(度)每个副本的随机旋转角度范围
random_rotation_seedSeedValue旋转随机的随机种子

源码实现要点:

  • 每个点独立使用StdRng::seed_from_u64生成尺度与旋转随机数流,同一种子可复现相同散布,保证程序化设计的一致性;
  • 偏置缩放采用对数加权公式:scale_factor = (1 - rand * horizontal_scale_factor).log2() / random_scale_bias,其中horizontal_scale_factor = 1 - 2^random_scale_bias——偏置为 0 时退化为线性均匀分布;
  • 旋转在-random_rotation/2+random_rotation/2度之间均匀取值,即参数值表示“顺时针到逆时针的总体范围”。

典型用法:将Poisson-Disk Points的采样点喂给points,把一片树叶/石子/粒子素材喂给content,即可生成自然散布的自然场景(类似Procedural String Lights灯串作品的效果)。

4.Poisson-Disk Points节点:形状内均匀随机采样

Poisson-Disk Points节点用于在形状内部采样随机分布的点,且任意两点间距不小于指定直径,从而避免普通随机采样常见的聚簇现象(相关 PR:#1586、#1590、#1596)。配套的Red Dress演示作品即用它生成裙摆上的图案散布。

底层算法位于 poisson_disk.rs,实现基于论文"Poisson Disk Point Sets by Hierarchical Dart Throwing"(分层掷飞镖法),其特点包括:

  • 复杂度 O(n)(时间与内存),通过空间加速结构AccelerationGrid快速判断新点是否与已有点过近;
  • 采用分层活跃列表(ActiveListLevels):先随机选中一个活跃方格“掷飞镖”,若飞镖落点与已有泊松点冲突则将该方格细分为 4 个子方格继续尝试,直到达到最深细分层级(DEEPEST_SUBDIVISION_LEVEL_BEFORE_DISCARDING = 8)后丢弃;
  • 点是否落在形状内部由回调point_in_shape_checker判定,因此采样严格限制在矢量形状内
  • poisson_disk_sample接收offsetwidthheightdiameter(最小间距)与随机数发生器rng,返回Vec<DVec2>点集。

典型用法:该节点通常与Copy to Points串联,构成“形状内均匀散布素材”的标准程序化流程,也适用于粒子、纹理点阵、装饰图案等生成场景。

5.Morph节点:矢量形状的渐变动画

Morph节点用于在两个矢量形状之间进行 tween(补间),生成平滑过渡的中间形态(相关 PR:#1576 中可以看到,Morph 在计算中点形态时会保留ATTR_APPEARANCE外观属性,确保过渡过程中填充/描边颜色保持不变(源码注释明确说明 “Morph should keep the appearance at the midpoint”)。这使 Morph 不仅能做几何变形,还能用于制作形状切换动画的关键帧。

典型用法:在动画场景中,将两个关键帧形状接入 Morph,再配合动画相关节点驱动补间进度,即可得到矢量形状渐变动画。

6.Solidify Stroke节点:描边转填充

Solidify Stroke节点可将描边(stroke)转换为填充形状,便于后续布尔运算、路径编辑或应用其他仅作用于填充的处理(相关 PR:#1650)说明它“changes how many vector items its content holds”,即会改变其内容承载的矢量项数量。转换后得到的填充路径可用Path工具继续编辑,也可配合Morph等节点参与程序化变形。

7. 节点图 UI 与工作流改进

  • 节点图界面优化(#1564、#1568);
  • 图类型错误来源可视化(#1577):当节点图存在类型错误时,直观标出是哪个节点引发了错误,大幅缩短排查时间;
  • 节点图框选(#1616):支持在节点图中拖出矩形框批量选择节点;
  • 拖拽节点仅沿单轴移动时回弹的问题修复(见 Fixes 中的 #1619)。

8. 画布与文档操作

  • 文档倾斜(tilting)改进与复位:优化了画布倾斜操作并支持一键复位倾斜;
  • 自动保存(#1580):文档每 30 秒自动保存一次,减少意外丢失风险;
  • 自动平移(auto-panning)(#1625、#1652、#1682、#1690):使用交互工具绘图时,当指针移出视口边缘,画布自动跟随平移,支持连续绘制长线条;
  • SVG 导入(#1579、#1656):支持导入 SVG 矢量文件,进一步完善互操作性。

9. 工具与交互细节

  • 恢复 Select 工具丢失的功能(#1583):修复此前代码改动导致的选择工具功能回退;
  • 钢笔工具逐点撤销(#1587、#1597):绘制过程中可撤销单个锚点,而不会清空整个尚未完成的路径;
  • 自由手绘工具扩展开放路径端点(#1594、#1623):可从开放路径的任一端点继续接续绘制;
  • 路径工具:删除锚点断开闭合形状(#1593):删除(而非溶解)路径上的点可将闭合形状断开为开放路径;
  • 路径工具:滑动插入锚点(#1581):在路径段上滑动到目标位置即可插入新锚点;
  • 路径工具:共线手柄锁定复选框:勾选后锁定锚点两柄保持共线,便于绘制平滑曲线;
  • 菜单列表搜索(#1499):在菜单列表中直接输入即可过滤搜索项;
  • 多个工具的动态输入提示改进
  • Alpha 3 发布系列:2024 年 2 月启动 Alpha 3 版本线。

修复项盘点(Fixes)

Q1 修复了大量影响稳定性与体验的问题,按类别归纳如下:

节点与数据正确性

  • Sample Points节点性能问题与开放路径 bug(#1542、#1546);
  • 部分数值节点数据与其他数据不兼容(#1543、#1618);
  • 非填充形状的Fill节点丢失纯色字段(#1572);
  • Circular Repeat节点无输入连接时崩溃(#1571);
  • 类型推断哈希表内存泄漏(#1566);
  • 图像缓存失效导致性能问题(#1595)。

路径与图层编辑

  • 无法选中倒置(负缩放)图层(#1560);
  • 路径工具锚点坐标使用了错误的坐标系(#1626);
  • 路径工具在视口平移后拖动锚点出现偏移(#1693);
  • 图层面板分组导致意外的顺序重排与命名丢失(#1627、#1645、#1672、#1678、#1637);
  • 取消分组/删除组后遗留孤儿子图层(#1655);
  • 画板删除时连带删除其子作品(#1651);
  • 复制粘贴的图层未保留隐藏/可见状态(#1698);
  • 已选中隐藏图层仍可编辑(#1697);
  • 多选图层时缩放微调(nudge)行为错误(#1699)。

历史记录与输入

  • 拖拽输入控件每帧产生大量历史步骤(#1584、#1598);
  • 多处多余的撤销/重做历史步骤(#1660、#1668、#1675);
  • 部分工具缺少右键/Esc 取消交互(#1658、#1664、#1666)。

渲染与平台

  • Safari 下浮动菜单的渲染 bug;
  • Windows 用户每次渲染重复三次的性能问题;
  • 叠加层未与像素网格对齐导致的难看抗锯齿(#1603);
  • 粘贴图片时放置位置错误;
  • 多边形工具绘制的星形/凸多边形带有不期望的倾斜(#1640);
  • 下拉菜单无法用方向键键盘导航(#1630、#1649);
  • 工具选项修改后需再次使用才生效(#1646);
  • 快捷键修饰键在 UI 中的显示顺序错误;
  • 切换标签页到另一文档时节点图未更新(#1691)。

内部重构与工程化(Internal)

Q1 在架构层面的投入同样可观:

  • 若干大规模重构与代码清理(#1565、#1582、#1620、#1695、#1708);
  • 矢量格式属性化重构(#1624 中丰富的属性定义一脉相承,为后续数据兼容与扩展奠定基础;
  • 预配置开发容器(dev containers):flake.nix 与相关配置支持一键搭建容器化开发环境,降低新贡献者的上手门槛。

实践建议:如何亲手复现 Q1 特性

如果你希望亲自体验上述特性,推荐以下路径:

  1. 打开演示作品:仓库 demo-artwork 目录下存放了多份.graphite演示文件,其中 isometric-fountain.graphite 展示了网格与吸附在等轴场景中的运用,red-dress.graphite 展示了 Poisson-Disk 采样散布效果,procedural-string-lights.graphite 则串联了Copy to Points等程序化节点;
  2. 构建并运行编辑器:仓库根目录 README.md 提供了完整的构建指引,支持 Web(WASM)与桌面端;对于首次接触的开发者,可优先使用预配置的容器化开发环境快速启动;
  3. 阅读关键源码:网格绘制见 grid_overlays.rs,吸附见 snapping 模块,散布节点见 vector_nodes.rs,Poisson 采样算法见 poisson_disk.rs;
  4. 跟随路线图:项目在 features 页 维护 2024 年及以后的目标路线图,可了解这些特性的后续演进方向。

结语

Q1 2024 的更新清晰地展现了 Graphite 的两条主线:一方面通过网格、吸附与路径编辑的精细化打磨,让传统矢量绘制工作流更精确、更顺手;另一方面通过Copy to PointsPoisson-Disk PointsMorphSolidify Stroke等节点持续强化程序化生成能力,使“节点化、非破坏性”的理念在真实创作中得到落地。如果你对程序化矢量设计或 Rust 图形引擎开发感兴趣,Q1 的这些成果(及其源码)是很好的学习样本。

【免费下载链接】GraphiteCommunity-built comprehensive 2D content creation appplication for graphic design, digital art, and interactive real-time motion graphics powered by a node-based procedural graphics engine项目地址: https://gitcode.com/GitHub_Trending/gr/Graphite

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询