3DGS を Quest 3 単機で 表示したい!【XGRIDS Meetup Nagoya 2026】

>100 Views

August 01, 26

スライド概要

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

3DGS を Quest 3 単機で 表示したい! 寝る間をオシム XGRIDS Meetup Nagoya 2026 / 2026.07.31

2.

自己紹介 名前 寝る間をオシム SNS X(@nerumawo_oshimu) / note(oshimu) リアル 株式会社 palan で XR エンジニアをしています VR Web メディア「バーチャルライフマガジン」に所属しています 2

3.

バーチャルライフマガジンについて VRChat をはじめ、広く XR 界隈の情報を扱う Web メディア。 ワールド紹介・企画モノ・現地レポートなどバラエティ豊かな内容を発信。 「壁新聞」も発行しています。 https://vr-lifemagazine.com/ 3

4.

目的:3DGSをPCを使わず、スタンドアローンで表示したい! ゲーミングPC持ってる人意外と少ないし…… PC Quest 3 Quest 3 単体 4

5.

まずは既存ライブラリを調べた 3DGS を Unity で表示するライブラリはいくつかある。Quest 単体で行けるか確認してみた。 UnityGaussianSplatting おそらく一番使われているが、開発が止まっている。 https://github.com/aras-p/UnityGaussianSplatting gsplat-unity 後発。BiRP / URP / HDRP に対応。 https://github.com/wuyize25/gsplat-unity → 今回は後発で扱いやすい gsplat-unity をベースに試した。 5

6.

一応できた ……が、とても重い! Scaniverse で撮影した簡単なシーンでも 10fps 程度まで落ちる。 表示そのものより、3DGS の読み込み時点で Quest には負荷が高い。 しかもライブラリ側に、負荷を調整する手段がほとんど無い。 6

7.

一方 Web は進んでいて、スプラット数が多くても表示できる https://www.worldlabs.ai/blog/spark-2.0 LoD の概念があり、見ている場所に合わせて動的に splat をロードできる 7

8.

Spark 2.0 のざっくり解説 事前に ply を変換し、エリアごとに細切れにしておく。 見ている方向に合わせて、必要な分だけをロードする。 ・遠いものはそれなり、近いものは高密度に。 → 大きなファイルでも、端末のスペックに合わせて表示できる ※ Spark の LoD は「画面上で何 px か」でツリーを打ち切る方式。今回の実装もこの考え方を踏襲している。 8

9.

……これアプリに応用できないかな〜〜〜 難しそうだな〜〜〜 誰か作ってくれないかな〜〜〜 と思っていたところ…… 9

10.

Claude Fable 登場! これを逃す手はない 10

11.

……実装出来ちゃいました。 https://youtu.be/IN-4Hfv0YsE (理論上は) GB 級のシーンを、固定メモリのまま Quest 3 だけで表示できる ※約800MB、1200万splatまでは動きまし) 11

12.

何を借りて、何を自作したか Spark 2.0 の LoD ツリー構築は「ソースごと同梱」して流用。 フォーマットと Unity ランタイムは自作。 借りたもの 自作したもの ・Spark 2.0の入力デコーダとLoD ツリー構築 ・変換ファイルフォーマット ・gsplat-unityのスプラット投影部分の仕組み ・点群表示のための処理部分 ※Spark2.0とgsplat-unityはMITライセンス ply を用意 PC で変換 ・非同期ストリーミングと描画部分(Unity 一式) Quest へ転送 端末側で必要分を読み込み → 描画 12

13.

事前処理: splat をツリーとチャンクに切る splat を LoD ツリーに組み直し、固定サイズのチャンクに切り出しておく(この処理は PC 側)。 scene.ply LoD ツリー構築 葉 = 元の splat 内部ノード = 子をまとめた代表 splat root 深いノードほど細かい 近い splat 同士が同じチャンクに入るよう 空間的に並べ替えて分割 並べ替えてから切り出す チャンク .usst(ノード表 / チャンク索引) 13

14.

ランタイム:毎フレーム、ツリーを途中で打ち切る カメラから見て細かさが要るところだけツリーを下まで降り、それ以外は代表 splat で止める。 カメラ GPU プール(固定サイズ) ツリーを上から降りる root 近い 遠い 子へ展開 (細かく表示) ここで打ち切り (代表 splat 1 個) 足りない分は非同期ロード/使わないページはアンロード ソート → 1 ドローで描画 打ち切りの条件 = そのノードが画面上で何 px を占めるか シーンが何 GB でも、GPU 側は常に固定サイズ 14

15.

色々検証した結果、 Quest 3 で一度に表示できるのは 25 万 〜 30 万 splat 25 万 splat で実測 35〜44fps、表示するデータの内容によって上下する 15

16.

まとめ 画質 表示の綺麗さはそれなり 取り回し Quest1台で完結するためとても楽。 オフライン データは端末内に置く形なので、通信なしで確認できる。 横展開 XREALでも実機動作を確認!色々な機器で応用可能。 ※ XREALはスペックが低く、描画は 5 万splatほど…… 16

17.

今回展示もしていますので、 気になる方は是非ご体験ください。 寝る間をオシム