P3DE (Processing 3D Editor)

1. 软件工程概要 (Engineering Overview)
1.1 项目愿景与定位
P3DE(Processing 3D Editor)是一款诞生于追求"极致原生"与"高度集成"理念下的轻量级 3D 内容创作引擎及编辑器。在当前 3D 开发领域深陷重型引擎(如 Unity, Unreal)与庞杂第三方库包围的现状下,P3DE 另辟蹊径,试图证明在 Processing 这一极简的 Java 艺术编程框架下,依然可以构建出具备工业级交互体验、高性能 PBR 渲染以及可视化逻辑编辑能力的闭环工具链。
再者,在当下AI Coding日益强大的环境下,该项目可以极好的给AI和开发者提供源码参考,为日后搭建三维可视化逻辑编程工具打下坚实的基础。未来人人都能以极小的代价来定制化工具或软件。
- 开发者: SharpEye (产品愿景/UX交互) & Antigravity (核心架构/渲染算法)
- 当前版本: v0.4.8
- 核心理念: 原生态构建一切 (Native Everything)
- Github 仓库地址 : https://github.com/ShenyfZero9211/Processing_3d_editor
1.2 "原生态"的技术操守
本项目最显著的特征------也是我们最为自豪的技术底线------是全过程未引用任何第三方插件或外部 Jar 包库。
在 Processing 的生态中,为了实现 3D 操纵、UI 界面或脚本执行,通常的惯例是依赖 ControlP5、PeasyCam 或 Rhino 等成熟库。然而,P3DE 选择了一条更为艰难但纯粹的道路:
- 自研 3D 操纵系统 (Gizmo):基于纯向量数学和射线检测(Raycasting)实现物体的抓取与轴向变换,不依赖任何第三方相机控制插件。
- 原生 UI 渲染管线:所有的层级树、属性面板、浮动菜单及蓝图节点界面,均通过 Processing 的基本绘图指令(rect, line, text)逐像素绘制。这确保了 UI 系统与 3D 视口在渲染管线上的完美解耦与深度定制。
- 零依赖脚本解释器 (P3DES):自建线性指令解析器与上下文管理系统,支持异步执行与变量插值,无需集成 Javascript 或 Python 运行环境。
- 原生态 PBR 着色器:直接在 GLSL 层级编写 Cook-Torrance BRDF 数学模型,绕过所有预设材质库,直达显卡底层。
- 内置全功能控制台 (Terminal) :自研具备语义分析、等级日志过滤与历史回溯能力的 shell 终端。不仅支持 P3DEC 命令实时执行,还具备
init.p3dec自动化批处理能力。 - 可视化转译引擎 (Blueprint Transpiler):完全自主开发的图形节点解析算法,能够将复杂的非线性节点拓扑结构,实时转译为可执行的 P3DES 逻辑码。支持脚本热重载 (Hot-Reload) 与动态上下文变量绑定。
1.3 开发一致性与便携性
由于坚持了"零依赖"策略,P3DE 展现出了极佳的工程一致性。用户下载代码后,无需进行任何复杂的环境配置或库安装,即可直接在标准的 Processing IDE 中编译运行。
这种"单文件夹即工程"的模式,不仅极大地降低了原型开发的门槛,更使得项目具备了天然的可移植性。无论是作为教学案例研究 3D 引擎底层原理,还是作为轻量级交互装置的开发平台,P3DE 都能提供即开即用的卓越体验。所有的代码逻辑分布在清晰的 PDE 选项卡中,开发者可以像阅读普通 Processing 脚本一样,深入洞察从射线拾取到蓝图转译的每一行核心细节。
1.4 协作模式:Vision + Implementation
本项目的诞生得益于 SharpEye[笔者] 与 Antigravity[Google AI Coding] 的深度协同。SharpEye 策划了产品的顶层蓝图,坚持以"UE5 级操作体验"为 UX 标杆,从层级树的交互逻辑到蓝图节点的布局美学均提供了精准的方向。Antigravity 则通过严密的工程实践,将复杂的数学公式固化为高效的 PDE 脚本,确保了在高保真渲染环境下依然保持流畅的编辑帧率。
P3DE v0.4.8 不仅仅是一个工具,它更是一次针对"原生开发极限"的技术告白:在有限的框架内,通过纯粹的逻辑力量,构建一个无限可能的 3D 创作世界。
2. 核心功能 (Core feature)
本项目的功能构建遵循"自下而上"的原则,从基础的 3D 数学库到顶层的可视化编辑器,每一层均提供了丰富的特性以支持复杂的创作需求。
2.1 3D 核心与交互驱动 (The Interaction Engine)
- 深度定制的 Gizmo 系统:实现了全套平移 (Translate)、旋转 (Rotate) 和缩放 (Scale) 操纵器。支持"世界坐标系"与"局部坐标系"的实时切换(快捷键 L),即使在极端倾斜的状态下也能实现基于物体自身轴向的微调。
- 层级管理树 (Hierarchy Tree):支持无限深度的父子连子变换,模仿商业引擎的"场景图"逻辑,整合了右键上下文菜单,支持快速克隆、解绑与隐藏。
- 撤回重做 (Undo/Redo System):基于命令模式 (Command Pattern) 构建,记录每一次 Transform、材质属性及层级结构的重构。
- 对齐与精度控制 (Snapping):内置基于 10 单位步长的整格对齐开关(快捷键 G),确保模块化拼接的精准。

2.2 物理级高保真渲染 (High-Fidelity PBR Pipe)
- GGX Cook-Torrance BRDF:底层实现了完整的微平面理论,能够精准模拟金属度 (Metallic) 与粗糙度 (Roughness) 对光影的影响。
- IBL (Image Based Lighting) 系统:支持 360 度环境图加载,通过预计算采样实现"所见即所得"的全球照明氛围。
- 材质属性面板 (Material Inspector):集成了拾色器、纹理通道控制与步进式数值调节(Steppers),提供专业材质编辑体验。
2.3 视觉逻辑蓝图 (Visual Logic Blueprint - VLB)
- 双模所有权架构:蓝图支持挂载在"实体 (Entity)"或"关卡 (Level Blueprint)"上,实现对象行为与全局控制的深度绑定。
- 全方位的节点库:包含生命周期事件、交互事件、动作执行以及 Math Expression 等高级逻辑节点。
- 实时调试与监测:在 PlayMode 下,节点下方会动态显示变量分布,实现"边跑边调"。

2.4 脚本引擎与自动化逻辑 (P3DEC/P3DES System)
- P3DEC (Direct Execution Console):提供类似于专业 3D 软件的指令执行体验,支持别名 (Alias) 系统。
- P3DES (The Script Brain) :轻量级异步脚本语言,核心通过
wait指令实现在单线程环境下的非阻塞时间控制。 - init.p3dec 自动化流程:项目启动时自动执行初始化脚本,预加载全局环境变量。

2.5 构建、导出与独立运行程序 (Standalone Deployment)
- 一键资产烹饪 (Asset Cooking):导出阶段自动识别并打包所有场景依赖的图像与模型资产。
- Standalone Player 架构:将场景与逻辑封装为标准的 Processing 工程,实现无编辑器、零门槛的独立分发。
3. P3DE 系统架构与类关系图 (Architecture Diagrams)
3.1 系统层级架构 (System Level Architecture)
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
3.2 核心类关系图 (Class Relationship Diagram)
以下展示了 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
3.3 核心大类简要说明 (Component Brief)
| 组件名称 | 核心职责 | 关键细节 |
|---|---|---|
| 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 别名映射及日志流的持久化存储。 |
3.4 工程 PDE 文件地图 (Project File Map)
P3DE 共有 18 个核心 .pde 文件,按功能职责划分为以下六大模块。
3.4.1 功能模块划分
- 入口与中枢 (Entry & Core) :
p3deditor.pde: 主程序入口,处理setup()、draw()及全局事件分发。SceneManager.pde: 核心管理器,维护实体列表、撤回重做队列及存档读写。
- UI 与视图 (UI & View) :
UIManager.pde: 全局 UI 渲染与交互(层级树、属性面板、菜单栏)。BlueprintEditor.pde: 蓝图逻辑编辑器的交互画布。DebugConsole.pde: 系统控制台终端的视窗渲染。
- 3D 交互与渲染 (3D & Render) :
Entity.pde: 基础 3D 实体类。Material.pde: PBR 材质数据模型。Gizmo.pde: 视口三轴平移/旋转/缩放操纵器。Raycast.pde: 射线拾取与碰撞检测数学库。EditorCamera.pde: 摄像机轨道旋转与缩放逻辑。
- 脚本与逻辑内核 (Logic & Scripting) :
ScriptEngine.pde: P3DES 异步非阻塞执行内核。CommandInterpreter.pde: P3DEC 指令解析与分发引擎。Command.pde: Undo/Redo 模式的原子指令定义。
- 可视化逻辑 (Blueprint) :
Blueprint.pde: 蓝图数据结构(节点、针脚、连接)。VLBNode.pde: 蓝图节点基类与转译逻辑。VLBNodeLibrary.pde: 预设节点类型定义工厂。
- 网络与分发 (Export & Net) :
OSCClient.pde: OSC 网络数据广播。Exporter.pde: 独立程序打包与资源路径 Cook 引擎。
3.4.2 文件依赖关系图 (File Dependency Map)
该图展示了工程中全部 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
3. 核心架构解析 (Core Architecture)
P3DE 的架构设计旨在解决 Processing 原生环境下的两个核心痛点:大规模对象管理 与顺序执行流的非阻塞解耦。以下是四大核心模块的底层技术实现:
3.1 以 SceneManager 为中枢的集中化模型 (Central Nervous System)
在传统 Processing 开发中,程序员往往需要维护大量的全局变量。P3DE 引入了 SceneManager 作为底层骨干。
- 状态快照 (Snapshot/Restore) :点击
Play键时,SceneManager会对场景内所有实体的 Transform、材质及运行状态进行深度拷贝。当点击Stop时,系统会瞬间销毁当前动态场景,并根据快照完美复原。这一机制彻底解决了运行中途修改物体位置后无法"一键归位"的难题。 - UI 与数据的强解耦 :所有的 UI 交互(通过
UIManager)并不直接修改底层像素,而是通过SceneManager提供的 API 发送变更指令。这种"单向数据流"模式使得系统天然支持撤销、重做操作以及未来可能的网络参数同步。
3.2 蓝图转译引擎:图形拓扑至线性指令的映射 (Transpiler Logic)
VLB 蓝图系统本质上是一个图形依赖转译器。
- DFS 遍历与排序 :当用户点击"Build & Run"时,转译引擎会从任何一个
Event节点(如 OnStart)开始,利用深度优先搜索 (DFS) 算法遍历整个连通图。系统会自动识别数据依赖(例如:位置计算节点必须在设置位置节点之前执行),并将非线性的节点结构"摊平"为线性指令序列。 - 中间语言 PDES :转译后的结果并不是复杂的 Java 代码,而是 P3DE 自研的线性指令(如
move_to,wait,set_col)。这种"指令化"设计确保了蓝图逻辑可以被脚本引擎秒级读取并热重载 (Hot-Reload),无需重新编译 Java 类。 - 动态变量桥接 (Live Debugging):转译器在生成代码的同时,会建立一个"节点 ID -> 脚本变量名"的映射表。这使得系统在播放模式下能实时回传变量数值,并在蓝图界面对应的节点下方显示红色气泡,实现了"逻辑流可视化"。
3.3 控制台终端与解析内核 (Command Shell & Parser)
P3DE 的终端不仅是一个日志查看器,它是一个具备指令感知的 Command Shell。
- 分词器 (Tokenization) :基于正则匹配的自定义解析器,能够完美处理带引号的参数(如
spawn "Box with Spaces")逻辑。 - Alias 递归展开 :支持别名嵌套。当终端接收到指令时,解析引擎会递归查询别名映射表。例如,若
c指向spawn cube,那么输入c; tp $this 0 0 0会被正确展开为两条原子指令。 - 历史记录与回溯:采用环形缓冲区存储历史命令,支持上下方向键呼出,大幅提升了开发过程中的调试效率。
3.4 异步脚本引擎 (Async Time-Slicing Engine)
这是整个编辑器"动态感"的来源,它巧妙地绕过了 Processing 的单线程性能陷阱。
- 非阻塞时间切片 :脚本引擎在每个
draw()帧循环末尾,会检查当前脚本列表的waitTime时间戳。只有当系统时间超过等待戳时,才会执行下一行脚本。这种"伪同步"写法让复杂的动画时序(例如:延迟 2 秒开门)可以通过极其直观的顺序代码实现。 - **上下文变量替换 ( Context)** :脚本系统通过一个动态变量查找表(Lookup Table),将实体的 Java 属性映射为脚本层的 `px
,$py` 等符号,实现了脚本语言对 Java 对象的无缝读写。
3.5 PBR 渲染底层的 Uniforms 注入 (Shader Pipeline)
采用动态 Uniforms 数组打包场景内所有的点光源数据。在每一帧渲染前,实体会强制刷新其关联材质的插值状态,确保 IBL 环境光强度与材质反射属性在 Shader 显存中始终保持同步同步。
4. 深度使用技巧 (Usage Tips)
4.1 键盘主权:专家级快捷键工作流
熟练使用快捷键能让你的创作效率提升 3-5 倍:
- 变换模式快捷键 :
1: 选择模式 (Select)2: 移动模式 (Translate)3: 旋转模式 (Rotate)4: 缩放模式 (Scale)
- 精准控制 :
- G (Snap):一键锁定/解锁 10 单位网格步进。这对构建模块化建筑(如拼接走廊)至关重要。
- L (Local/World):切换坐标空间。即使物体已经发生任意角度倾斜,在 Local 模式下你依然可以沿其"自身轴向"进行平移或拉伸。
- 界面管理 :
- Tab: 隐藏所有 UI 面板,专注于 3D 构图。
- ` (Backtick): 呼出全屏控制台,进行高级调试或批量指令输入。
4.2 脚本进阶:让自动化为你服务
-
自定义常用宏 (Alias) :
可以在data/init.p3dec中预设你的常用操作。例如:
alias reset tp $this 0 0 0; rot $this 0 0 0
之后只需输入reset即可将选中的物体归位。 -
示例 1:动态昼夜环境过渡 (Atmosphere Shift) :
通过脚本平滑调节全局背景色与光照强度,营造时间流逝感:bash# 从深蓝渐变至橙红 bg 20 20 50 light_intensity $this 0.2 wait 3000 bg 255 150 50 light_intensity $this 5.0 -
示例 2:程序化阵列生成 (Procedural Spawning) :
利用循环与变量,一键生成圆周排列的实体:bashalias 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 个方块)
4.3 蓝图设计模式 (Blueprint Paradigms)
-
底层转译机制:从节点到指令 (Transpilation Example) :
理解蓝图是如何变成脚本的,有助于优化逻辑设计。假设你构建了一个简单的"点击变色并移动"逻辑:
蓝图流 (VLB Graph) :
onClick->Set Color (Red)->Wait (1000ms)->MoveTo (100, 0, 0)转译出的 P3DES 脚本:
bash# 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中,保持蓝图主干的条理性。
4.4 资源管理进阶:父子层级结构
- Group 思想 :
如果你要构建一个复杂的机械臂,先创建一个空的Group节点作为底座,然后将各个关节分层级挂载。这样你只需要控制底座的移动,整个复杂的层级树都会根据矩阵变换自动跟随,大大简化了运动学控制。 - 实时同步 :
在 Hierarchy 面板中,利用拖拽操作实现实体的父子绑定。这种视觉化的操作比在脚本中手动管理坐标关系要精准且直观得多。
5. 功能不足与二阶段规划 (Gap Analysis & Roadmap)
虽然 v0.4.8 版本已经建立了一个稳固的 3D 创作框架,但作为一个进化中的实验性项目,P3DE 仍有巨大的成长空间。以下是对现状的客观审视与下一阶段的战略规划:
5.1 当前技术瓶颈 (The Gaps)
- 脚本指令集深度不足:目前的脚本系统命令库相对单一,对于复杂的场景变换控制尚显吃力,需要进一步丰富原子指令,使用户能以更轻松、更自由的方式驱动视口和变换逻辑。
- 蓝图节点生态匮乏 :
- 节点多元性:现有的节点库规模较小,高级逻辑处理节点不足。
- 底层功能缺失:蓝图底层亟待完善,如:用户自定义变量(Local Variables)、宏(Macros)定义、蓝图打包与子蓝图(Sub-Blueprints)编辑、节点批量复制粘贴等功能。
- 打包系统尚未闭环:目前的 Standalone Exporter 仅搭建了基础框架,生成的工程目录尚无法作为独立项目真正运行(目前仅能做概念演示)。
- 材质渲染质量待优化 :
- PBR 精度:目前的 PBR 渲染管线主要侧重于"模拟效果",离物理真实的理想状态仍有很大差距。
- 渲染错误:全景贴图的叠加渲染在大背景环境下仍存在恶性渲染错误(Artifacts),导致视觉一致性受损。
- 场景资源管理系统缺失:目前缺乏统一的资产浏览器。脚本文件、模型文件、贴图文件、文本文件等散落在不同目录下,无法在编辑器内实现一站式的预览、分类与引用管理。
- 物理与动画代差:由于坚持原生态开发,目前在物理实时仿真、重力模拟以及复杂骨骼动画资产的解析上依然存在显著的技术缺口。
5.2 二阶段路线图:向完美体系迈进 (Phase 2 Roadmap)
核心声明:在现阶段,我们不打算集成复杂的第三方库或付费插件。这意味着物理引擎缺失、高性能渲染管线缺失、复杂动画资产导入缺失等现状在短期内无法通过引入外部方案来解决。
相应的,二阶段的重点将全面转向对现有 Native 系统的"精雕细琢":
- 脚本系统完善:大幅扩充指令集,让场景变换控制更轻松、更自由。
- 蓝图系统完善:实现自定义变量、宏定义、子蓝图封装及节点复用逻辑,让控制更得心应手。
- 打包系统完善:打通 Exporter 的最后每一公里,实现真正可运行的独立工程导出。
- 材质系统完善:深研 GLSL PBR 模型,修复全景图叠加错误,提升渲染真实度。
- 场景资源管理完善:构建统一的资源管理系统,实现对脚本、模型、贴图、文本等文件的全流程管控。


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

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