科学・技術
Fableが新しい4Dスプラットフォーマットを作成
Fable created novel 4D splat format (adamraudonis.github.io)
要約
Fableは、動的な3Dシーンを効率的に圧縮・ストリーミングするための新しいフォーマット「.splat4d」を開発しました。このフォーマットは、静的な背景と動的な要素を分離し、H.265スタイルのGOP構造とエラーバウンド量子化を用いることで、元のデータサイズから大幅に圧縮されたファイルサイズを実現します。WebGPUをサポートするブラウザでリアルタイムプレビューが可能で、HTTP Rangeリクエストによるストリーミングにも最適化されています。
全文翻訳
インタラクト
ブラウザでストリーミング・デコードされたライブプレビュー: 7.4MBの単一.splat4dファイルで2秒間の動的なシーン — 元の.splatフレーム427MBの58倍小さいです。カメラを操作するには「Interact」を押してください。ドラッグで回転、Ctrl+スクロールでズームできます。WebGPUが必要です(Chrome 113+, Safari 26+, Firefox 141+ on Windows)。より多くのシーンとライブエンコーディングコントロールについては、フルデモを開いてください。
仕組み
静的/動的分割
典型的な動的キャプチャでは、ほとんどのスプラットは境界を超えて移動しない背景です。これらは一度だけ保存されます — 1.6GBのシーケンス全体の背景は数MBしかかかりません。分類は正確です: スプラットが静的であるのは、単一の量子化値がクリップ全体での最小値と最大値に対する境界を満たす場合のみです。
デッドバンド「ホールド」トラック
動的なスプラットの保存値は、真の値が境界に違反する場合にのみ変化します。これにより量子化のちらつきがなくなり、時間的な差分はほとんどゼロになり、各シンボルが発行される前にチェック自体が保証を強制します。
H.265スタイルのクローズドGOP
Nフレームごとにキーフレーム(絶対量子化値)、その後は正確な整数差分のPフレーム。各GOPチャンクは独立してデコードされます → シークは他のチャンクに触れることはありません。キーフレームストリームは各チャンク内でデルタストリームの前に配置されるため、スクラブはチャンクの約10%を取得してキーフレームを即座に表示できます。
エントロピー・スタック
モートン順のスプラット、ジグザグ符号化された整数差分、バイトプレーンシャッフル(Bloscスタイル)、ストリームごとのzstd。出力は、自身のシンボルストリームのオーダー0エントロピーの約100%に達します。
ファイル内
.splat4dファイルは3つの部分から構成されます。小さなヘッダーには、境界、量子化ステップ、およびクライアントがフェッチを計画するために必要なすべてを含む絶対バイト範囲のチャンクインデックスが含まれます。静的セクションには、スプラットごとのマスクとベース値が含まれています: 一度フェッチすれば、完全なシーンが画面に表示されます。残りは約1秒のビデオごとの自己完結型GOPチャンクで、キーフレームストリームがデルタストリームの前に配置されています。
SP4D + ヘッダー JSON
STATICセクション → 完全な最初のビュー
GOPチャンク0 [キー][デルタ]
GOPチャンク1 ...
エラーバウンド
デコードされた各フレームの各スプラットの各属性は、ユーザーが選択したソースからのバウンド内にあります — 平均ではなく、PSNRでもありません: 点ごとで決定的です。
属性 | バウンド | デフォルト
---|---|---
位置 | ±ミリメートル、L∞軸ごと | ±2 mm
色 RGB | ±8ビットレベル/チャンネル | ±4/255
不透明度 | ±8ビットレベル | ±4/255
回転 | ±クォータニオン成分(1/128単位、符号まで) | 正確(±0)
スケール | ±相対%、軸ごと | ±2%
メカニズム: SZ/ZFPスタイルのエラーバウンド量子化(ステップ = 2×バウンド ⇒ 構築によりエラー ≤ バウンド)。量子化後、すべて整数演算になります — 時間的差分がドリフトすることは決してなく、RustおよびJavaScriptデコーダーはビット同一の値を再構築します。
オブジェクトストアからのストリーム
このフォーマットは、S3 / GCS / R2 / 任意の静的ホストに対するプレーンHTTP Rangeリクエスト用に設計されています — サーバーロジックなし、マニフェストファイルなし、ビデオコンテナなし。クライアントに必要なのは正確には以下の通りです:
bytes=0-262143 → マジック+ヘッダーJSON(すべてのバイトオフセットは絶対値です)
静的セクションの1つのレンジ(数MB) → 完全な最初のビューが画面に表示されます
再生/シーク中の各GOPチャンクの1つのレンジ: チャンクプレフィックスのレンジ(TOC+キー)が最初に → キーフレームが約100–150ミリ秒で画面に表示され、その後チャンクの残りの部分 → 正確なフレーム
オブジェクトストアはこれをネイティブにサポートします。ブラウザクライアントの場合、CORSを設定してRangeヘッダーを許可し、Content-Rangeを表示します: [{ "AllowedMethods": ["GET", "HEAD"], "AllowedOrigins": ["https://your-site"], "AllowedHeaders": ["Range"], "ExposeHeaders": ["Content-Range", "Content-Length", "Accept-Ranges"] }]
ペイロードはコンテナ内で既にzstd圧縮されているため、Content-Encodingなしでオブジェクトを保存します — Range計算はバイト単位で正確に保たれ、二重圧縮は行われません。
ベンチマーク
3つの独立したキャプチャパイプラインからの8つのシーケンス: Dynamic 3D Gaussians(CMU Panoptic dome — juggle, boxes, softball, tennis)、Neu3D cooking scenes via SpacetimeGaussians/splaTV(flame = backyard BBQ, sear = kitchen chef)、およびTechnicolor(birthday party, 659k splats) — すべてフレームごとのantimatter15 .splatファイル(32 B/splat)、20 fpsに変換されます。splat4dエンコードはデフォルトのバウンド(±2 mm / ±4 color / exact rot / ±2% scale)を使用します。gzipはフレームごと-9です。参考までに、最高の汎用ロスレスベースライン(シリーズ全体でzstd-19 --long)でも2.5倍にしかなりません。完全な方法論とその他のベースライン: BENCHMARKS.md。loading benchmarks.json…
ビューア
Raw WebGPU、antimatter15/splatレンダラーの行ごとのポート、それに対してピクセル検証済み。
メトリック | ローカル | スロットル 50 Mbps
---|---|---
フルファーストビュー(ヘッダー+静的セクション) | 141–157 ms | 791 ms
バッファされていない領域へのスクラブ → キーフレーム表示 | — | 145 ms
再生 | 60 fps @ 336k スプラット · ワーカーデコード 2.5–27 ms/フレーム · ソート 1–25 ms |
使用方法
antimatter15 .splatフレームの時間系列 → 小さく、シーク可能な単一ファイル:
# Python (pip install splats4d)
splat4d encode -i frames_dir -o out.splat4d
MIT · 以下の肩の上に構築されています: antimatter15/splat(フォーマット)、Dynamic 3D Gaussians(データ)、SZ/ZFP(エラーバウンド量子化)、H.264/H.265(GOP構造)、SPZ/SOGS(属性パッキング)、zstd。