code: def look_at(points, fov, rotation=None, distance=None, center=None):
      
  
      if rotation is None:
          rotation = np.eye(4)
      else:
          rotation = np.asanyarray(rotation, dtype=np.float64)
      points = np.asanyarray(points, dtype=np.float64)
  
      # Transform points to camera frame (just use the rotation part)
      rinv = rotation[:3, :3].T
      points_c = rinv.dot(points.T).T
  
      if center is None:
          # Find the center of the points' AABB in camera frame
          center_c = points_c.min(axis=0) + 0.5 * points_c.ptp(axis=0)
      else:
          # Transform center to camera frame
          center_c = rinv.dot(center)
  
      # Re-center the points around the camera-frame origin
      points_c -= center_c
  
      # Find the minimum distance for the camera from the origin
      # so that all points fit in the view frustrum
      tfov = np.tan(np.radians(fov) / 2.0)
  
      if distance is None:
          distance = np.max(np.abs(points_c[:, :2]) /
                            tfov + points_c[:, 2][:, np.newaxis])
  
      # set the pose translation
      center_w = rotation[:3, :3].dot(center_c)
      cam_pose = rotation.copy()
      cam_pose[:3, 3] = center_w + distance * cam_pose[:3, 2]
  
      return cam_pose
docs: Generate transform for a camera to keep a list
      of points in the camera's field of view.
  
      Parameters
      -------------
      points : (n, 3) float
        Points in space
      fov : (2,) float
        Field of view, in DEGREES
      rotation : None, or (4, 4) float
        Rotation matrix for initial rotation
      center : None, or (3,) float
        Center of field of view.
  
      Returns
      --------------
      transform : (4, 4) float
        Transformation matrix with points in view