code: public void doPick()
      {
          GVRSceneObject owner = getOwnerObject();
          GVRPickedObject[] picked = pickVisible(mScene);
  
          if (mProjection != null)
          {
              Matrix4f view_matrix;
              if (owner != null)
              {
                  view_matrix = owner.getTransform().getModelMatrix4f();
              }
              else
              {
                  view_matrix = mScene.getMainCameraRig().getHeadTransform().getModelMatrix4f();
              }
              view_matrix.invert();
  
              for (int i = 0; i < picked.length; ++i)
              {
                  GVRPickedObject hit = picked[i];
  
                  if (hit != null)
                  {
                      GVRSceneObject sceneObj = hit.hitObject;
                      GVRSceneObject.BoundingVolume bv = sceneObj.getBoundingVolume();
                      Vector4f center = new Vector4f(bv.center.x, bv.center.y, bv.center.z, 1);
                      Vector4f p = new Vector4f(bv.center.x, bv.center.y, bv.center.z + bv.radius, 1);
                      float radius;
  
                      center.mul(view_matrix);
                      p.mul(view_matrix);
                      p.sub(center, p);
                      p.w = 0;
                      radius = p.length();
                      if (!mCuller.testSphere(center.x, center.y, center.z, radius))
                      {
                          picked[i] = null;
                      }
                  }
              }
          }
          generatePickEvents(picked);
      }
docs: Scans the scene graph to collect picked items
  and generates appropriate pick events.
  This function is called automatically by
  the picker if it is attached to a scene object.
  You can instantiate the picker and not attach
  it to a scene object. In this case you must
  manually set the pick ray and call doPick()
  to generate the pick events.
  @see IPickEvents
  @see GVRFrustumPicker#pickVisible(GVRScene)