code: def sample_point_in_half_sphere_shell(
      inner_radius: float,
      outer_radius: float,
      offset: float = 0.0,
      rng: np.random.RandomState = default_rng(),
  ) -> Tuple[float, float, float]:
      """Uniformly sample points that are in a given distance range from the origin
      and with z >= offset."""
      while True:
          # normalize(3-dim standard normal) is distributed on the unit sphere surface
          xyz = rng.normal(0, 1, (3,))
          if xyz[2] < offset:  # if z is less than offset, rejection.
              continue
          xyz = xyz / np.linalg.norm(
              xyz
          )  # unit vector on the unit sphere surface
          # radius follows surface area of the sphere of radius r
          radius = rng.uniform(
              inner_radius**3, outer_radius**3
          ) ** (1 / 3.0)
          xyz = (
              xyz * radius
          )  # projected to the sphere surface of radius r
          return tuple(xyz.tolist())
  
file_path: kubric/kubric/randomness.py
imports: import numpy
  import pyquaternion
  from typing import Optional, Tuple
  from kubric.core import color
  from kubric.core import objects
label_desc: Use image node_id 11 for calling a global function with example usage: sample_point_in_half_sphere_shell(inner_radius, outer_radius, offset, rng) and returns: tuple