Skip to main content

3DGS Surface Reconstruction

3D Gaussian Splatting は novel view synthesis に強い表現ですが、そのままでは explicit surface mesh を持ちません。Simulation、collision、editing、asset 化のためには、Gaussian primitive から surface を抽出する必要があります。

なぜ surface extraction が難しいのか

3DGS の Gaussian は、surface に沿った薄い primitive として振る舞うこともあれば、透明な volume のように重なって見えることもあります。Rendering loss だけでは、見た目が合っていても geometry が厚くなったり、floaters が残ったりします。

Rendering loss は次のように書けます。

Lrender=v(I^v,Iv)\mathcal{L}_{render}=\sum_v\ell(\hat{I}_v,I_v)

しかし、この loss は image space の整合性だけを見るため、surface として薄いか、normal が一貫しているかを直接保証しません。

Density field と level set

Gaussian 集合から連続的な density field を作ると、次のように書けます。

ρ(x)=iαiGi(x)\rho(\mathbf{x})=\sum_i \alpha_i G_i(\mathbf{x})

Surface は density の level set として抽出できます。

S={x:ρ(x)=τ}\mathcal{S}=\{\mathbf{x}:\rho(\mathbf{x})=\tau\}

この式の気持ちは、「Gaussian が多く重なっている場所を物体 surface と見なし、一定の density の等値面を mesh として取り出す」というものです。ただし、threshold τ\tau の選び方で surface の厚みや穴が大きく変わります。

Normal consistency

Surface reconstruction を安定化するには、rendering から得られる depth normal と Gaussian の normal を一致させる regularization が有効です。Gaussian ii の最も薄い方向を normal ni\mathbf{n}_i とし、depth map から計算した normal を nD\mathbf{n}_{D} とすると、次のような loss が考えられます。

Lnormal=iwi(1ninD(μi))\mathcal{L}_{normal}=\sum_i w_i\left(1-\mathbf{n}_i^\top\mathbf{n}_{D}(\boldsymbol{\mu}_i)\right)

この式の気持ちは、「Gaussian の楕円体が向いている surface normal と、rendered depth から見た surface normal を揃える」というものです。Normal が揃うと、Gaussian が surface に沿って薄く並びやすくなります。

SDF / TSDF との接続

Surface をより明示的に扱う場合、Signed Distance Function F(x)F(\mathbf{x}) を導入し、surface を zero level set として定義します。

S={x:F(x)=0}\mathcal{S}=\{\mathbf{x}:F(\mathbf{x})=0\}

Gaussian の中心が surface 近傍にあることを促すには、次の loss が使えます。

Lsdf=iF(\bμi)\mathcal{L}_{sdf}=\sum_i |F(\b\boldsymbol{\mu}_i)|

さらに Eikonal regularization により、SDF として自然な勾配 norm を保てます。

Leik=Ex(F(x)21)2\mathcal{L}_{eik}=\mathbb{E}_{\mathbf{x}}(\|\nabla F(\mathbf{x})\|_2-1)^2

この式の気持ちは、「Gaussian rendering の速さを使いつつ、surface は SDF の zero crossing として幾何的にきれいに保つ」というものです。

Mesh extraction の流れ

典型的な流れは次の通りです。

3DGS から mesh を作るときは、rendering 品質だけでなく、normal consistency、opacity pruning、floaters removal、hole filling が重要です。

関連ページ

主なソース