text: #!/usr/bin/env python3
  # Copyright 2004-present Facebook. All Rights Reserved.
  
  import numpy as np
  from scipy.spatial import cKDTree as KDTree
  import trimesh
  
  
  def compute_trimesh_chamfer(
      gt_points, gen_mesh, offset, scale, num_mesh_samples=30000
  ):
      """
  	This function computes a symmetric chamfer distance, i.e. the sum of both chamfers.
  
  	gt_points: trimesh.points.PointCloud of just poins, sampled from the surface (see compute_metrics.ply
  				for more documentation)
  
  	gen_mesh: trimesh.base.Trimesh of output mesh from whichever autoencoding reconstruction method
  				(see compute_metrics.py for more)
  
  	"""
  
      gen_points_sampled = trimesh.sample.sample_surface(
          gen_mesh, num_mesh_samples
      )[0]
  
      gen_points_sampled = gen_points_sampled / scale - offset
  
      # only need numpy array of points
      # gt_points_np = gt_points.vertices
      gt_points_np = gt_points.vertices
  
      # one direction
      gen_points_kd_tree = KDTree(gen_points_sampled)
      one_distances, one_vertex_ids = gen_points_kd_tree.query(gt_points_np)
      gt_to_gen_chamfer = np.mean(np.square(one_distances))
  
      # other direction
      gt_points_kd_tree = KDTree(gt_points_np)
      two_distances, two_vertex_ids = gt_points_kd_tree.query(gen_points_sampled)
      gen_to_gt_chamfer = np.mean(np.square(two_distances))
  
      return gt_to_gen_chamfer + gen_to_gt_chamfer
  