code: public void setWorldRotations(float[] rotations)
      {
          if (rotations.length != mBones.length * 4)
          {
              throw new IllegalArgumentException("Source array is the wrong size");
          }
          mNeedSync = true;
          for (int i = 0; i < mBones.length; ++i)
          {
              Bone bone = mBones[i];
              int t = i * 4;
  
              bone.setWorldRotation(rotations[t], rotations[t + 1], rotations[t + 2], rotations[t + 3]);
              bone.Changed |= WORLD_ROT;
  
              calcLocal(bone, mSkeleton.getParentBoneIndex(i));
  
              if (sDebug)
              {
                  Log.d("BONE", "setWorldRotation: %s %s", mSkeleton.getBoneName(i), bone.toString());
              }
          }
      }
docs: Sets the world rotations for all the bones in this pose (relative to skeleton root).
  <p>
  The world space joint rotations for each bone are copied from the
  source array of quaterions in the order of their bone index.
  The order of the bones in the array must follow the order in the skeleton for this pose.
  <p>
  All bones in the skeleton start out at the origin oriented along the bone axis (usually 0,0,1).
  The pose orients and positions each bone in the skeleton with respect to this initial state.
  The world bone matrix expresses the orientation and position of the bone relative
  to the root of the skeleton. This function sets the world space bone rotations
  from an array of quaternions.The bone positions are unaffected.
  @param rotations	array with quaternions in world coordinates.
  
  @see #setLocalRotations
  @see #setWorldMatrix
  @see #getWorldRotations
  @see #setWorldPositions
  @see GVRSkeleton#setBoneAxis
  @see #getNumBones