核心问题: 你的目标浏览器环境是否支持 WebGPU?你能否适应快速迭代的 0.x API?
RepoDaily 采用评分
RepoDaily 将该项目的采用分评为 87/100(强):分数来自文章来源、安装路径、生产风险、差异化、许可证清晰度以及 AI/Agent 适配度。
包含 5 个来源、覆盖 4 类来源;如有 RepoDaily 独有模块,会进一步提高证据分。
检测到 6 个工作流步骤、6 个下一步动作,以及 2 个命令/安装信号。
趋势热度为 +338 stars;如内容中有 release、issue 或维护信号,会提高维护可信度。
采纳风险标记为 medium,并包含 4 条安全说明与 4 条跳过条件。
3 个机会视角、4 个替代方案,以及 3 个类型化模块支撑差异化判断。
文章中包含许可证来源或许可证表述。
文章正文和元数据中检测到 2 个 AI/Agent 相关信号。
项目概览
Pascal Editor 是一个完全在浏览器中运行的 3D 建筑编辑器,基于 React Three Fiber 和 WebGPU 构建。仓库采用 Turborepo 单体仓库结构,将功能拆分为四个可发布的 npm 包——@pascal-app/core、@pascal-app/viewer、@pascal-app/editor 和 @pascal-app/nodes——外加 apps/editor 下的 Next.js 应用作为独立宿主。架构设计的核心思路是:viewer 以合理默认值渲染场景,editor 层在其上叠加交互工具、选择管理和直接操控 UI。
项目的核心数据模型围绕继承自 BaseNode 类型的节点展开,每个节点携带自动生成的带类型前缀的 ID(如 "wall_abc123")、parentId 引用、可见性标志和可选的 Camera 属性。场景状态存储在名为 useScene 的 Zustand store 中,持久化到 IndexedDB,并通过 Zundo 库支持撤销/重做。viewer 维护自己的 store(useViewer)来管理选择状态、楼层显示模式(堆叠、展开、单独)和相机模式;编辑器应用则有第三个 store(useEditor),用于管理激活工具状态、面板可见性和编辑器偏好。
2026 年 4 月 21 日发布的 0.6.0 版本引入了大量功能:多表面材质系统,支持对墙体、楼梯和屋顶进行点击式的逐表面材质编辑;自动墙-房间生成,闭合墙体环路自动分割并生成楼板;楼梯-楼板集成,楼梯驱动楼板和天花板的切割;曲线围栏支持;13 种材质预设(包括花岗岩、大理石、镶木地板和木材);以及支持 GLB、STL 和 OBJ 格式的导出管道。该版本还添加了街景/漫游模式,并修复了多个 WebGPU 初始化和回退问题。
为什么现在变热
- 本期获得 338 星标,趋势排名第 13,反映出浏览器原生 3D 建筑工具日益增长的关注度
- v0.6.0 版本发布了密集的功能集——多表面材质、自动墙-房间生成、GLB/STL/OBJ 导出——全部通过多位社区贡献者的合并 PR 实现
- WebGPU 渲染配有文档化的回退机制:当 WebGPU 不可用时跳过后处理,使编辑器在不同浏览器能力下均可使用
- 清晰的包分离允许将 @pascal-app/viewer 作为独立组件嵌入,无需引入编辑器特定代码
- 插件系统文档位于 editor.pascal.app/docs/developers/plugins,并提供了完整的示例仓库(pascalorg/plugin-trees)
解决什么问题
- 浏览器端 3D 建筑编辑历来依赖重量级桌面软件(Blender、SketchUp、AutoCAD)或可扩展性有限的专有 Web 平台
- 现有开源 Web 3D 编辑器通常缺少领域特定功能,如墙到房间自动生成、多表面材质分配和建筑导出格式
- 3D 编辑工具中的状态管理极为复杂——撤销/重做、持久化和跨组件同步从零实现并不简单
- WebGPU 在各浏览器中的支持仍在成熟过程中,需要能优雅降级的运行时
工作原理
- 通过 npm 安装已发布的包:@pascal-app/core、@pascal-app/viewer、@pascal-app/editor 和 @pascal-app/nodes
- 在挂载 Viewer 组件前加载内置插件:分别从 @pascal-app/core 和 @pascal-app/nodes 导入并调用 loadPlugin(builtinPlugin)
- viewer 使用 React Three Fiber 和 WebGPU 渲染 3D 场景,应用默认相机、控制器和后处理
- 场景数据(节点、根 ID、脏节点)存储在 useScene Zustand store 中,持久化到 IndexedDB,通过 Zundo 实现撤销/重做
- 编辑器层扩展 viewer,添加交互工具、选择管理和直接操控 UI——viewer 永远不从编辑器应用导入
- 新的节点类型和侧边栏面板可以作为插件添加,遵循 editor.pascal.app/docs/developers/plugins 中文档化的契约
单体仓库包架构
仓库结构为 Turborepo 单体仓库,工作空间覆盖 apps/*、packages/* 和 tooling/*。core 包(@pascal-app/core)包含节点 schema、通过 Zustand 管理的场景状态、注册表契约、空间查询和事件总线——不包含任何 UI 代码。viewer 包(@pascal-app/viewer)通过 React Three Fiber 处理 3D 渲染,包括共享渲染系统、默认相机/控制器和后处理。
一条严格的边界规则被强制执行:packages/viewer 永远不能从 apps/editor 导入。viewer 被设计为独立组件,编辑器特定的行为通过 props 或 children 注入。这种分离意味着你可以独立嵌入 viewer,仅在需要时叠加编辑能力。
每个包维护自己的 Zustand store。@pascal-app/core 中的 useScene store 管理场景数据(节点、根 ID、脏节点、CRUD 操作),持久化到 IndexedDB,撤销/重做由 Zundo 驱动。useViewer store 追踪当前选择(建筑/楼层/区域 ID)、楼层显示模式和相机模式。apps/editor 中的 useEditor store 持有激活工具状态、结构层可见性和面板状态。
命令与开发操作面
- 克隆、安装和运行:git clone 仓库、cd editor、bun install、bun dev——编辑器启动在 http://localhost:3002
- 前置条件:Bun 1.3+(packageManager 锁定为 bun@1.3.0)或 Node.js 18+(engines.node >= 18)
- 代码检查与格式化:bun check(Biome 检查)、bun check:fix(Biome 自动修复)、bun lint、bun format
- 类型检查:bun check-types 通过 turbo 在整个单体仓库中运行 check-types
- 发布脚本:gh workflow run release.yml 配合 -f package=<名称> -f bump=<patch|minor|major>;支持 viewer、core、editor、nodes 和 mcp 的单独发布
- 缓存清理:bun clean:cache 删除 .next、.swc、.turbo 目录;bun restart 杀掉端口 3002、清除缓存并重启 dev
- 可选:将 .env.example 复制为 .env 并添加 Google Maps API 密钥以启用地址搜索——编辑器在没有它的情况下完全可用
集成接口与访问模式
stores 同时暴露 React hook 订阅和用于 React 组件外访问的直接状态接口。在 React 组件内部,通过选择器订阅:const nodes = useScene((state) => state.nodes) 或 const activeTool = useEditor((state) => state.tool)。在 React 外部(回调或系统中),直接访问状态:const node = useScene.getState().nodes[id] 或 useViewer.getState().setSelection({ levelId: 'level_123' })。
插件系统允许将新的节点类型和侧边栏面板作为独立包发布,而无需修改内置定义。契约文档位于 editor.pascal.app/docs/developers/plugins,GitHub 上的 pascalorg/plugin-trees 作为参考实现。这使得编辑器无需 fork 核心仓库即可扩展。
v0.6.0 的导出能力覆盖 GLB、STL 和 OBJ 格式,实现了与 3D 打印管道、游戏引擎和桌面 CAD 工具的互操作。街景/漫游模式在建模空间内提供第一人称导航体验。
谁适合关注
适合关注
- 正在构建浏览器端建筑或室内设计工具、需要可组合 viewer/editor 基础的团队
- 探索在生产级代码库中使用 React Three Fiber 的 WebGPU 渲染管道的开发者
- 需要基于插件扩展自定义 3D 节点类型而无需 fork 编辑器的项目
- 任何正在评估专有 3D 设计平台的开源替代方案用于空间规划的人
可以先跳过
- 需要稳定、生产冻结 API 的项目——Pascal Editor 目前为 v0.6.0,功能集快速迭代
- 目标浏览器不支持 WebGPU 且后处理回退不足的应用
- 需要服务端渲染 3D 场景的团队——这是一个客户端浏览器运行时
- 建筑/空间 3D 建模之外的用例——通用 3D 引擎可能更合适
风险与注意事项
Pre-1.0 软件,API 快速变动,依赖 WebGPU 浏览器支持,插件生态尚处早期。
- 当前版本为 0.6.0(2026-04-21 发布)——1.0 之前预计会有破坏性变更
- WebGPU 支持因浏览器而异;编辑器包含跳过后处理的回退方案,但功能可能受限
- 包覆盖锁定了 three(0.185.1)、React 类型(19.2.17)和 TypeScript(6.0.3 native preview)的特定版本,可能与消费者依赖树冲突
- 插件生态尚处早期——文档化的示例(pascalorg/plugin-trees)是主要参考,社区贡献的插件尚不广泛
- 多位贡献者正在积极合并功能(仅 v0.6.0 就合并了来自至少 10 位贡献者的 15+ PR),代码库和 API 变动频繁
- MIT 许可证——Copyright (c) 2026 Pascal Group Inc.,允许商业使用、修改和再分发
- 可选的 Google Maps API 密钥集成需要 .env 文件;编辑器在没有它的情况下完全可用,降低了不需要地址搜索的部署的攻击面
- 场景数据在客户端持久化到 IndexedDB,核心包不传输到远程服务器
- 源包中文档未涉及身份验证、授权或多用户协作功能——消费者应用必须实现自己的安全层
替代方案比较
| 方案 | 适用场景 | 代价 |
|---|---|---|
Sweet Home 3D | 你需要成熟的桌面室内设计应用,具备多年稳定性和丰富的家具目录 | 免费 / 开源(GPL) |
Blender(配合 Archimesh/Archipack) | 你需要功能齐全的 3D 建模套件,配合 BIM 插件,且习惯桌面原生工作流 | 免费 / 开源(GPL) |
IfcOpenShell | 你需要基于 IFC 的 BIM 互操作和开源几何处理,而非交互式编辑器 | 免费 / 开源(LGPL) |
专有 Web 3D 平台(Matterport、Spatial) | 你需要托管、协作和支持,无需维护自托管运行时 | 订阅制 |
这个趋势说明了什么
构建领域特定节点插件
基于 loadPlugin 的插件系统和文档化契约,你可以创建专门的节点类型——暖通管道、钢结构、景观元素——而无需 fork 核心。以 pascalorg/plugin-trees 为起点。
阅读 editor.pascal.app/docs/developers/plugins 上的插件文档,并针对 v0.6.0 节点 schema 测试你的插件
面向制造和 BIM 的导出管道
GLB、STL 和 OBJ 导出打通了到 3D 打印、CNC 加工以及导入 Revit 或 Navisworks 的路径。一个将 Pascal 场景转换为 IFC 的封装服务可以填补到企业级 BIM 工作流的缺口。
导出示例场景为 STL,在切片软件或 CAD 导入中验证几何完整性
协同编辑层
Zustand store 的 getState/setState 访问模式非常适合接入实时同步层(WebSocket、CRDT)。场景 store 的脏节点追踪提供了天然的变更检测钩子。
原型实现一个 WebSocket 桥接,订阅 useScene 脏节点事件并广播增量
RepoDaily 判断
Pascal Editor 是目前架构最干净的开源浏览器端 3D 建筑编辑器之一——包分离、Zustand store 设计和插件契约体现了深思熟虑的工程实践。在 v0.6.0 阶段,考虑到 WebGPU 依赖和不稳定的 API,它最适合愿意追踪快速变化并向上游贡献的团队,而非寻求即插即用稳定平台的用户。