← 返回首页目录
# Snap 3D 功能需求探讨:社区对话与未来展望
## 核心概念
本文记录了 Snap! 论坛上关于是否应在 Snap! 编程语言中增加原生 3D 功能的一场深入讨论。讨论的核心围绕几个关键维度展开:2D 与 3D 编程环境的优劣比较、Snap! 当前技术栈(尤其是 WebGL 支持)的局限性、社区成员对 3D 编程的既有经验与困惑,以及通过 JavaScript 扩展实现 3D 功能的可能性。这场对话不仅反映了 Snap! 社区成员对三维编程的渴望,也揭示了在可视化编程环境中引入 3D 功能所面临的技术与教育双重挑战。
## 逻辑结构
本文按照论坛讨论的自然顺序展开,从最初的简单 3D 功能请求开始,逐步深入到技术可行性分析、替代方案探讨、社区协作尝试以及最终的学习建议。整个对话呈现出从需求提出、问题剖析、方案评估到行动倡议的完整思考链条,生动展现了开源社区中一项功能提议从萌芽到演进的典型路径。
---
## 正文
### 一、功能请求的提出与初步回应
2020年2月22日,一位名为 hekknyt 的 Snap! 论坛用户发布了一个极为简短的帖子,内容仅是一句直白的诉求:希望 Snap! 能够“添加 3D 功能”。这一简短请求迅速引发了社区的热烈回应,尤其是 Snap! 核心开发者之一、用户名为 bh 的重要成员的关注。
bh 首先对 3D 功能的需求提出了审慎的质疑,强调 Snap! 的设计哲学中有意保留了 2D 环境。他指出,2D 设计是 Scratch 项目(Snap! 的灵感来源之一)的明智决策之一。bh 解释说,对于普通用户而言,3D 编程存在极大的调试难度,他分享了一个令人印象深刻的实例:“我曾看到一个用户花了一个小时试图调试他的 Alice 程序,程序表面上什么都没做,最后才发现是摄像机方向弄错了,所有的动作其实都在镜头背后正常进行。”他强调,2D 环境的优势在于“你同一时间能看到所有东西”,这大大降低了入门门槛和调试成本。
同时,bh 提出了一个中肯的建议:如果确实需要 3D 功能,社区中已经有了许多基于 Scratch 的 3D 实现项目,或者可以尝试使用 BeetleBlocks 这类 3D 建模工具。他还提出,Snap! 支持 JavaScript 扩展,理论上完全可以由社区自行开发一个 3D 库,而不必将 3D 作为 Snap! 的原始内置功能。
### 二、请求者的个人经历与技术挫折
面对 bh 的建议,hekknyt 详细阐述了自己在 3D 编程领域的探索历程和挫折体验。他逐一评价了各种 3D 工具:尝试过 Alice 的两个版本,但认为“过于简单化”;使用过 BeetleBlocks,发现它“本质上只是用于 3D 建模,除此之外功能有限”;尝试过 UE4(虚幻引擎4),但认为它“太慢且过于复杂”;最终接触了 Unity,虽然能勉强运行,但他坦诚自己“完全是个初学者,什么都不理解,只是庆幸它能正常运转”。他甚至对 Godot 引擎添加一个简单立方体的操作也感到困惑。
更为关键的是,hekknyt 指出 Snap! 中已有的光线投射(raycaster)项目运行效果并不理想,他将此归因于 Snap! 所使用的 WebGL 版本存在问题。这一观察引发了 bh 的好奇,他请求 hekknyt 具体说明光线投射器在 Snap! 中“不工作”的具体表现。
### 三、JavaScript 原生 3D 的构想与社区回应
另一位名为 spaceelephant 的用户敏锐地指出了核心矛盾:虽然理论上 Snap! 支持 JavaScript,而 JavaScript 支持 OpenGL,但多数 Snap! 用户并不熟悉 JavaScript。因此,他认为开发一个用户友好的 3D 库或封装层比直接要求用户掌握底层图形编程更为现实。
bh 理解了这一需求后,表示支持 JavaScript 原生 3D 的构想,但他也坦诚地承认:“我完全不懂图形学。”他向社区发出号召,询问是否有成员愿意承担这一开发任务。hekknyt 虽然有尝试的意愿,但同样承认自己几乎没有 JavaScript 知识。另一位用户 donotforgetmycode_sn 则表示自己有一些 JavaScript 基础,但完全不了解 3D 图形编程。这一局面充分反映了社区在这一交叉领域的知识缺口。
### 四、技术困境的直面与学习决心的萌发
随着讨论的深入,hekknyt 于2月25日表示,他意识到自己需要学习 JavaScript,并决心投入到 3D 功能的开发中。他承诺将尽量保持这一扩展的 Snap!/Scratch 风格,并计划提供多种库来支持 VR、游戏控制器等设备。尽管深知困难重重,他还是认为这项工作对社区有价值。
这一决心得到了 bh 的积极鼓励和其他用户(如 venyanwarrior)的热情响应。venyanwarrior 表示,一个基于块的可视化 3D 编程语言将会“非常棒”,他甚至正因为这一讨论而考虑放弃 Godot 转向 Unity。
用户 wunder_wulfe 提出了一个技术建议:或许可以开发一个 WebGL 接口并将其加载到 Snap! 的画布上,然后设计相应的脚本块与之交互。这一建议指出了可行的技术路径,但与之相对的,hekknyt 在深入思考后也意识到了现实的困难:OpenGL/WebGL 对于初学者来说极其复杂,还需要设计块编程的交互方式,这需要更多的 JavaScript 知识,而将这一切部署到网站上更是重重困难。他风趣地感叹道:“哦,天哪,我为什么要答应做这件事?”
### 五、深入探讨:需求本质与中期解决方案
在对话接近尾声时,hekknyt 回应了 bh 早先关于“为什么需要 3D 作为原始功能”的提问。他坦率地承认:“我是一个 3D 领域的完全菜鸟,这就是全部原因。”这一真诚的回答让 bh 意识到,对于初学者而言,直接与复杂的 3D 引擎接口对接并非最佳路径。
bh 继而给出了一个富有建设性的建议:“与其尝试与 3D 软件包对接,我建议你学习一点解析几何和投影几何的基本知识,然后自己动手实现 3D 功能。”这一建议旨在引导 hekknyt 理解 3D 图形学的底层原理,而非依赖黑盒式的引擎,这种思路更符合 Snap! 作为教学工具的教育理念。
此时,另一位用户 dan_garcia 分享了自己在 Snap! 中开发的“柏拉图立体3D”项目,并邀请 hekknyt 以此为起点探索。hekknyt 对该项目给予了高度评价,认为它是 Snap! 中少见的能够正常运行的 3D 渲染作品,但同时也指出,这属于数学计算驱动的软件渲染路径,与讨论中设想的硬件加速 WebGL 方案仍有差异。
### 六、结语与后续展望
值得注意的是,Snap! 的图形渲染历来依赖于其自身的画布层(基于早期 HTML5 canvas 2D 技术),而对 WebGL 等现代浏览器 3D API 的支持并非原生目标。社区讨论中提出的“WebGL 库”构想,实际上需要大量定制 JavaScript 代码,并可能绕过 Snap! 的沙盒机制,这引发了关于安全性和跨浏览器兼容性的深层技术考量。此外,Snap! 的历史可追溯至加州大学伯克利分校的“构建你自己的块”(BYOB)项目,其专注于算法思维、数据抽象和递归的教学定位,使得开发者们长期将精力集中于丰富这些核心教育功能,而非重写渲染引擎。这种教育导向的取舍,使得 3D 特性在官方路线图中始终未见明显优先级。
虽然该帖子未能立即带来 Snap! 原生 3D 功能的实现,但它催化了社区成员深入学习 JavaScript 和 3D 图形学的决心,也为后续潜在的自定义扩展项目播下了种子。
### 核心洞见
这场讨论以极具代表性的方式呈现了一个核心教育问题:在可视化编程工具中引入 3D 功能,应取“易用性”而舍“灵活性”,还是反之?Snap! 团队与社区更倾向于前者,认为 2D 环境的即时可见性对教学至关重要。这种取舍反映了 Snap! 作为教育工具的根本定位——它优先服务于逻辑思维训练,而非游戏引擎式的沉浸体验。同时,社区也普遍认识到,任何 3D 库的开发都应包括对用户的资源链接教育(如经典游戏《毁灭战士》使用的 BSP 树技术、现代游戏中的 Z-buffer 缓冲算法等),将强大的底层特性转化为可视化块,才能真正降低学习门槛。这场关于 3D 的讨论,本质上是对可视化编程教育边界的一次深入探索,其价值在于促使我们思考:如何在不牺牲教育目标的前提下,赋予学习者更丰富的表达维度。
---
*本文基于 Snap! 论坛“Snap 3D Feature Requests”讨论帖整理而成,保留了原作者们的核心观点与技术探讨路径。*