3D Gaussian Splatting

Points as Primitives

In 3DGS, we use a set of points and the corresponding features as primitives:

X={pk,Fk},

where

pkR3,FkRNf.

In 3DGS, each point has a splat ellipsoid centered at it. Each ellipsoid is defined using a Gaussian and a color

Fk={Σk,αk,ck}

where

Rendering

  1. Transform splats into camera coordinate system using camera parameters C={R,t}.
  2. Sort splats according to depth.
  3. Transform the 3D Gaussian splat distributions into 2D Gaussians in the image space.
  4. Compute final pixel value by accumulating all the splat color values, weighted according to their opacity, visibility and the influence defined by the 2D Gaussian.

Splat Projection

The centroid of each splat is projected onto the image plane:

pk=(Rpk+t)1:2R2.

We also calculate the 2D projection of the covariance matrix:

Σk2D=(JkΣkJkT)1:2,1:2R2×2,

where

Σk=RΣkRT,

and Jk is the affine approximation of the projective transform.

We can finally obtain 2D Gaussian distribution for each splat:

Gk2D(x)=exp((xpk)TΣk2D(xpk)2).

Accumulation

Given the contribution of each splat on pixel x, we can accumulate colors by

Iuv=c(x)=k=1KckαkGk2D(x)j=1k1(1αjGj2D(x)),

which is quite similar to NeRF, but we replace the opacity with αkGk2D.

Summary