code: public GVRSceneObject loadModel(final String filePath, final GVRScene scene) throws IOException
      {
          GVRSceneObject model = new GVRSceneObject(mContext);
          AssetRequest assetRequest = new AssetRequest(model, new GVRResourceVolume(mContext, filePath), scene, null, false);
          String ext = filePath.substring(filePath.length() - 3).toLowerCase();
  
          assetRequest.setImportSettings(GVRImportSettings.getRecommendedSettings());
          model.setName(assetRequest.getBaseName());
          if (ext.equals("x3d"))
          {
              loadX3DModel(assetRequest, model);
          }
          else
          {
              loadJassimpModel(assetRequest, model);
          }
          return model;
      }
docs: Loads a hierarchy of scene objects {@link GVRSceneObject} from a 3D model
  and adds it to the specified scene.
  IAssetEvents are emitted to event listener attached to the context.
  This function blocks the current thread while loading the model
  but loads the textures asynchronously in the background.
  <p>
  If you are loading large models, you can call {@link #loadModel(GVRSceneObject, GVRResourceVolume, GVRScene)}
  to load the model asychronously to avoid blocking the main thread.
  @param filePath
  A filename, relative to the root of the volume.
  If the filename starts with "sd:" the file is assumed to reside on the SD Card.
  If the filename starts with "http:" or "https:" it is assumed to be a URL.
  Otherwise the file is assumed to be relative to the "assets" directory.
  
  @param scene
  If present, this asset loader will wait until all of the textures have been
  loaded and then it will add the model to the scene.
  
  @return A {@link GVRSceneObject} that contains the meshes with textures and bones
  and animations.
  @throws IOException