docs: public static void loadPhysicsFile(GVRContext gvrContext, String fileName, boolean ignoreUpAxis, GVRScene scene) throws IOException
      {
          byte[] inputData = null;
          try {
              inputData = toByteArray(toAndroidResource(gvrContext, fileName));
          } catch (IOException e) {
              e.printStackTrace();
          }
  
          if (inputData == null || inputData.length == 0) {
              throw new IOException("Fail to load bullet file " + fileName);
          }
  
          long loader = NativePhysics3DLoader.ctor(inputData, inputData.length, ignoreUpAxis);
  
          if (loader == 0) {
              throw new IOException("Fail to parse bullet file " + fileName);
          }
  
          GVRSceneObject sceneRoot = scene.getRoot();
          ArrayMap<Long, GVRSceneObject> rbObjects = new ArrayMap<>();
  
          long nativeRigidBody;
          while ((nativeRigidBody = NativePhysics3DLoader.getNextRigidBody(loader)) != 0) {
              String name = NativePhysics3DLoader.getRigidBodyName(loader, nativeRigidBody);
              GVRSceneObject sceneObject = sceneRoot.getSceneObjectByName(name);
              if (sceneObject == null) {
                  Log.w(TAG, "Didn't find scene object for rigid body '" + name + "'");
                  continue;
              }
  
              if (sceneObject.getComponent(GVRCollider.getComponentType()) == null) {
                  GVRMeshCollider collider = new GVRMeshCollider(gvrContext, true);
                  // Collider for picking.
                  sceneObject.attachComponent(collider);
              }
  
              if (sceneObject.getParent() != sceneRoot) {
                  // Rigid bodies must be at scene root.
                  float[] modelmtx = sceneObject.getTransform().getModelMatrix();
                  sceneObject.getParent().removeChildObject(sceneObject);
                  sceneObject.getTransform().setModelMatrix(modelmtx);
                  sceneRoot.addChildObject(sceneObject);
              }
  
              GVRRigidBody rigidBody = new GVRRigidBody(gvrContext, nativeRigidBody);
              sceneObject.attachComponent(rigidBody);
              rbObjects.put(nativeRigidBody, sceneObject);
          }
  
          long nativeConstraint;
          long nativeRigidBodyB;
  
          while ((nativeConstraint = NativePhysics3DLoader.getNextConstraint(loader)) != 0) {
              nativeRigidBody = NativePhysics3DLoader.getConstraintBodyA(loader, nativeConstraint);
              nativeRigidBodyB = NativePhysics3DLoader.getConstraintBodyB(loader, nativeConstraint);
              GVRSceneObject sceneObject = rbObjects.get(nativeRigidBody);
              GVRSceneObject sceneObjectB = rbObjects.get(nativeRigidBodyB);
  
              if (sceneObject == null || sceneObjectB == null) {
                  // There is no scene object to own this constraint
                  Log.w(TAG, "Ignoring constraint with missing rigid body.");
                  continue;
              }
  
              int constraintType = Native3DConstraint.getConstraintType(nativeConstraint);
              GVRConstraint constraint = null;
  
              if (constraintType == GVRConstraint.fixedConstraintId) {
                  constraint = new GVRFixedConstraint(gvrContext, nativeConstraint);
              } else if (constraintType == GVRConstraint.point2pointConstraintId) {
                  constraint = new GVRPoint2PointConstraint(gvrContext, nativeConstraint);
              } else if (constraintType == GVRConstraint.sliderConstraintId) {
                  constraint = new GVRSliderConstraint(gvrContext, nativeConstraint);
              } else if (constraintType == GVRConstraint.hingeConstraintId) {
                  constraint = new GVRHingeConstraint(gvrContext, nativeConstraint);
              } else if (constraintType == GVRConstraint.coneTwistConstraintId) {
                  constraint = new GVRConeTwistConstraint(gvrContext, nativeConstraint);
              } else if (constraintType == GVRConstraint.genericConstraintId) {
                  constraint = new GVRGenericConstraint(gvrContext, nativeConstraint);
              }
  
              if (constraint != null) {
                  GVRComponentGroup<GVRConstraint> group;
                  group = (GVRComponentGroup)sceneObject.getComponent(GVRConstraint.getComponentType());
                  if (group == null) {
                      group = new GVRComponentGroup<>(gvrContext, GVRConstraint.getComponentType());
                      sceneObject.attachComponent(group);
                  }
  
                  group.addChildComponent(constraint);
                  constraint.setOwnerObject(sceneObject);
              }
          }
  
          NativePhysics3DLoader.delete(loader);
      }