Module: Gsplat::Math::SphericalHarmonicBasis

Defined in:
lib/gsplat/math/spherical_harmonic_basis.rb

Overview

Real SH bases and normalized-direction derivatives in gsplat/Inria order.

Constant Summary collapse

C0 =
0.2820947917738781
C1 =
0.48860251190292
C2 =
[1.092548430592079, 0.3153915652525201, 0.5462742152960395].freeze
C3 =
[0.5900435899266435, 2.890611442640554, 0.4570457994644658,
0.3731763325901154, 1.445305721320277].freeze
C4 =
[2.5033429417967046, -1.770130769779931, 0.9461746957575601,
-0.6690465435572892, 0.1057855469152043, 0.47308734787878,
0.6258357354491763].freeze

Class Method Summary collapse

Class Method Details

.evaluate(directions, degree, basis_count) ⇒ Array<Numo::NArray>

Evaluates bases and derivatives with respect to already-normalized directions.

Constants and ordering match gsplat 1.5.3 cuda/_torch_impl.py.

Parameters:

  • directions (Numo::NArray)

    [N,3] normalized directions

  • degree (Integer)

    0..4

  • basis_count (Integer)

    coefficient basis width

Returns:

  • (Array<Numo::NArray>)

    bases [N,K], derivatives [N,K,3]



26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/gsplat/math/spherical_harmonic_basis.rb', line 26

def evaluate(directions, degree, basis_count)
  count = directions.shape[0]
  bases = directions.class.zeros(count, basis_count)
  derivatives = directions.class.zeros(count, basis_count, 3)
  x_coord = directions[true, 0]
  y_coord = directions[true, 1]
  z_coord = directions[true, 2]
  bases[true, 0] = C0
  fill_degree_one!(bases, derivatives, x_coord, y_coord, z_coord) if degree >= 1
  fill_degree_two!(bases, derivatives, x_coord, y_coord, z_coord) if degree >= 2
  fill_degree_three!(bases, derivatives, x_coord, y_coord, z_coord) if degree >= 3
  fill_degree_four!(bases, derivatives, x_coord, y_coord, z_coord) if degree >= 4
  [bases, derivatives]
end