code: def _parse_point_cloud(
      filepath,
      size=None,
      bounds=None,
      projection_normal=None,
      subsampling_rate=None,
  ):
      pc = o3d.io.read_point_cloud(filepath)
  
      if projection_normal is not None and not np.array_equal(
          projection_normal, np.array([0, 0, 1])
      ):
          # rotate points so that they are perpendicular to the projection plane
          # as opposed to the default XY plane
          R = _rotation_matrix_from_vectors(
              projection_normal, [0, 0, 1]
          )
          pc = pc.rotate(R, center=[0, 0, 0])
  
      if bounds is None:
          min_bound, max_bound = None, None
      else:
          min_bound, max_bound = bounds
  
      if _contains_none(min_bound):
          _min_bound = np.nanmin(np.asarray(pc.points), axis=0)
          min_bound = _fill_none(min_bound, _min_bound)
  
      if _contains_none(max_bound):
          _max_bound = np.nanmax(np.asarray(pc.points), axis=0)
          max_bound = _fill_none(max_bound, _max_bound)
  
      bbox = o3d.geometry.AxisAlignedBoundingBox(
          min_bound=min_bound, max_bound=max_bound
      )
  
      # crop bounds and translate so that min bound is at the origin
      pc = pc.crop(bbox).translate(
          (-min_bound[0], -min_bound[1], -min_bound[2])
      )
  
      if subsampling_rate is not None and subsampling_rate > 0:
          pc = pc.uniform_down_sample(subsampling_rate)
  
      points = np.asarray(pc.points)
      colors = np.asarray(pc.colors)
  
      if size is not None:
          width, height = _parse_size(size, (min_bound, max_bound))
      else:
          width, height = None, None
  
      metadata = OrthographicProjectionMetadata(
          min_bound=min_bound,
          max_bound=max_bound,
          width=width,
          height=height,
      )
  
      return points, colors, metadata
  
imports: import itertools
  import logging
  import warnings
  import numpy
  import scipy.spatial
  import eta.core.numutils
  import fiftyone.core.fields
  import fiftyone.core.labels
  import fiftyone.core.media
  from fiftyone.core.sample import Sample
  import fiftyone.core.utils
  import fiftyone.core.validation
  from fiftyone.core.odm import DynamicEmbeddedDocument
  import fiftyone.utils.image
label_desc: Use image node_id 10 for calling a global function with example usage: _parse_point_cloud(filepath, size, bounds, projection_normal, subsampling_rate) and returns: points,  colors,  metadata