はじめに
こんにちは。GMOグローバルサイン・ホールディングス CTO室 所属のはが(@mxcn3)です。
今回は、2025年5月にPlayCanvas Engine 2.7.5でサポートされた「SOGS(Self-Organizing Gaussians)」という3DGS圧縮技術を利用して手順やファイルサイズの比較を行いました。
3D Gaussian Splatting(3DGS)とは
3D Gaussian Splatting(3DGS) は、写実的な3Dシーンを生成できる革新的な技術です。従来の3Dポイントクラウドデータを「点」として扱うのではなく、各点をガウシアン(ぼかし) として表現することで、滑らかで高品質な3Dレンダリングを実現します。3DGSについては、テックブログに以前投稿されている記事「3DガウシアンスプラッティングをWebで実現する」もご覧ください。
SOGSについて
SOGS Self-Organizing Gaussians は、ドイツのFraunhofer HHIのWieland Morgenstern氏が開発し、ECCV 2024で発表された圧縮技術です。PlayCanvasがこの技術を採用してWebページでの利用が容易になりました。この技術は、3DGSのデータを画像に変換し、画像の圧縮技術を利用してファイルサイズを削減します。これにより、高い圧縮率を実現しているようです。
SOGSを使用した検証
検証は、以前私が撮影をした岩のスキャンデータでファイル圧縮を行います。
元のファイルは、SuperSplatで不要なスプラット(点群)を削除をしています。
検証をするファイル
- 3D Gaussian Splatting (.ply)
- 点群数 185,904
- ファイル容量 46.1MB

検証ファイル – 岩のスキャンデータ
検証環境
- GPU: NVIDIA GeForce RTX 3070
- OS: Windows 11
※お使いの環境でGPUやCUDAが利用できない場合は、こちらのGoogle Colabに実行環境を用意しましたので、お試しください。
実行環境のインストール
実行環境は、「playcanvas/sogs」のリポジトリに公開をされているので、手順に沿って実行環境の準備を行います。
- リポジトリのクローンと依存関係のインストール
git clone https://github.com/playcanvas/sogs.git # SOGSのGitHubリポジトリをクローンします cd sogs
- クローンをした後のリポジトリの構成は以下のようになっています。
sogs/ ├── LICENSE ├── README.md ├── pyproject.toml └── src/ └── sogs/ ├── __init__.py ├── cli.py └── sogs_compression.py
- 依存関係のインストール
pip install torch --index-url https://download.pytorch.org/whl/cu124 pip install cupy-cuda12x pip install torchpq pip install git+https://github.com/fraunhoferhhi/PLAS.git pip install -e
圧縮の実行
インストールが完了するとSOGSにはコマンドラインインターフェース(CLI)が用意されていますので、CLI上で圧縮を実行します。
- ファイルの圧縮の実行
Gaussian Splattingのデータを、インストールをしたフォルダに、model.ply として配置をして、sogs-compressコマンドで圧縮を実行します。
sogs-compress --ply model.ply --output-dir compressed_data
sogs-compressコマンドの引数
- –ply ファイル名を指定
- –output-dir 出力先のフォルダを指定

sogs-compressの実行結果 – RTX 3070でも1分ほどで処理が完了
圧縮後に出力されるファイル
処理が完了をすると、出力先のフォルダにmeta.jsonと画像データ(.webp)が出力されます。

出力されたファイル – メタデータと画像データが出力される
圧縮によるファイルサイズの変化
今回のデータで出力をされた画像ファイルのサイズはこちらです。
ファイル名 | サイズ |
---|---|
means_l.webp | 557KB |
means_u.webp | 481KB |
quats.webp | 563KB |
scales.webp | 356KB |
sh0.webp | 512KB |
shN_centroids.webp | 1.7MB |
shN_labels.webp | 361KB |
meta.json | 1.5KB |
合計 | 約4.2MB |
元データとSOGSでの圧縮後の比較
こちらが元のデータと生成したデータを並べたものとなります。
比較用のWebページ ( 全画面 ) – 左 PLY 右 SOGS
元データと圧縮後の画像のファイルサイズの合計と比較はこちらです。
比較項目 | サイズ |
元データ (.ply形式) | 46.1MB |
圧縮後の合計ファイルサイズ | 約4.2MB |
圧縮率 | 約11分の1 |
データの利用方法について
SOGSで圧縮した3DGSデータは、「前回の記事」で紹介しているPlayCanvas Reactのライブラリでは既に対応をしているため、Reactベースのフロントエンドのコードからでも利用をすることができます。
import { Viewer } from "@playcanvas/blocks"
export function SplatViewerSogs() {
return (
<Viewer.Splat
src={"https://example.com/meta.json"}
className="h-screen w-full rounded-lg shadow-xl cursor-grab active:cursor-grabbing"
>
<Viewer.Controls className="bg-white/80 backdrop-blur-sm rounded-lg shadow-lg">
<div className="flex gap-1 pointer-events-auto flex-grow ">
<Viewer.FullScreenButton />
<Viewer.DownloadButton />
</div>
<div className="flex gap-1 pointer-events-auto">
<Viewer.CameraModeToggle />
<Viewer.HelpButton />
<Viewer.MenuButton />
</div>
</Viewer.Controls>
</Viewer.Splat>
)
}
埋め込まれているウェブサイトのソースコードも含めてこちらのリポジトリにデータを公開しておりますのでこちらをご覧ください。
まとめ
この圧縮技術は、個人的にかなり使いやすいと感じました。これまではデータ容量が大きいために扱いにくかったファイルサイズが劇的に小さくなることで、Webサイトなどでの共有が非常に手軽になったと思います。
また、PlayCanvasのSOGS対応には現時点がIssue立てられていて、PlayCanvasのGitHub Issue #7789によると、球面調和関数(Spherical Harmonics)を含む場合、GPUのメモリキャッシュ効率が低下しパフォーマンスが従来の圧縮PLY形式よりも低下することが あるようですが、今後改善も予定をされているようです。
参考リンク
質問や不明点がありましたら、X: はが @mxcn3までお気軽にお問い合わせください。