bool OSVRHMDDescription::InitIPD(OSVR_DisplayConfig displayConfig) { OSVR_Pose3 leftEye, rightEye; OSVR_ReturnCode returnCode; returnCode = osvrClientGetViewerEyePose(displayConfig, 0, 0, &leftEye); if (returnCode == OSVR_RETURN_FAILURE) { UE_LOG(OSVRHMDDescriptionLog, Warning, TEXT("osvrClientGetViewerEyePose call failed for left eye")); return false; } returnCode = osvrClientGetViewerEyePose(displayConfig, 0, 1, &rightEye); if (returnCode == OSVR_RETURN_FAILURE) { UE_LOG(OSVRHMDDescriptionLog, Warning, TEXT("osvrClientGetViewerEyePose call failed for right eye")); } double dx = leftEye.translation.data[0] - rightEye.translation.data[0]; double dy = leftEye.translation.data[1] - rightEye.translation.data[1]; double dz = leftEye.translation.data[2] - rightEye.translation.data[2]; m_ipd = FMath::Sqrt(dx * dx + dy * dy + dz * dz); return true; }
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 } }