- 桌面应用
- 图形学
【免费下载链接】Lorien
Infinite canvas drawing/whiteboarding app for Windows, Linux and macOS. Made with Godot.
Lorien 是一款基于 Godot 开发的开源无限画布绘图/白板应用(支持 Windows、Linux 与 macOS),本文以仓库中的 v0.4.0 官方手册 为骨架,结合当前仓库(v0.7.0-beta1)的源码实现,系统讲解画布操作、工具栏中的画笔/矩形/直线/橡皮擦/选择五大工具、调色板机制与全部键盘快捷键。读完本文,你将能完整掌握 Lorien 的日常绘图工作流,并理解每个操作背后对应的源码逻辑,从而更高效地使用、配置甚至二次开发这款工具。
手册定位与版本说明
本手册(docs/manuals/manual_v0.4.0.md)是 Lorien 在 v0.4.0 阶段发布的官方使用指南,覆盖从基本操作、工具使用到快捷键的全部核心交互。当前仓库代码版本为 0.7.0-beta1(见 Config.gd 中的VERSION_MAJOR/MINOR/PATCH),与手册相比功能上有所演进(例如工具列表中新增了圆形工具、设置面板新增了更多选项),但 v0.4.0 手册所讲述的核心交互模型——画布导航、五大基础工具、调色板与快捷键体系——在当前版本中全部保留并延续,因此这份手册至今仍是最佳的上手指南。
手册开篇特别强调:绘图板(Drawing Tablet)受支持且是推荐输入设备,但完全使用键盘 + 鼠标同样可以完成所有操作。这一点在源码中体现得很充分——画笔工具会读取数位笔的压感数据(详见下文画笔工具一节),同时为鼠标输入准备了完整的降级处理。
基本画布操作:绘制、平移、缩放与打开文件
v0.4.0 手册定义了四条最基本的画布操作,它们是后续所有工具使用的基础:
| 操作 | 输入方式 | 说明 |
|---|---|---|
| 绘制 | 鼠标左键(LMB)或数位笔笔尖 | 在当前激活的工具下落笔 |
| 平移/拖动画布 | 鼠标中键(MMB)按住拖动 | 手册作者建议把数位笔上的按键映射为中键,便于单手导航 |
| 缩放 | 鼠标滚轮 | 围绕鼠标位置缩放无限画布 |
| 打开文件 | 把.lorien文件直接拖入窗口,或通过菜单打开(快捷键CTRL+O) | 支持拖放与菜单两种方式 |
从源码看,画布的平移与缩放由 PanZoomCamera.gd(Camera2D子类)统一管理,缩放时改变相机 zoom、平移时改变相机 offset。一个值得注意的细节是:当检测到平移或缩放正在进行时,CanvasTool.gd 会通过_eval_disable_stroke()设置disable_stroke = true,从而中断正在进行的笔触,避免"边缩放边画线"产生的脏数据——这也是为什么操作中偶尔感觉笔触被截断的原因,属于刻意设计。
关于"打开文件":CTRL+O对应输入映射中的shortcut_open_project动作(见 project.godot 的[input]段,keycode 79 即字母 O)。手册中将其描述为"打开新标签页"(原文为Open a new empty tab),结合输入映射与拖放行为,实际语义是打开一个文件到新标签页中。另外,Main.gd 的_apply_state()会在启动时从user://state.cfg恢复上次打开的工程列表、激活标签与窗口大小,这意味着你上次的绘图现场会被自动还原。
工具栏与工具切换机制
Lorien 的所有绘图工具都集中在工具栏(Toolbar)中。启用某个工具只需两种方式之一:
- 鼠标点击工具栏中对应的工具图标;
- 按键盘快捷键(如
B切画笔、R切矩形等)。
将鼠标悬停在工具图标上,还会弹出包含快捷键说明的短提示。工具的启停、事件分发统一由基类 CanvasTool.gd 承担:每个工具都是一个继承CanvasTool的节点,通过覆写tool_event(event: InputEvent)处理输入事件;set_enabled()会同步开关_process/_process_input与光标可见性,因此同一时刻只有一个工具处于激活状态。
工具的创建与键盘绑定定义在 project.godot 的[input]段(shortcut_brush_tool、shortcut_rectangle_tool、shortcut_line_tool、shortcut_eraser_tool、shortcut_select_tool等动作),工具切换的按键分发逻辑则位于 Main.gd。所有动作的按键都不是硬编码在代码里的,而是通过输入映射统一管理、可在设置中重绑(详见下文"快捷键的底层实现"一节)。
五大工具逐个拆解
画笔工具(Brush Tool)
画笔是 Lorien 的默认工具,用于在画布上自由绘制。核心特性:
- 自由绘制:用鼠标或数位笔在画布上任意作画;
- 笔刷大小可调:通过工具栏中画笔大小调节器(Adjuster)调整,默认值为 10(
Config.DEFAULT_BRUSH_SIZE,见 Config.gd); - 笔刷颜色可换:点击工具栏中位于大小调节器旁边的彩色按钮即可切换颜色;
- 支持压感(Pressure Sensitive):数位笔的按压力度会实时影响笔迹粗细。
源码层面,BrushTool.gd 的实现相当讲究:
- 压感采样:从
InputEventMouseMotion.pressure读取笔压;鼠标事件的 pressure 通常为 0 或负值,代码会将其归一为1.0,保证鼠标也能画出正常粗细的线; - 压力曲线:原始压力经过
pressure_curve.sample()(资源见 default_pressure_curve.tres)再乘以"压力灵敏度"(Settings.GENERAL_PRESSURE_SENSITIVITY,默认1.0)得到最终笔压; - 速度衰减:当压力 ≥ 0.99(即鼠标或全压)时,会根据移动速度
_current_velocity按比例衰减压力值,模拟出"快速划过时笔迹变细"的自然手感; - 稳定器平滑:读取
Settings.GENERAL_STABILIZER_STRENGTH(默认0.5),开启后用三次贝塞尔曲线(Utils.cubic_bezier)对最近三个采样点做插值平滑,抑制手抖; - 自动补点:移动距离小于
MOVEMENT_THRESHOLD(1.0 像素)时跳过采样,避免冗余点; - 单击画点:
_is_stroke_a_dot()会检测"单击未拖动"的情况(累计距离 ≤ 6 像素),此时会移除临时点并调用_draw_point()补画一个由 3 个点构成的小圆点,保证单击也能落墨; - 超长笔触自动分段:当笔触点达到
BrushStroke.MAX_POINTS(1000 点)时会自动结束当前笔触并新开一段——注释明确说明这是为了避免超出 GodotLine2D/多边形顶点索引上限(见 BrushStroke.gd)。
矩形工具(Rectangle Tool)
矩形工具用于绘制完美的(未填充的)空心矩形,其行为与画笔有明显差异:
- 非压感:矩形四边的粗细是恒定的。从源码看,它读取的是
Settings.GENERAL_TOOL_PRESSURE(默认0.5)这个固定压力值,而不是数位笔的实时压感(见 RectangleTool.gd); - 实时预览:按住 LMB 拖动时,
remove_all_stroke_points()会不断清空上次的临时矩形并重绘,形成所见即所得的拉伸预览; - 隐藏技能:按住
Shift拖出正方形:源码中当检测到KEY_SHIFT按下时,会把拖动向量投影到主轴(drag_dir.project(sign(drag_dir))),从而锁定为正方形——这是手册未提及、但源码明确支持的细节; - 边角处理:四条边通过
add_subdivided_line()分段绘制,并在四角做 2% 的偏移收尾,避免角部重叠失真。
add_subdivided_line()由基类 CanvasTool.gd 提供:当线段长度超过 50 像素(SUBDIVISION_THRESHHOLD)时,会按 16% 的比例将线段细分为多个采样点,确保长直线在Line2D中足够平滑;短线段则直接端点采样。
直线工具(Line Tool)
直线工具用于绘制完美直线:
- 按住
Shift吸附 15° 增量:这是手册重点强调的功能。源码中吸附步长为SNAP_STEP := deg_to_rad(90.0 / 6.0),即 15°(见 LineTool.gd);吸附计算先取"鼠标相对起点角度 + 半步长",再floor(角度 / 步长) * 步长,从而把线的方向锁定到 15° 的整数倍上; - 非压感:与矩形工具一样使用固定压力值
GENERAL_TOOL_PRESSURE; - 实时预览:按住 LMB 时尾部端点跟随鼠标移动(每次移动先
remove_last_stroke_point()删除旧尾点再补新尾点),松开即提交整条线。
橡皮擦工具(Eraser Tool)
橡皮擦工具用于擦除已有的笔触(brush stroke),其余行为(如大小调节、移动方式)与画笔工具一致:
- 整笔触删除而非逐像素擦除:这是 Lorien 橡皮擦与像素类绘图软件的最大区别——只要橡皮擦光标与某条笔触发生相交判定,整条笔触就会被移除。这一点在手册中表述为"Allows you to erase any brush stroke";
- 相交判定的高效实现:见 EraserTool.gd。它先用预计算的笔触包围盒做粗筛(
BOUNDING_BOX_MARGIN = 20.0的外扩边距),再对笔触的每个线段调用Geometry2D.segment_intersects_circle()与is_point_in_circle()做精确的"线段-圆形"相交测试;其中圆的半径由"橡皮擦半径 + 该段笔触的平均压力宽度"决定,并乘以OVERLAP_THRESHOLD(0.95)容差,保证视觉上与笔迹边缘贴合; - 可撤销:每擦除一批笔触,会创建一个名为 "Erase Stroke" 的 undo/redo 动作(
_add_undoredo_action_for_erased_strokes()),通过_do_delete_stroke/_undo_delete_stroke完成删除与恢复; - 只处理屏幕内的笔触:通过
_canvas.get_strokes_in_camera_frustrum()只遍历当前视口内的笔触(BrushStroke.GROUP_ONSCREEN分组),保证画布上笔触很多时橡皮擦依然流畅。
选择工具(Selection Tool)
选择工具是 Lorien 的"编辑核心",支持框选、增选、移动、删除、复制、粘贴与复制式拖拽。完整操作语义如下:
| 操作 | 输入 | 行为 |
|---|---|---|
| 框选 | 按住 LMB 拖出矩形 | 与选择矩形相交的笔触被选中 |
| 加选 | 按住Shift+ LMB 拖动 | 在已有选择基础上追加笔触(多选) |
| 取消选择 | RMB或Esc | 清空当前选择 |
| 移动选中笔触 | 按住 LMB 拖动选中区域 | 整组笔触跟随移动;若按下 LMB 后未移动鼠标就松开,则自动取消全部选择 |
| 删除选中笔触 | Delete | 移除选中内容 |
| 复制 | CTRL+C | 复制选中笔触到内部剪贴板 |
| 粘贴 | CTRL+V | 把剪贴板中的笔触粘贴出来 |
| 复制式拖拽(Duplicate) | CTRL+D | 生成选中笔触的副本并保持选中 |
源码层面,SelectionTool.gd 用一个State枚举(NONE / SELECTING / MOVING)驱动整个交互状态机:
- 框选判定:
compute_selection()对每条笔触先做包围盒相交粗筛,再遍历笔触的每个点,只要矩形内包含任意一个点即选中(_set_stroke_selected());被选中的笔触会加入selected_strokes分组,并以主题色Config.DEFAULT_SELECTION_COLOR(#2a967c)着色; - 移动与自动取消:
MOVING状态下用_mouse_moved_during_pressed记录是否真正移动过,松手时若未移动则deselect_all_strokes(),与手册描述完全一致;移动会登记为 "Move Strokes" 的 undo/redo 动作,可撤销; - 复制/粘贴的实现:
copy_strokes、paste_strokes、duplicate_strokes三个动作共用一段逻辑——复制把选中笔触放入strokes_copied分组,粘贴/复制式拖拽则_duplicate_stroke()深拷贝这些笔触(复制点序列、颜色、大小与压力数组),并以鼠标光标位置为粘贴中心(通过包围盒中心计算偏移量)放置; - 增选与取消的细节:
Shift按下时光标切到 SELECT 模式,松开且存在选中项时切回 MOVE 模式;框选过程中会把"本次矩形内新选中的笔触"与"原本已选中但不在本次矩形内的笔触"分组建模,松手时统一提交或取消,从而精确实现"Shift 加选"。
调色板:颜色管理与预设色
Lorien 用**调色板(Color Palette)**来快速切换预定义颜色。入口与画笔颜色按钮是同一个——工具栏中位于画笔大小调节器旁边的彩色按钮,点击即可打开调色板选择器(ColorPalettePicker)。
调色板的核心规则(手册 + 源码双重确认):
- 可增删改自定义调色板:你可以新建、编辑、删除自定义调色板;
- 默认调色板不可编辑/删除:内置的默认调色板被标记为
builtin,若想基于它定制,正确做法是先复制一份再编辑副本。
源码层面,PaletteManager.gd 完整实现了这套规则:
- 默认调色板从 default_palette.tres 预加载,固定以
UUID_DEFAULT_PALETTE := "defaultpalette"标识、builtin = true,因此remove_palette()对内置调色板会直接返回失败(见 PaletteManager.gd); - 自定义调色板由
create_custom_palette()/duplicate_palette()创建,拥有 32 位随机 UUID(Utils.generate_uuid),持久化到user://palettes.cfg(Config 中的PALETTES_PATH,见 Config.gd),按名称排序显示; - 上次使用的调色板 UUID 被记录在设置项
general_color_palette_uuid_last_used中(见 Settings.gd),下次启动自动恢复; - 颜色选择 UI 位于 ColorPalettePicker.gd,配合 PaletteButton.gd 等组件实现工具栏中的彩色按钮。
键盘快捷键速查表
以下是 v0.4.0 手册列出的全部快捷键,并补充了当前仓库输入映射中可确认的对应动作名(定义于 project.godot 的[input]段):
| 快捷键 | 功能 | 对应输入动作(当前仓库) |
|---|---|---|
CTRL+S | 保存当前文件 | shortcut_save_project |
CTRL+N | 新建文件 | shortcut_new_project |
CTRL+O | 打开文件(手册原描述为"打开新标签页") | shortcut_open_project |
CTRL+Z | 撤销一个笔触 | shortcut_undo |
CTRL+Y | 重做一个笔触 | shortcut_redo |
CTRL+C | 复制选中的笔触 | copy_strokes |
CTRL+V | 粘贴复制的笔触 | paste_strokes |
CTRL+D | 复制(生成副本)选中的笔触 | duplicate_strokes |
B | 切换画笔工具 | shortcut_brush_tool |
R | 切换矩形工具 | shortcut_rectangle_tool |
E | 切换橡皮擦工具 | shortcut_eraser_tool |
L | 切换直线工具 | shortcut_line_tool |
S | 切换选择工具 | shortcut_select_tool |
Esc/RMB | 取消全部选择 | deselect_all_strokes(Esc)/ 选择工具内置逻辑 |
Delete | 删除选中的笔触 | delete_selected_strokes |
Tab | 进入/退出专注模式(隐藏全部 UI) | toggle_zen_mode |
F12 | 在鼠标位置生成一个可沿所画线条行走的角色(彩蛋) | toggle_player |
两点补充说明:
- 专注模式(Zen Mode):
Tab键切换,源码 Main.gd 中_toggle_zen_mode()会同时隐藏菜单栏、状态栏与工具栏,让你只看到画布本身,适合无干扰地专注创作; - 彩蛋(Easteregg):手册标注为
F12触发。在当前仓库中该功能对应toggle_player动作(见 Main.gd 与 project.godot 的[input]段),按键可能随版本调整过,建议在设置对话框中确认默认键位。其底层实现位于 InfiniteCanvas.gd:enable_player(true)会为每条笔触用SegmentShape2D生成静态碰撞体(BrushStroke.gd 的enable_collider()),然后在当前光标位置实例化Player(资源见 Player.tscn,角色精灵帧见 Assets/Player),这个 2D 角色就能真实地"走"在你画的线上。
快捷键的底层实现:输入映射与自定义绑定
Lorien 的快捷键并非写死在代码里,而是由一套可配置的**输入动作(Input Actions)**体系驱动:
- 动作定义:所有快捷键在 project.godot 的
[input]段声明为 Godot InputMap 动作(如shortcut_brush_tool绑定 keycode 66 即字母 B,shortcut_undo绑定 Ctrl + keycode 90 即 Z); - 运行时同步:KeybindingsManager.gd 在启动时遍历
InputMap.get_actions()(跳过ui_与player_前缀的系统动作),为每个动作读取用户自定义键位Settings.get_keybinding(action.name, action.event),再通过rebind_action()把用户配置写回 InputMap,实现运行时生效; - 持久化:自定义键位保存在
user://settings_v4.cfg的[keybindings]段(Settings.gd 的get_keybinding/set_keybinding),与普通设置分离存储; - 重绑入口:在设置对话框(SettingsDialog.gd)的快捷键列表中可以查看每个动作的当前按键并重新绑定。
因此,即使你在实际使用中发现某个快捷键与手册不同(例如上文提到的彩蛋键位),都可以在设置中一键重绑,无需修改任何代码。
进阶技巧与源码级细节
除了手册明文内容,仓库源码还揭示了几个值得了解的实用细节:
- 压感尖峰抑制:BrushStroke.gd 的
add_point()会限制相邻两点间的压力差值(MAX_PRESSURE_DIFF),代码注释说明这是为了应对 Linux 下数位笔偶发的压力尖峰,保证笔迹宽度过渡平滑; - 工具默认压力:矩形、直线等非压感工具使用的固定压力值可在设置项
general_tool_pressure中调整(默认0.5),想统一加粗/减细这类工具的画线,不必改代码; - 笔触分段上限:单条笔触最多 1000 点(
BrushStroke.MAX_POINTS),画超长线时 Lorien 会自动分段,这是 GodotLine2D索引上限决定的工程性约束,属正常行为; - 画布背景与网格:当前仓库还支持画布背景色、网格样式与网格大小等外观设置(
appearance_*系列设置项,见 Settings.gd,默认画布色#202124),这些在 v0.4.0 手册之后新增,可在设置对话框或工具栏中调整。
小结
v0.4.0 手册虽然篇幅精炼,却完整定义了 Lorien 的核心交互模型:中键平移 + 滚轮缩放的无限画布导航、以画笔/矩形/直线/橡皮擦/选择为骨架的工具体系、可自定义的调色板机制,以及一套基于输入映射、可自由重绑的快捷键体系。当前仓库(v0.7.0-beta1)的源码完整继承了这套模型,并在其上加上了稳定器平滑、压感尖峰抑制、专注模式、角色彩蛋等进阶能力。对普通用户而言,这份手册 + 本文的源码解读足以支撑你流畅地完成白板演示、草图绘制与笔记记录;对开发者而言,顺着 CanvasTool.gd → 各工具实现 → KeybindingsManager.gd → PaletteManager.gd 这条链路,可以快速定位任何交互功能对应的实现位置,进一步扩展 Lorien。
- 桌面应用
- 图形学
【免费下载链接】Lorien
Infinite canvas drawing/whiteboarding app for Windows, Linux and macOS. Made with Godot.
相关推荐
WXT:面向下一代 Web 扩展开发的框架全解析
WXT:面向下一代 Web 扩展开发的框架全解析 WXT 是一个定位为 "Next gen Web Extension Framework" 的开源框架,官方将
桌面应用图形学Lorien v0.6.0 无限画布绘图工具完全使用手册:画笔、形状工具、调色板与快捷键全解析
Lorien v0.6.0 无限画布绘图工具完全使用手册:画笔、形状工具、调色板与快捷键全解析 本文是 Lorien(一款基于 Godot 引擎开发的 Wind
桌面应用图形学Lorien v0.1.0 使用手册精读:无限画布绘图应用的基础绘制、画布导航与快捷键全解析
Lorien v0.1.0 使用手册精读:无限画布绘图应用的基础绘制、画布导航与快捷键全解析 本文以 Lorien 官方手册 v0.1.0( docs/manu
桌面应用图形学
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考