「safe-sand」プロジェクトは、WebGL2を使用して、10万から46万の個々の砂粒をモバイルデバイスの画面上で直接シミュレートします。サイズをミリメートル、重力を9.81 m/s²とするなど、現実世界の単位で物理演算を行うことで、砂の動きの速度や遅延が物理的な現実に一致するように設計されています。

物理演算と視覚的レンダリング

シミュレーション内の各粒子は、特定の物理的特性を持つ個別のエンティティとして扱われます。孤立した粒子は転がったり跳ねたりするようにプログラムされており、バルクの砂は、デバイスの傾きが砂の特定の安息角を超えない限り、互いにくっついて凝集した塊として振る舞います。

視覚的な奥行きを実現するために、システムは毎フレーム粒子から高さフィールドを構築します。このフィールドは傾斜力とアンビエントオクルージョンに必要なデータを提供し、光の方向は電話の傾きと同期されるため、ユーザーがデバイスを動かすと影が伸び、石英の粒子が輝きます。

「約10万〜46万の個々の粒子が、現実の単位(ミリメートル、9.81 m/s²)でGPU(WebGL2)上でシミュレートされているため、砂の移動速度や遅延の度合いが本物と一致します。」

— 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のスレッドで出た意見の要約です。事実として検証されたものではありません。 議論の全文を読む ↗