
2026/04/09 21:01
**拡張頂点ブロック降下法の WebGPU 実装**
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
文書は、Giles et al.(2025)で概説された剛体およびソフトボディダイナミクスのための拡張頂点ブロック降下法(AVBD)ソルバーを実装した実験的な WebGPU 物理プロトタイプについて記述しています。現在は Chrome のみで動作し、プラグアンドプレイモジュールではなく概念実証として機能します。
各タイムステップでエンジンは LBVH(
GPULBVHBuilder.ts)を用いて衝突候補を構築し、その後ノーリーフェーズの接触面を生成し、摩擦のウォームスタートに必要な接触ごとの状態を保持します。これらの接触(ジョイントとスプリングを含む)から各ボディの制約リストが avbdState.ts で収集されます。ボディは隣接する二つのボディが同じ色を共有しないように貪欲にカラーリングされ、これにより並列一次更新が可能になります。
慣性ターゲットは α/γ スケーリングを使用して計算され、その後 AVBD 反復で各カラーグループ内のすべてのボディの速度が解かれます。各スイープの後、デュアル変数(ラグランジュ乗数)と剛性は増分ラグランジュ/剛性リャップ規則に従って並列に更新され、最終的な速度は更新された状態から再構築されます。
プロトタイプは論文のダブルバッファ位置更新をインプレースカラー解法で置き換えています。オプションのランタイム機能(スリープ処理と診断)は現在
PhysicsEngine.ts で調整されています。将来的な作業では、より広範なプラットフォームサポート、プラグアンドプレイモジュール、同一カラーのボディ間の衝突解決の改善、およびスリープ/診断機能の拡充が目指されています。
成熟すれば、この技術は高精度で GPU アクセラレーションされた物理演算を直接ウェブブラウザに導入でき、ゲーム開発者、シミュレーションツール、およびリアルタイムダイナミクスをブラウザ環境で必要とするあらゆる業界に利益をもたらす可能性があります。
本文
ライブデモ
webphysics-teaser.mp4
本プロジェクトは、AVBD(Augmented Vertex Block Descent)スタイル(Giles ら, 2025 年)のソルバーを中心にした WebGPU を利用した剛体/柔らかい体物理学の実験的プロトタイプです。
私は高度なウェブグラフィックスをオープンソースで試作することが好きなので、同様のプロジェクトをご覧になりたい場合はぜひ私の活動を応援してください。
セットアップ
本番用ビルド:
注意: まだ即時実行できるモジュールではなく、ブラウザ対応も Chrome のみ(現状)で限定的です。これは初期概念実証にすぎません。
AVBD パイプライン
現在の剛体パイプラインは、AVBD 論文のアルゴリズム 1 の構造を踏襲しています。
- 衝突検出
- 色付け
- 慣性/原始初期化
- 反復的な色付き原始解法
- 双対更新
- 速度の最終化
参照論文: Augmented Vertex Block Descent(Giles 等, 2025)。
現状態 (x^t) からの衝突検出
論文では各タイムステップは、ソルバー反復を開始する前に現在位置から衝突検出を行うと述べています。このコードベースでは
src/physics/PhysicsEngine.ts のメインサブステップ調整で始まり、広域フェーズ・狭域フェーズへ流れます。
広域フェーズ候補生成
論文のセクション 4 で述べられているように、まず LBVH を構築し走査して候補体対を取得します。
コード:
src/physics/gpu/broadPhase.tssrc/lvbh/GPULBVHBuilder.ts
狭域フェーズの接触生成とウォームスタート永続化
候補ペアが存在すると、離散的な狭域フェーズで接触を生成し、ウォームスタートや摩擦処理に使用する per‑contact 状態を保持します。これは論文のセクション 3.3, 3.7, 4 に対応しています。
コード:
src/physics/gpu/contactGeneration.tssrc/physics/gpu/contactRecord.ts
body 毎の制約リスト構築
アルゴリズム 1 は「各ボディ/頂点について、作用する力をすべて列挙する」と記述されています。実行時表現では、接触・ジョイント・スプリングから得た per‑body 制約収集が該当します。
コード:
src/physics/gpu/contactGeneration.tssrc/physics/gpu/avbdState.ts
色付け
論文は貪欲色付けを採用し、同じ色のボディは原始ステップで並列処理可能にします。この準備は以下で行われます。
src/physics/gpu/avbdState.ts
慣性ターゲットと原始初期化
アルゴリズム 1 の次の段階では、慣性ターゲット (y) を構築し、原始状態を初期化。ウォームスタート・剛性変数はセクション 3.6, 3.7 で議論された (\alpha), (\gamma) スケーリングで設定します。
コード:
src/physics/gpu/avbdState.tssrc/physics/PhysicsEngine.ts
主な AVBD イテレーション:色付き原始ボディ解法
各イテレーションおよび各色について、ソルバーはボディに対する慣性と制約の寄与を集計し、ローカル剛体システムを構築して AVBD 原始更新を適用します。これはアルゴリズム 1 の行 7–25 とセクション 3.5 の近似ヘッセンに対応しています。
コード:
src/physics/gpu/avbdState.ts
双対と剛性の更新
各原始スイープ後、双対変数と剛性値を並列で更新します。これは論文の拡張ラグランジュ / 剛性ランプルールに対応しています。
コード:
src/physics/gpu/avbdState.ts
速度の最終化
AVBD 位置解が完了した後、速度を更新状態から再構築します。これもアルゴリズム 1 の最後段階と一致します。
コード:
src/physics/gpu/avbdState.tssrc/physics/PhysicsEngine.ts
オプションのポストプロセッシング
スリープ処理や診断はコア AVBD ループ外であり、オプションのランタイム機能です。主な調整は以下に残ります。
src/physics/PhysicsEngine.ts
現実装についての注意点
広域パイプラインは論文とほぼ一致しています:
衝突検出 → 色付け → 慣性/原始初期化 → 反復的な色付き原始解法 → 双対更新 → 速度最終化
これは初期実験版であり、今後のアップデートでは安定性・パフォーマンス・使いやすさを重視します。
重要な実装上の違いとしては、論文が同色衝突時にダブルバッファ位置更新を明示的に記述している一方で、本プロジェクトでは基本的に in‑place の色付きボディ解法 (
src/physics/gpu/avbdState.ts) を採用しています。