void FOSVRHMD::UpdateHeadPose(FQuat& lastHmdOrientation, FVector& lastHmdPosition, FQuat& hmdOrientation, FVector& hmdPosition) { OSVR_Pose3 pose; OSVR_ReturnCode returnCode; FScopeLock lock(mOSVREntryPoint->GetClientContextMutex()); auto clientContext = mOSVREntryPoint->GetClientContext(); returnCode = osvrClientUpdate(clientContext); check(returnCode == OSVR_RETURN_SUCCESS); returnCode = osvrClientGetViewerPose(DisplayConfig, 0, &pose); if (returnCode == OSVR_RETURN_SUCCESS) { LastHmdOrientation = CurHmdOrientation; LastHmdPosition = CurHmdPosition; CurHmdPosition = BaseOrientation.Inverse().RotateVector(OSVR2FVector(pose.translation, WorldToMetersScale) - BasePosition); CurHmdOrientation = BaseOrientation.Inverse() * OSVR2FQuat(pose.rotation); lastHmdOrientation = LastHmdOrientation; lastHmdPosition = LastHmdPosition; hmdOrientation = CurHmdOrientation; hmdPosition = CurHmdPosition; } else { lastHmdOrientation = hmdOrientation = FQuat::Identity; lastHmdPosition = hmdPosition = FVector(0.0f, 0.0f, 0.0f); } }
void QVRDevice::update() { if (config().processIndex() == QVRManager::processIndex()) { #ifdef HAVE_VRPN if (_internals->vrpnTrackerRemote) _internals->vrpnTrackerRemote->mainloop(); if (_internals->vrpnButtonRemote) _internals->vrpnButtonRemote->mainloop(); if (_internals->vrpnAnalogRemote) _internals->vrpnAnalogRemote->mainloop(); #endif #ifdef HAVE_OCULUS if (_internals->oculusTrackedEye >= 0) { const ovrPosef* p; if (_internals->oculusTrackedEye == 1) p = &(QVROculusRenderPoses[0]); else if (_internals->oculusTrackedEye == 2) p = &(QVROculusRenderPoses[1]); else p = &(QVROculusTrackingState.HeadPose.ThePose); // Note the position Y offset that moves the sitting user's eyes to a default standing height in // the virtual world. _position = QVector3D(p->Position.x, p->Position.y + QVRObserverConfig::defaultEyeHeight, p->Position.z); _orientation = QQuaternion(p->Orientation.w, p->Orientation.x, p->Orientation.y, p->Orientation.z); } #endif #ifdef HAVE_OPENVR if (_internals->openVrTrackedEntity >= 0) { _orientation = QVROpenVRTrackedOrientations[_internals->openVrTrackedEntity]; _position = QVROpenVRTrackedPositions[_internals->openVrTrackedEntity]; } if (_internals->openVrButtonsEntity >= 0) { _buttons[0] = QVROpenVRControllerStates[_internals->openVrButtonsEntity].rAxis[0].y > +0.5f; _buttons[1] = QVROpenVRControllerStates[_internals->openVrButtonsEntity].rAxis[0].y < -0.5f; _buttons[2] = QVROpenVRControllerStates[_internals->openVrButtonsEntity].rAxis[0].x < -0.5f; _buttons[3] = QVROpenVRControllerStates[_internals->openVrButtonsEntity].rAxis[0].x > +0.5f; unsigned long buttonPressed = QVROpenVRControllerStates[_internals->openVrButtonsEntity].ulButtonPressed; _buttons[4] = buttonPressed & vr::ButtonMaskFromId(vr::k_EButton_ApplicationMenu); _buttons[5] = buttonPressed & vr::ButtonMaskFromId(vr::k_EButton_Grip); } if (_internals->openVrAnalogsEntity >= 0) { _analogs[0] = QVROpenVRControllerStates[_internals->openVrAnalogsEntity].rAxis[0].y; _analogs[1] = QVROpenVRControllerStates[_internals->openVrAnalogsEntity].rAxis[0].x; _analogs[2] = QVROpenVRControllerStates[_internals->openVrAnalogsEntity].rAxis[1].x; } #endif #ifdef HAVE_OSVR if (_internals->osvrTrackedEye != -1 || _internals->osvrTrackingInterface) { OSVR_Pose3 pose; bool ok; if (_internals->osvrTrackedEye == 0) { // center eye ok = (osvrClientGetViewerPose(QVROsvrDisplayConfig, 0, &pose) == OSVR_RETURN_SUCCESS); } else if (_internals->osvrTrackedEye == 1) { // left eye ok = (osvrClientGetViewerEyePose(QVROsvrDisplayConfig, 0, 0, &pose) == OSVR_RETURN_SUCCESS); } else if (_internals->osvrTrackedEye == 2) { // right eye OSVR_EyeCount eyes; osvrClientGetNumEyesForViewer(QVROsvrDisplayConfig, 0, &eyes); int e = (eyes == 2 ? 1 : 0); ok = (osvrClientGetViewerEyePose(QVROsvrDisplayConfig, 0, e, &pose) == OSVR_RETURN_SUCCESS); } else { // _internals->osvrTrackingInterface struct OSVR_TimeValue timestamp; ok = (osvrGetPoseState(_internals->osvrTrackingInterface, ×tamp, &pose) == OSVR_RETURN_SUCCESS); } if (ok) { if (_internals->osvrTrackedEye >= 0 && pose.translation.data[1] < 1.1f) { // Assume the user wears a HMD and sits (i.e. no room-scale VR). // In this case, we apply an offset to a default standing observer, // just as we do for Oculus Rift. pose.translation.data[1] += QVRObserverConfig::defaultEyeHeight; } _position = QVector3D(pose.translation.data[0], pose.translation.data[1], pose.translation.data[2]); _orientation = QQuaternion(pose.rotation.data[0], pose.rotation.data[1], pose.rotation.data[2], pose.rotation.data[3]); } } if (_internals->osvrButtonsInterfaces.length() > 0) { OSVR_ButtonState state; struct OSVR_TimeValue timestamp; for (int i = 0; i < _buttons.length(); i++) { if (_internals->osvrButtonsInterfaces[i] && osvrGetButtonState(_internals->osvrButtonsInterfaces[i], ×tamp, &state) == OSVR_RETURN_SUCCESS) { _buttons[i] = state; } } } if (_internals->osvrAnalogsInterfaces.length() > 0) { OSVR_AnalogState state; struct OSVR_TimeValue timestamp; for (int i = 0; i < _analogs.length(); i++) { if (_internals->osvrAnalogsInterfaces[i] && osvrGetAnalogState(_internals->osvrAnalogsInterfaces[i], ×tamp, &state) == OSVR_RETURN_SUCCESS) { _analogs[i] = state; } } } #endif } }