av/safe-sand
多媒体与设计一个运行在手机浏览器里的 WebGL2 沙粒模拟器,倾斜、甩动、拖动和翻转手机都会得到对应的沙粒与声音反馈。
项目介绍
Safe Sand 在手机屏幕上铺一层模拟沙。倾斜手机时沙会滑动,猛地甩动时沙会滞后,手指拖动会犁出一道沟,把手机翻过去沙会洒落。适合想在浏览器里玩一个互动物理玩具的人;同一份代码也打包成了 Android 应用。
模拟在 GPU 上通过 WebGL2 运行,使用毫米和 9.81 m/s² 等真实单位。约 10 万到 46 万颗沙粒各自带有尺寸、矿物颜色和摩擦系数,因此孤立的沙粒会滚动、弹跳,而堆积的沙要等倾斜超过休止角才整体滑动。每帧根据沙粒生成高度场,提供坡度力、自阴影和环境光遮蔽;光照方向跟随手机倾斜。声音是颗粒合成,依据实际有多少沙在动来生成,静止时完全无声。设备变慢时画质会逐级下降,并记住上次选择(README)。
快速使用
先在手机上打开项目网页(打开模拟器)。在起始卡片上选择沙的类型和底层材质,点「Pour」,iOS 上还要允许运动访问。想要真全屏,iOS 可用分享菜单添加到主屏幕,Android 可安装应用。旋转手机不会旋转沙面,画面固定在玻璃上。
在本地运行不需要构建步骤,用 HTTP 服务该目录后打开浏览器即可:
python3 -m http.server 8000
桌面端用鼠标拖动推沙,方向键或 WASD 倾斜,按住空格摇晃。查询参数可以设置沙类型(sand=river|beach|desert|volcanic|coral)、屏幕主题、沙粒上限、密度、PPI、种子、加速度计反向(flip)和手动步进测试(README 开发段落)。
Android 应用
Android 版(io.github.av.sand)由 Capacitor 打包,额外加入 AdMob 广告、欧洲经济区同意表单,以及一次买断的 Sand Pro:移除广告并解锁 Desert、Volcanic 和 Coral;没有 Pro 时,看激励视频可解锁这些主题 24 小时。Android 构建需要 JDK 21、Android SDK 和 OpenGL ES 3.0,依次执行 npm ci、npm test、npm run sync,再在 android 目录运行 ./gradlew assembleDebug。发布签名和 Play 上传依赖文档列出的 CI 密钥,账号、广告和购买设置见发布检查清单(Capacitor)。
使用约束
- 仓库未声明许可证,能否再分发或复用代码尚不明确。
- 模拟需要 WebGL2;Android 应用还要求 OpenGL ES 3.0。
- iOS 上运动访问需要授权,静音开关会关闭声音。如果某台设备倾斜方向相反,可用
flip查询参数反转加速度计符号。 - 会话内触发的画质下调在该会话中不会恢复;下次访问记住的等级会比上次乐观一档。
- 网页版没有广告或内购,这些只存在于 Android 封装中。
HotRepo 点评
该项目在 2026-11-12 登上 HotRepo 新项目 JavaScript 榜,记录到 103 Star、12 Fork,约一小时的统计窗口内净增 3 Star。它没有全语言日榜的最佳名次记录,现有序列也太短,无法据此判断趋势。技术上值得注意的是:它在 GPU 上按真实单位逐颗模拟沙粒,并让阴影和颗粒声音都从同一份逐帧状态推导,因此倾斜和拖动时的反馈是连贯的,而不是脚本化的。
本文由 AI 根据项目 README 生成,更新于 ,以项目官方文档为准。