最近話題な超簡単3Dスキャン手法の「3DGS」の何が凄いかよく分からないので初心者向けに調べてみた！

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/0be53575-3890-ae0b-bf15-059babe1c9f9.gif)

**3DGS**！熱いですねー！

1分くらいでささーっと録画し、ちょっと待つだけで上の動画のようなハイクオリティな3Dモデルができちゃいます！

3DGSっていうのは（根本的な手法としては昔からあったようですが、）最近開発された技術で、シンプルにいうと「**複数枚の写真から、機械学習（AI）により3Dデータを生成する技術**」のようです。

高速に高品質な3Dモデルが作れるのでとても重宝してますが、実際にどんなものなのかはよくわかっていなかったので色々調べてみました！

## 3DGSって？

以下の記事がとても参考になりました！

- [An Intro to Gaussian Splats](https://scaniverse.com/news/intro-gaussian-splats)
- [今話題のGaussian Splattingについて解説してみた(1/2)](https://note.com/andpad_zero/n/n0bea3d180bc0)

3DGSとは「**3D Gaussian Splatting**」の略で、要するに3D空間を表現する新しい手法です。

従来は3Dオブジェクトを「**メッシュ**」という三角形の集合で表したり、**点群**として表現することが多かったのですが、3DGSでは「**ガウシアン分布（ガウス分布・正規分布）に従って3D空間内の点を滑らかに表現しちゃおう！**」という発想らしいです。

よくわかんないっすね！

### なぜガウス分布？

ガウス分布は「山なり」な形の確率分布で、**点の周りに楕円形状の分布をふわっとかけておくと**、その点がぼんやりとした「**球状の塊**」として表現されるようです。

これを3D空間に大量に配置すれば、**近くで見るとなんとなく霧や煙**のような、**遠くから見るととても滑らかな「雰囲気」で物体を表現**できるわけです。

実際スキャンしたデータをのぞいてみるとこんな感じで楕円形のモヤがたくさんあるのが分かるかと思います！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/6925f28c-9214-a7c4-f05a-a496fd393184.png)

### 従来との違い

従来は3Dモデルを「頂点」と「頂点を結ぶポリゴン（主に三角形）」で表し、それにテクスチャやライティングを頑張って施していました。

一方で3DGSでは、「**点にガウス分布を割り当てる**」方式のため、ポリゴンなしで、もう少し直接的に「点」の集合として物体を描き出すことが可能になるみたいです。
この手法により高速化つ高品質なレンダリングができます。

## 3DGSの生成

生成の手法についても、[今話題のGaussian Splattingについて解説してみた(1/2)](https://note.com/andpad_zero/n/n0bea3d180bc0)の記事で詳しく説明してくれていました。

まず、事前準備として**従来の写真測量（SfM）などで複数の画像から特徴点を抽出**し、点群を生成します。
これが初期位置の点群となります。

その後、適当（は言い過ぎだろうが）に**ガウス分布を被せていきます**。

あとは機械学習の領域ですが、**生成された3Dガウスを画像化し、元の画像と比較することでどのピクセルがどの程度ずれているかを判定**していきます。
（このラスタライズ（画像化）処理が超高速に行えるため、有利なようです！）

最終的に**勾配降下法で微調整**していき、出力されるみたいですね！

すげぇ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/4c019b23-8540-5f3b-0093-69191e69ce5e.png)
（こんなイメージになるようです。 「[図２．Gaussian Splattingの仕組みの流れ](https://note.com/andpad_zero/n/n0bea3d180bc0)」）

## 3DGSのデメリットと対策

で、そんな超高速かつ手軽に3Dシーンを生成できる3DGSですが、デメリットはあります。

通常の点群データなどと同じように**XYZ座標や色情報を持つ他、分散（モヤ）や透明度、スケールなどを表すパラメータなどがとにかく多く、1つの点（3Dガウス）を表現するのに59カラムの情報が必要で、236バイトにもなる**ようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/78668fc1-f0d8-e83d-ba68-c2bba62d26f1.png)

3Dデータは往々にして肥大化しがちですが、それらと比較してもとにかくファイルサイズがデカくなってしまうのが大きなデメリットのようでした。

- 参考
    - [Open-sourcing .SPZ: it’s .JPG for 3D Gaussian splats](https://scaniverse.com/news/spz-gaussian-splat-open-source-file-format)

で、これに対応するために生まれたのが新たなファイル形式である「**SPZ**」のようです。

## SPZとは

SPZ形式は、Gaussian Splattingを想定した**軽量なファイル形式**で、なおかつ仕様が**オープンソース**になっているようでした！

以下のような特徴を持っているみたいです。

- **ファイルサイズの削減**：

高度な圧縮アルゴリズムやバイナリ形式の採用により、同等品質のデータを格納しつつ、PLYなど従来形式の何倍もの軽量化を実現

- **専用ツールチェーンの存在**：

[https://github.com/nianticlabs/spz](https://github.com/nianticlabs/spz)で公開されているようなツール群を利用することで、SPZへの変換や表示、解析が容易

- **高速な読み込みと描画**：

専用フォーマットであるため、レンダリングパイプラインとの親和性が高く、より高速なシーンロードや更新を行うことができる

以下の表のように、すべてのカラムに対して個別に圧縮をかけているようで、最終的にgzipで圧縮され、**PLY形式と比較して1/10程度のファイルサイズ**になるようです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/79a85016-1b1c-aa98-ba1c-e9f5f0b6ecc7.png)

## 3Dガウスの描画

データ形式や生成手法はわかったが、どうやって描画するの？という点が気になりました。

スキャンしたデータをPLYで出力し、Blenderで読み込ませてみましたが、こんな感じで**ただの点群として表示**されちゃっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/ac89a369-8702-69e6-b5f6-8c6a06328ea1.png)

みたいなことを呟いているとXで「**PCで3DGSを見たり編集したりするんだったら、supersplatオススメっすよー**」と教えていただきました！

[supersplat](https://playcanvas.com/supersplat/editor/)

現在はSPZには対応していなさそうですが、PLY形式の3Dガウスであれば超手軽に読み込むことができます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/39b0da20-439f-272e-dc8d-828140fe1593.png)

で、さらにこちらの記事にある通り、つい最近ローダーが作成され、Babylon.jsから利用できるようになっているようです！
すごい！！
[3D Gaussian Splattingローダライブラリ"spz-loader"をリリースしました
](https://zenn.dev/drumath2237/articles/release-spz-loader)

## 終わりに

ということでサクッと3DGSについて調べてみました！

多少理解は深まったので、いつか3Dガウス全般もっと使ってみたりSPZファイルを解析してみたり、作成してみたり…あとはちゃんと仕様を整理した記事を書いてみたり！ということをやっていきたいなーと思いました！！