☰
Lorien 无限画布应用 v0.4.0 使用手册详解:画布导航、五大工具、调色板与快捷键实战指南
2026/10/8 8:03:10 网站建设 项目流程
  • 桌面应用
  • 图形学

【免费下载链接】Lorien

Infinite canvas drawing/whiteboarding app for Windows, Linux and macOS. Made with Godot.

项目地址:https://gitcode.com/gh_mirrors/lo/Lorien
点击查看免费下载

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)中。启用某个工具只需两种方式之一:

  1. 鼠标点击工具栏中对应的工具图标;
  2. 按键盘快捷键(如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

两点补充说明:

  1. 专注模式(Zen Mode):Tab键切换,源码 Main.gd 中_toggle_zen_mode()会同时隐藏菜单栏、状态栏与工具栏,让你只看到画布本身,适合无干扰地专注创作;
  2. 彩蛋(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)**体系驱动:

  1. 动作定义:所有快捷键在 project.godot 的[input]段声明为 Godot InputMap 动作(如shortcut_brush_tool绑定 keycode 66 即字母 B,shortcut_undo绑定 Ctrl + keycode 90 即 Z);
  2. 运行时同步:KeybindingsManager.gd 在启动时遍历InputMap.get_actions()(跳过ui_与player_前缀的系统动作),为每个动作读取用户自定义键位Settings.get_keybinding(action.name, action.event),再通过rebind_action()把用户配置写回 InputMap,实现运行时生效;
  3. 持久化:自定义键位保存在user://settings_v4.cfg的[keybindings]段(Settings.gd 的get_keybinding/set_keybinding),与普通设置分离存储;
  4. 重绑入口:在设置对话框(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.

项目地址:https://gitcode.com/gh_mirrors/lo/Lorien
点击查看免费下载

相关推荐

上一篇:PanSou 微博搜索插件接入指南:微博用户搜索与评论 API 的 Cookie 认证、请求与解析实战
下一篇:2025终极指南:如何用openpilot将普通汽车升级为智能驾驶座驾

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

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

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

立即咨询