@Override
    public void render() {
        if (environment != null) {
            // grab the observer
            Object obs = environment.getObserver();
            Quaternion objRot;
            Vector3f objPos;
            if (obs instanceof Camera) {
                objRot = ((Camera) obs).getRotation();
                objPos = ((Camera) obs).getLocation();
            } else {
                objRot = ((Spatial) obs).getWorldRotation();
                objPos = ((Spatial) obs).getWorldTranslation();
            }
            // grab the hardware handle
            VRAPI dev = environment.getVRHardware();
            if (dev != null) {

                // update the HMD's position & orientation
                dev.updatePose();
                dev.getPositionAndOrientation(hmdPos, hmdRot);

                if (obs != null) {
                    // update hmdPos based on obs rotation
                    finalRotation.set(objRot);
                    finalRotation.mult(hmdPos, hmdPos);
                    finalRotation.multLocal(hmdRot);
    }

                finalizeCamera(dev.getHMDVectorPoseLeftEye(), objPos, getLeftCamera());
                finalizeCamera(dev.getHMDVectorPoseRightEye(), objPos, getRightCamera());
            } else {
                getLeftCamera().setFrame(objPos, objRot);
                getRightCamera().setFrame(objPos, objRot);
            }
        }
    }
updatePose can be called here because appstates are always called before the main renderer. This way we get the latest pose close to when it's supposed to render
jme3-vr/src/main/java/com/jme3/input/vr/lwjgl_openvr/LWJGLOpenVRViewManager.java