はじめに
この記事は Babylon.js Advent Calendar 2025 の、15日目の記事です
最初3回に分けるつもりでしたが、長くなったので4回になりそうです。
1.Scaniverseによるスキャンと、Babylon.jsで表示する手順
2.フォトグラメトリの特長について
3.ガウシアンスプラットの特長について
4.Babylon.jsでガウシアンスプラットのデータの編集
この記事は3番目、ガウシアンスプラットの特長について記載します。
ガウシアンスプラッティングの仕組みを理解する
前回の記事では、ガウシアンスプラッティングと比較のためにフォトグラメトリについて記述しました。
今回は、ガウシアンスプラッティング(3D Gaussian Splatting、以下3DGS)がなぜフォトグラメトリの苦手な植物や噴水の流体のような表現を可能にしている仕組みについてです。
以下は道後温泉の足湯です。フォトグラメトリでは特徴点が定まらないためこのような処理は難しいですが、ガウシアンスプラットでは流れ落ちているお湯が自然に表現されています。

3DGSはフォトグラメトリと同じく3D表現をする技術ですが、見せるためのアプローチが大きく異なります。3DGSは形状ではなく、カメラ位置からの見た目を再現する為のデータを作成します。
3DGSは最初はフォトグラメトリと同じく特徴点を手掛かりに写真の撮影位置を特定します。
その後は見た目を再現する為に写真の画像と、その位置から表示する画像の誤差を最小化するように3D空間上に大きさをもった点群を作成していきます。
この「見た目の再現」に特化したアプローチが、3DGSの最大の特徴です。
例えば下図のような鳩の像を処理する場合は
点に対して色の他に大きさ(楕円)、透明度を調整して、写真の見た目に近づけていきます。

3DGSのデータは、写真のドットに、3D情報を加えたものと考えるとわかりやすいです。
楕円のデータを持つために、SPZファイルであれば1つの点毎に下図のようなデータを持ちます。
スケールX,Y,Zが楕円の大きさとなり、クォータニオンで楕円を回転させています。この楕円のデータを大量に配置して画像を表示します。

このようにガウシアンスプラットは、ガウス(ぼけた楕円の)分布な点群を、スプラット(飛び散らす)する手法で写真のような描画を実現しています。

冒頭の足湯の水も、3DGSでは見た目を再現するように楕円を配置し、透明度で透け感を再現、反射もその位置から見た目を再現するように楕円を配置し、水の反射や水面の波うっった様子も、光の反射などの処理はせず楕円を配置して自然な見た目を再現しています。
3DGSの特性
形状を正確に再現できなくても見た目の再現をしてしまおうというアプローチは、様々な現象を起こしますので触れてみます。
通行人が映り込んだ場合
下図は、金の鳩をスキャン中に人が映り込んだケースです。
最初は人らしい標示がありますが、視点を移動するとこの人物は消えてしまいます。

Babylon.jsのPlaygroundで、マテリアルのプロパティにある、「Need depth pre-pass」をONにするとガウスのボカシが無い状態で3DGSの楕円を表示します。人物の部分がどのようになっているか見てみましょう。
#
このモードでも人物がそれらしく表示されている角度からはそれらしく見えますが、消えてしまっている角度からは楕円がとても細長く、平べったく表示されていることが確認できます。

イメージとしては下図のような状態ですね。撮影時に人物がいた角度からは、人物が見えるように楕円の面が見えるように、人物が立ち去った際に撮影した角度からは何も表示しないように、楕円のサイズや角度を調整して特定の方向からは殆ど楕円が表示されないように配置して特定の角度から見えるような再現をします。

屋外から屋内を撮影した場合
もうひとつ、日中に建物の屋外と屋内を撮影した場合の例です。
日中の屋外は明るいためカメラのISOが調整され、入り口の部分は黒く映ってしまいます。

ところが建物の入り口から中に入ると周囲が屋外より暗くなるためISOが再度調整されて部屋の内部も見えるようになります。

外から見たら入り口が黒くて中が見えず、室内に入ると内部が見えるという状況を再現する為に、暖簾のように入口に黒い靄を作成して両方の見た目を再現しようとします。

室外から室内に入るようにカメラを動かすと以下のようになります。

このように3DGSは撮影した場所からの見た目を再現するため、時に特殊な表現をするケースがあります。
これについてはまた次回、操作してみましょう。
遠くの真っすぐ生成出来ているように見える柱
また、3DGSではフォトグラメトリが苦手としていた直線の柱の再現もこのようにされます。

ただし、それは撮影した位置から見た場合であって、柱がもし一方こうだけからしか撮影していなかった場合(今回は、金の鳩の周りをぐるっと回っただけで柱はほぼ1方向からしか撮影していません)
撮影した場所から離れて柱を見た場合、下図は金の鳩から離れた場所から柱を見た場合ですが直線になっていません。撮影した場所からの見た目は再現するものの、撮影箇所からの奥行が計測できないためこのような結果になっています。

フラワームーブメントについて
フラワームーブメントは、対象物の周りを花弁のように遠近移動しつつ一周するスキャン方法です。
ナイアンテック社のブログで紹介されていた手法ですが、フラワームーブメントがなぜ綺麗にスキャンできるのかを簡単に見てみます。

下図はオフィスビルを、横に移動しながら撮影したデータから生成したものです。
左側は、撮影した場所付近から表示した場合、右側が撮影していないちょっと斜めに移動した場所から表示した結果です。撮影した場所からの再現はできていますが撮影していない場所からの表示は、かなり乱れています。

つづいて下図は、同じビルを前後しながら横に移動して撮影した場合です。
撮影した場所からも、撮影した場所から少し斜めに移動してみた場合どちらもそれなりの見た目を再現できています。

結果の精度に差が出た理由を下図に示します。
撮影角度が狭いと3DGSの楕円が奥行方向に配置する際の誤差が出てしまい、結果さきほどのビルのように乱れてしまいます。フラワームーブメントでは撮影角度を増やす事につながり、結果、奥行の誤差を低減させることができます。

このように、3DGSは様々な特性があることがわかります。
次回は不要な通行人や、入り口のブラックノイズをBabylon.jsで編集する方法について記載する予定です。

