intersectBox method 
    
    
    
  Implementation
  Vector3? intersectBox(BoundingBox box, Vector3 target) {
  double tmin, tmax, tymin, tymax, tzmin, tzmax;
  final invdirx = 1 / direction.x,
      invdiry = 1 / direction.y,
      invdirz = 1 / direction.z;
  final origin = this.origin;
  if (invdirx >= 0) {
    tmin = (box.min.x - origin.x) * invdirx;
    tmax = (box.max.x - origin.x) * invdirx;
  } else {
    tmin = (box.max.x - origin.x) * invdirx;
    tmax = (box.min.x - origin.x) * invdirx;
  }
  if (invdiry >= 0) {
    tymin = (box.min.y - origin.y) * invdiry;
    tymax = (box.max.y - origin.y) * invdiry;
  } else {
    tymin = (box.max.y - origin.y) * invdiry;
    tymax = (box.min.y - origin.y) * invdiry;
  }
  if ((tmin > tymax) || (tymin > tmax)) return null;
  // These lines also handle the case where tmin or tmax is NaN
  // (result of 0 * Infinity). x !== x returns true if x is NaN
  if (tymin > tmin || tmin != tmin) tmin = tymin;
  if (tymax < tmax || tmax != tmax) tmax = tymax;
  if (invdirz >= 0) {
    tzmin = (box.min.z - origin.z) * invdirz;
    tzmax = (box.max.z - origin.z) * invdirz;
  } else {
    tzmin = (box.max.z - origin.z) * invdirz;
    tzmax = (box.min.z - origin.z) * invdirz;
  }
  if ((tmin > tzmax) || (tzmin > tmax)) return null;
  if (tzmin > tmin || tmin != tmin) tmin = tzmin;
  if (tzmax < tmax || tmax != tmax) tmax = tzmax;
  //return point closest to the ray (positive side)
  if (tmax < 0) return null;
  return at(tmin >= 0 ? tmin : tmax, target);
}