“safe-sand”项目利用 WebGL2 直接在移动设备屏幕上模拟 100,000 到 460,000 颗独立的沙粒。通过使用真实世界的单位来计算物理效果——例如毫米作为尺寸,9.81 m/s² 作为重力——该模拟确保了沙子移动的速度和延迟与物理现实相匹配。

物理与视觉渲染

模拟中的每颗沙粒都被视为具有特定物理属性的独立实体。孤立的沙粒被编程为滚动和滑行,而大量的沙子则表现为凝聚的质量,直到设备的倾斜角度超过沙子的特定安息角才会发生移动。

为了实现视觉深度,系统每帧从沙粒中构建一个高度场。该字段提供了坡度力和环境光遮蔽所需的数据,同时光照方向与手机的倾斜同步,导致用户移动设备时阴影变长,石英颗粒闪烁。

“大约 100k–460k 颗独立沙粒在 GPU (WebGL2) 上以真实单位(毫米,9.81 m/s²)进行模拟,因此沙子移动的速度和延迟与真实情况相匹配。”

— GitHub - av/safe-sand: Hyper-realistic sand on your phone screen (WebGL2)

合成颗粒音频

该项目并非使用预录制的采样,而是根据沙子的运动合成颗粒音频。它每秒在 2–8 kHz 范围内生成数千个微小的共振点击声来模拟滑动沙子,同时使用稀疏的低频点击声来模拟卵石,并使用更明亮的撞击声来模拟倾倒动作。

该系统旨在追求精确;当没有沙子移动时,音频输出完全静音。声音还会与设备上正在播放的任何音乐混合,iPhone 上的静音开关也会静音输出。

性能缩放与限制

为了确保模拟在各种硬件上都能流畅运行,应用程序会监控帧率。如果浏览器限制了帧率(例如在 iOS 低电量模式下),应用程序会先渲染空闲帧以验证限制,然后再降低质量。

如果检测到真实的性能过载,应用程序将逐步降低设备像素比(从 3 到 2 再到 1.5),随后减少沙粒数量。这些质量设置将被记录以供下次访问使用,系统每次都会尝试稍微乐观一点的设置。

Hacker News 读者的反应

  • 技术补充: 一位评论者指出模拟缺乏真实的动量,观察到沙子停止得太突然且下落太快。 评论 ↗
  • 技术补充: 另一位用户对真实性表示怀疑,指出沙子似乎卡在空中,且石头未能旋转。 评论 ↗
  • 技术补充: 一位评论者报告在移动浏览器上遇到技术问题,动画变得扭曲且沙子完全消失。 评论 ↗

以上为 Hacker News 讨论中观点的摘要,并非经过核实的事实。 阅读完整讨论 ↗