public boolean intersectsBoundingBox(BoundingBox bb) {
    assert Vector3f.isValidVector(center) && Vector3f.isValidVector(bb.center);

    if (FastMath.abs(bb.center.x - center.x) < getRadius() + bb.xExtent
        && FastMath.abs(bb.center.y - center.y) < getRadius() + bb.yExtent
        && FastMath.abs(bb.center.z - center.z) < getRadius() + bb.zExtent) {
      return true;
    }

    return false;
  }
  private float getMaxAxis(Vector3f scale) {
    float x = FastMath.abs(scale.x);
    float y = FastMath.abs(scale.y);
    float z = FastMath.abs(scale.z);

    if (x >= y) {
      if (x >= z) {
        return x;
      }
      return z;
    }

    if (y >= z) {
      return y;
    }

    return z;
  }
  public BoundingVolume transform(Matrix4f trans, BoundingVolume store) {
    BoundingSphere sphere;
    if (store == null || store.getType() != BoundingVolume.Type.Sphere) {
      sphere = new BoundingSphere(1, new Vector3f(0, 0, 0));
    } else {
      sphere = (BoundingSphere) store;
    }

    trans.mult(center, sphere.center);
    Vector3f axes = new Vector3f(1, 1, 1);
    trans.mult(axes, axes);
    float ax = getMaxAxis(axes);
    sphere.radius = FastMath.abs(ax * radius) + RADIUS_EPSILON - 1f;
    return sphere;
  }