





















P3DE(Processing 3D Editor)是一款诞生于追求“极致原生”与“高度集成”理念下的轻量级 3D 内容创作引擎及编辑器。在当前 3D 开发领域深陷重型引擎(如 Unity, Unreal)与庞杂第三方库包围的现状下,P3DE 另辟蹊径,试图证明在 Processing 这一极简的 Java 艺术编程框架下,依然可以构建出具备工业级交互体验、高性能 PBR 渲染以及可视化逻辑编辑能力的闭环工具链。
再者,在当下AI Coding日益强大的环境下,该项目可以极好的给AI和开发者提供源码参考,为日后搭建三维可视化逻辑编程工具打下坚实的基础。未来人人都能以极小的代价来定制化工具或软件。
本项目最显著的特征——也是我们最为自豪的技术底线——是全过程未引用任何第三方插件或外部 Jar 包库。
在 Processing 的生态中,为了实现 3D 操纵、UI 界面或脚本执行,通常的惯例是依赖 ControlP5、PeasyCam 或 Rhino 等成熟库。然而,P3DE 选择了一条更为艰难但纯粹的道路:
init.p3dec 自动化批处理能力。由于坚持了“零依赖”策略,P3DE 展现出了极佳的工程一致性。用户下载代码后,无需进行任何复杂的环境配置或库安装,即可直接在标准的 Processing IDE 中编译运行。
这种“单文件夹即工程”的模式,不仅极大地降低了原型开发的门槛,更使得项目具备了天然的可移植性。无论是作为教学案例研究 3D 引擎底层原理,还是作为轻量级交互装置的开发平台,P3DE 都能提供即开即用的卓越体验。所有的代码逻辑分布在清晰的 PDE 选项卡中,开发者可以像阅读普通 Processing 脚本一样,深入洞察从射线拾取到蓝图转译的每一行核心细节。
本项目的诞生得益于 SharpEye[笔者] 与 Antigravity[Google AI Coding] 的深度协同。SharpEye 策划了产品的顶层蓝图,坚持以“UE5 级操作体验”为 UX 标杆,从层级树的交互逻辑到蓝图节点的布局美学均提供了精准的方向。Antigravity 则通过严密的工程实践,将复杂的数学公式固化为高效的 PDE 脚本,确保了在高保真渲染环境下依然保持流畅的编辑帧率。
P3DE v0.4.8 不仅仅是一个工具,它更是一次针对“原生开发极限”的技术告白:在有限的框架内,通过纯粹的逻辑力量,构建一个无限可能的 3D 创作世界。
本项目的功能构建遵循“自下而上”的原则,从基础的 3D 数学库到顶层的可视化编辑器,每一层均提供了丰富的特性以支持复杂的创作需求。


wait 指令实现在单线程环境下的非阻塞时间控制。
P3DE 采用分层架构设计,确保 UI 逻辑与 3D 核心数据的解耦。
graph TD subgraph UI_Layer ["UI 层 (Processing HUD)"] Menu["Top Menu Bar"] Hierarchy["Hierarchy Panel"] Inspector["Inspector Panel"] Console["Terminal Console"] end subgraph Editor_Layer ["编辑器逻辑层"] Gizmo["Gizmo 操纵器 (TRS)"] CamCtrl["Camera Controller"] UndoReq["Undo/Redo Manager"] BP_Editor["Blueprint Editor"] end subgraph Logic_Layer ["脚本与逻辑层"] Transpiler["VLB Transpiler (DFS)"] ScriptEngine["P3DES Async Engine"] Context["Script Context ($this)"] end subgraph Core_Layer ["核心数据与渲染层"] SM["SceneManager (The Hub)"] Entity["Entity Object"] Material["PBR Material"] AssetLoader["OBJ/Texture Loader"] Shader["PBR Custom Shader"] end UI_Layer --> Editor_Layer Editor_Layer --> SM Logic_Layer --> SM Logic_Layer <--> Entity SM --> Core_Layer
以下展示了 P3DE 内部核心类之间的组合与引用关系。
classDiagram class SceneManager { +ArrayList entities +Blueprint levelBlueprint +undoManager undo +renderScene() +saveScene() } class Entity { +String name +PVector pos, rot, sca +Material mat +Blueprint bp +ArrayList children +updateMatrix() } class Material { +Color albedo +float metallic +float roughness +PImage albedoMap +loadTextures() } class Blueprint { +ArrayList nodes +ArrayList connections +compileToPDES() } class VLBNode { +String type +ArrayList pins +execute() } class ScriptManager { +ArrayList activeScripts +runScript(p3des) +substituteVariables() } SceneManager "1" *-- "many" Entity : Owns SceneManager "1" *-- "1" Blueprint : Level Logic Entity "1" *-- "1" Material : Has Entity "1" *-- "0..1" Blueprint : Custom Logic Entity "1" *-- "many" Entity : Parent/Child Blueprint "1" *-- "many" VLBNode : Contains ScriptManager ..> Entity : Controls ScriptManager ..> SceneManager : Global Controls
| 组件名称 | 核心职责 | 关键细节 |
|---|---|---|
| SceneManager | 系统中枢 (Hub) | 维护实体列表、处理全局渲染循环、管理 Undo 堆栈及场景持久化 (JSON)。 |
| Entity | 3D 基础实体单元 | 存储变换矩阵 (TRS)、层级关系 (Parent/Child) 及关联的材质和逻辑。 |
| BlueprintEditor | 逻辑编辑器界面 | 处理节点拖拽、连线逻辑及 UI 缩放平移,是 VLB 系统的门面。 |
| VLBNodeLibrary | 节点工厂 | 定义具体的节点行为(如 MoveTo, Wait, Log)及其对应的 P3DES 指令转译逻辑。 |
| ScriptManager | 异步解释内核 | 负责 P3DES 脚本解析、时间切片 (Wait) 控制及动态变量 ($px 等) 的双向绑定。 |
| Gizmo | 空间操纵器 | 实现 3D 空间内的射线拾取 (Picking) 与分轴变换逻辑。 |
| Material | PBR 材质容器 | 存储物理着色参数与贴图索引,负责向 PBR Shader 注入 Uniform 变量。 |
| CommandInterpreter | 终端解析器 | 处理 P3DEC 指令解析、Alias 别名映射及日志流的持久化存储。 |
P3DE 共有 18 个核心 .pde 文件,按功能职责划分为以下六大模块。
p3deditor.pde: 主程序入口,处理 setup()、draw() 及全局事件分发。SceneManager.pde: 核心管理器,维护实体列表、撤回重做队列及存档读写。UIManager.pde: 全局 UI 渲染与交互(层级树、属性面板、菜单栏)。BlueprintEditor.pde: 蓝图逻辑编辑器的交互画布。DebugConsole.pde: 系统控制台终端的视窗渲染。Entity.pde: 基础 3D 实体类。Material.pde: PBR 材质数据模型。Gizmo.pde: 视口三轴平移/旋转/缩放操纵器。Raycast.pde: 射线拾取与碰撞检测数学库。EditorCamera.pde: 摄像机轨道旋转与缩放逻辑。ScriptEngine.pde: P3DES 异步非阻塞执行内核。CommandInterpreter.pde: P3DEC 指令解析与分发引擎。Command.pde: Undo/Redo 模式的原子指令定义。Blueprint.pde: 蓝图数据结构(节点、针脚、连接)。VLBNode.pde: 蓝图节点基类与转译逻辑。VLBNodeLibrary.pde: 预设节点类型定义工厂。OSCClient.pde: OSC 网络数据广播。Exporter.pde: 独立程序打包与资源路径 Cook 引擎。该图展示了工程中全部 18 个 .pde 文件间的调用与依赖流向。
graph LR subgraph Core ["入口与核心"] Entry["p3deditor.pde"] SM["SceneManager.pde"] end subgraph UI ["UI 表现层"] UI_M["UIManager.pde"] BP_E["BlueprintEditor.pde"] Con["DebugConsole.pde"] end subgraph Logic ["脚本与撤回系统"] CI["CommandInterpreter.pde"] SE["ScriptEngine.pde"] Cmd["Command.pde"] end subgraph VLB ["可视化蓝图"] BP["Blueprint.pde"] Node["VLBNode.pde"] Lib["VLBNodeLibrary.pde"] end subgraph Interaction ["3D 渲染与交互"] Ent["Entity.pde"] Mat["Material.pde"] Giz["Gizmo.pde"] Ray["Raycast.pde"] Cam["EditorCamera.pde"] end subgraph Service ["服务与导出"] OSC["OSCClient.pde"] Exp["Exporter.pde"] end %% 核心调用流 Entry --> SM Entry --> UI_M Entry --> Cam %% UI 与核心交互 UI_M --> SM %% 蓝图系统内部流 BP_E --> BP BP --> Node Node --> Lib Node -- 转译 --> SE %% 脚本引擎流 CI --> SE CI --> Cmd %% 实体与交互流 SM --> Ent Ent --> Mat Ent --> BP Ent --> Giz Giz --> Ray %% 其他服务 SM --> OSC SM --> Exp
P3DE 的架构设计旨在解决 Processing 原生环境下的两个核心痛点:大规模对象管理与顺序执行流的非阻塞解耦。以下是四大核心模块的底层技术实现:
在传统 Processing 开发中,程序员往往需要维护大量的全局变量。P3DE 引入了 SceneManager 作为底层骨干。
Play 键时,SceneManager 会对场景内所有实体的 Transform、材质及运行状态进行深度拷贝。当点击 Stop 时,系统会瞬间销毁当前动态场景,并根据快照完美复原。这一机制彻底解决了运行中途修改物体位置后无法“一键归位”的难题。UIManager)并不直接修改底层像素,而是通过 SceneManager 提供的 API 发送变更指令。这种“单向数据流”模式使得系统天然支持撤销、重做操作以及未来可能的网络参数同步。VLB 蓝图系统本质上是一个图形依赖转译器。
Event 节点(如 OnStart)开始,利用深度优先搜索 (DFS) 算法遍历整个连通图。系统会自动识别数据依赖(例如:位置计算节点必须在设置位置节点之前执行),并将非线性的节点结构“摊平”为线性指令序列。move_to, wait, set_col)。这种“指令化”设计确保了蓝图逻辑可以被脚本引擎秒级读取并热重载 (Hot-Reload),无需重新编译 Java 类。P3DE 的终端不仅是一个日志查看器,它是一个具备指令感知的 Command Shell。
spawn "Box with Spaces")逻辑。c 指向 spawn cube,那么输入 c; tp $this 0 0 0 会被正确展开为两条原子指令。这是整个编辑器“动态感”的来源,它巧妙地绕过了 Processing 的单线程性能陷阱。
draw() 帧循环末尾,会检查当前脚本列表的 waitTime 时间戳。只有当系统时间超过等待戳时,才会执行下一行脚本。这种“伪同步”写法让复杂的动画时序(例如:延迟 2 秒开门)可以通过极其直观的顺序代码实现。$px, $py 等符号,实现了脚本语言对 Java 对象的无缝读写。采用动态 Uniforms 数组打包场景内所有的点光源数据。在每一帧渲染前,实体会强制刷新其关联材质的插值状态,确保 IBL 环境光强度与材质反射属性在 Shader 显存中始终保持同步同步。
熟练使用快捷键能让你的创作效率提升 3-5 倍:
1: 选择模式 (Select)2: 移动模式 (Translate)3: 旋转模式 (Rotate)4: 缩放模式 (Scale)data/init.p3dec 中预设你的常用操作。例如:alias reset tp $this 0 0 0; rot $this 0 0 0reset 即可将选中的物体归位。# 从深蓝渐变至橙红
bg 20 20 50
light_intensity $this 0.2
wait 3000
bg 255 150 50
light_intensity $this 5.0
alias circle_spawn set_var $i 0; label loop; spawn cube; move_to $this cos($i)*100 0 sin($i)*100; add_var $i 0.785; if $i < 6.28 goto loop
(注:0.785 约等于 PI/4,此指令将沿圆周生成 8 个方块)底层转译机制:从节点到指令 (Transpilation Example):
理解蓝图是如何变成脚本的,有助于优化逻辑设计。假设你构建了一个简单的“点击变色并移动”逻辑:
蓝图流 (VLB Graph):
onClick -> Set Color (Red) -> Wait (1000ms) -> MoveTo (100, 0, 0)
转译出的 P3DES 脚本:
# VLB Transpiled Code for [Entity_001]
# Event: onClick
set_color $this 255 0 0
wait 1000
move_to $this 100 0 0
转译引擎会自动处理节点间的执行顺序,并将图形化的数据 PIN 脚(如选中的颜色)转换为指令参数。
利用 OnUpdate 构建主动逻辑:
不要让蓝图只是被动地响应点击。配合 OnUpdate 节点与 Math Expression 节点(例如:输入 sin(time)*5 并在结果连向物体的 Y 坐标),你可以构建出自动浮动、自发光变色或路径巡航等具有生命力的场景元素。
蓝图排布优化:
当节点变得复杂时,尽量使用“对齐”逻辑,并利用连线的高亮效果追踪数据流向。如果逻辑变得难以维护,考虑将特定参数合并到一个 Math Expression 中,保持蓝图主干的条理性。
Group 节点作为底座,然后将各个关节分层级挂载。这样你只需要控制底座的移动,整个复杂的层级树都会根据矩阵变换自动跟随,大大简化了运动学控制。虽然 v0.4.8 版本已经建立了一个稳固的 3D 创作框架,但作为一个进化中的实验性项目,P3DE 仍有巨大的成长空间。以下是对现状的客观审视与下一阶段的战略规划:
核心声明:在现阶段,我们不打算集成复杂的第三方库或付费插件。这意味着物理引擎缺失、高性能渲染管线缺失、复杂动画资产导入缺失等现状在短期内无法通过引入外部方案来解决。
相应的,二阶段的重点将全面转向对现有 Native 系统的“精雕细琢”:


使用Processing创意编程框架搭建一个三维场景编辑器一直是笔者的心愿,之前因为种种原因迟迟没有下决心去整合资源把完整的软件搭建出来,只是做了零散的工具和功能,现在借AI之力,一口气“零代码”氛围编程把这一心愿实现了!
其实最感谢的,应该是AI,确实非常强大,写了共18个.pde文件,合计6762行代码。

倘若依旧凭借自身的力量,估计会写个一个月,甚至更多,因为控制台终端、脚本系统和可视化编程系统从未接触。捣鼓Processing这类创意编程框架对我而言是人生一大乐事,在此基础上开发软件,真是妙哉妙哉,开心极了。。。甚至在人生目标角度考量,可谓“此生无憾”了。见笑了,各位大佬。
P3DE 的征程才刚刚开始。 坚信在原生态的土壤里,通过对每一行底层代码的极致雕琢,终能开出不逊于商业引擎的艺术之花。
Github 仓库地址: https://github.com/ShenyfZero9211/Processing_3d_editor
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。