
什么是 WonderSnap?
WonderSnap 是一款基于浏览器的 3D 体验,可将程序化模型转化为由 GPU 驱动、最多包含 250,000 个粒子的发光云团。你可以打响手指召唤粒子,将它们组成地标或解剖结构,用手旋转模型,并将组件展开为带标签的爆炸视图。
该应用结合了设备端手部追踪、自定义手势识别、程序化模型以及手写的 WebGL2 渲染器。它不使用 Three.js、游戏引擎或前端框架。摄像头视频会保留在你的设备上,不会发送到服务器。
摄像头为可选设备。所有必要的交互也都可以通过屏幕控件、键盘和鼠标完成。
主要功能
- GPU 粒子渲染:粒子物理通过 WebGL2 transform feedback 运行,支持最多 250,000 个粒子。
- 设备端手部追踪:MediaPipe Hand Landmarker 最多可追踪两只手,每只手包含 21 个关键点。
- 手势识别:自定义分类器可识别打响手指、握拳、张开手掌、指向、捏合、V 字手势、手部旋转和双手缩放。
- 33 个程序化模型:模型集合涵盖地标、解剖结构、生物学、发动机、车辆和机械设备。
- 交互式部件:命名组件可以发光、分离为爆炸视图、显示标签,并可拉出以便近距离查看。
- 动画解剖结构:心脏以每分钟 72 次的速度跳动,肺部则以 4.5 秒为一个周期呼吸。
- 教育工具:测验模式会要求你识别部件,同时提供描述和语音功能进行讲解。
- 语音控制:Chrome 和 Edge 可以处理 show me the heart、zoom in 和 quiz 等指令。
- 剖切与录制:你可以显示发光的剖面,并将场景保存为 WebM 视频。
运行要求
安装 WonderSnap 前,请确认你具备以下条件:
- Node.js 18 或更高版本。
- Chrome 或 Edge,以获得文档所述的浏览器体验。
- 如果需要使用手势控制,则需要摄像头。
- 支持 WebGL2 的浏览器和设备。
摄像头必须通过 localhost 或 HTTPS 地址访问。不要通过双击 index.html 启动应用,而应使用随附的本地服务器。
安装并启动 WonderSnap
1. 克隆代码仓库
git clone https://github.com/AkbarSheikh-debug/wondersnap.git
cd wondersnap2. 安装依赖
npm install此步骤还会让手部追踪运行时可从 node_modules 中使用。如果 MediaPipe 始终无法加载,请确认安装已成功完成。
3. 启动本地服务器
npm start在 Chrome 或 Edge 中打开 http://localhost:5173。选择 Start with camera 以启用手部追踪,或选择 Continue without camera,使用鼠标、键盘和屏幕控件。
4. 必要时使用其他端口
如果端口 5173 已被占用,请在启动命令中传入其他端口:
npm start -- 8080然后你可以打开 http://localhost:8080。
基本手势操作流程
授予摄像头访问权限后,将手放在摄像头能够清晰看到的位置。典型的交互流程如下:
- 打响手指以召唤粒子。再次打响手指会溶解当前模型。
- 握拳以形成选中的奇观、器官、车辆、发动机或机械设备。
- 抬起、扭转或倾斜手部以旋转和倾斜已形成的模型。
- 张开手掌将奇观切换到下一个模型。对于器官、发动机和车辆,张开手掌可以控制部件向外爆炸的程度;合拢手掌则会使它们重新组合。
- 指向某个部件并将手指停留在其上方以选中它。该部件会发光,信息卡会介绍其作用。
- 捏合以将选中的部件拉向自己。再次捏合可将其放回原处。
- 使用双手并改变两手之间的距离,以放大或缩小视图。
- 做出 V 字手势以跳转到下一个模型。
使用键盘和鼠标
如果没有摄像头,或希望进行更精确的控制,可以使用键盘和鼠标。点击部件即可选中它,拖动场景即可旋转视图。
空格:模拟打响指。F、O和V:触发握拳、张开手掌和胜利手势动作。左箭头和右箭头:选择上一个或下一个模型。E、上箭头、下箭头或鼠标滚轮:调整爆炸视图。+、-和0:改变或重置缩放。也可以按住 Control 并使用鼠标滚轮。C:打开或关闭摄像头。L:切换部件标签。R:切换自动旋转。G:启用或禁用基于手势的旋转。X:启用剖切横截面。使用,和.微调切割平面。Q:开始测验模式。M:使用语音命令和朗读功能。K:录制视频。D:播放内置演示。I:描述所选部件。Esc:取消选择当前部件。H:显示帮助。
探索模型集合
WonderSnap 包含 33 个根据真实测量数据生成的程序化模型,分为六组:
- 奇观:十一处地标,包括埃菲尔铁塔、吉萨大金字塔、泰姬陵、大本钟和悉尼歌剧院。
- 人体解剖:十个模型,包括大脑、跳动的心脏、呼吸中的肺、骨骼和分层人体。
- 生物学:一条可以解链的 DNA 双螺旋和一个动物细胞。
- 发动机:直列四缸发动机、机械增压 HEMI V8、涡扇喷气发动机和九缸星型发动机。
- 交通工具:跑车、摩托车、客机和可分级分离的土星 V 号。
- 机械:机械腕表,以及包含电芯、汇流排、冷却系统和电池管理系统的电动汽车电池组。
使用教育功能
检查带标签的部件
将指针移到组件上或点击组件即可选择它。选中的部件会发光,其卡片会解释其功能。按 L 启用标签,显示连接名称与各个部件的引导线。
开始测验
按 Q 进入测验模式。WonderSnap 会显示类似 查找:海马体 的提示。将指针移到或点击所要求的组件。每次测验包含五道题,并会生成分数。
通过语音控制场景
按 M 使用语音命令和朗读功能。支持的示例包括 show me the heart、open it up、where is the right atrium、zoom in 和 quiz。语音合成功能已针对 Chrome 和 Edge 编写说明。
创建剖切视图
按 X 启用剖切视图。切割平面可以跟随手部移动,并显示发光的横截面。没有手势输入时,使用 , 和 . 逐步移动平面。
录制结果
按 K 录制场景,并将其保存为 WebM 视频。
使用 URL 选项配置 WonderSnap
查询字符串选项可以改变启动行为并调整渲染设置,无需编辑源文件。
?n=250000:设置粒子数量。?model=12:从指定的模型编号开始。?autostart=camera:跳过开始界面并请求摄像头模式。?autostart=nocamera:跳过开始界面并在不使用摄像头的情况下运行。?trails=0:禁用粒子轨迹。?dpr=1:将设备像素比强制设为 1,可帮助较慢的 GPU 提升性能。
选项可以组合使用。例如,以下地址会在不使用摄像头的情况下启动,使用 100,000 个粒子,将设备像素比设为 1,并禁用轨迹:
http://localhost:5173/?autostart=nocamera&n=100000&dpr=1&trails=0高级提示
提升较慢硬件上的性能
粒子数量和设备像素比会直接影响渲染负载。首先使用 README 推荐的低帧率配置:
http://localhost:5173/?n=100000&dpr=1如有需要,还可以添加 trails=0 来关闭粒子轨迹。
使用确定性的启动链接
如需演示或进行可重复测试,请将 model 与 autostart 模式结合使用。这样每次都无需手动浏览开始界面和模型列表。
了解应用架构
主渲染循环、拾取、缩放、爆炸视图、标签、测验、剖切和演示行为都位于 src/app.js 中。摄像头和 MediaPipe 集成位于 src/hands.js 中,而语音控制、朗读支持和录制功能则实现在 src/features.js 中。
src/gl/ 目录包含 WebGL2 着色器和变换反馈渲染器。手势逻辑、状态机、控制器以及粒子物理的 CPU 等效实现位于 src/logic/ 中。程序化几何工具位于 src/lib/ 下,模型定义则归类在 src/models/ 中。
运行测试套件
WonderSnap 包含使用 Playwright 构建的 36 个端到端测试和单元测试。这些测试使用模拟手部和确定性时钟驱动真实应用。
首次使用时安装 Playwright 的 Chromium 浏览器:
npx playwright install chromium然后运行测试:
npm test该套件涵盖完整的手势流程、每个模型、爆炸视图、键盘和鼠标滚轮控制、响应式布局、心跳和呼吸动画、双手缩放、部件选择、捏合交互、测验、语音命令、剖切模式、录制、摄像头回退行为、姿态分类器、状态转换、程序化模型有效性以及 GPU 物理效果。GPU 着色器还会与其 CPU 对应实现进行比较,在每种模式下的误差约为 1e-7。
故障排除
- 摄像头无法启动:请通过
http://localhost:5173打开应用,而不要直接打开index.html,并在提示时授予摄像头权限。 - 手部追踪无法加载:运行
npm install。追踪运行时从node_modules提供。 - 帧率较低:尝试访问
http://localhost:5173/?n=100000&dpr=1。 - 端口 5173 已被占用:运行
npm start -- 8080,然后打开http://localhost:8080。
结论
WonderSnap 展示了设备端手部追踪、自定义手势分类器、程序化建模和 GPU 粒子物理如何完全在浏览器中打造交互式教育体验。先完成标准本地设置,熟悉打响指、握拳、张开手掌、指向和捏合交互,然后探索 URL 调节、语音控制、测验、剖面、录制以及自动化测试套件。
