VRHMDSensorState HMDInfoCardboard::GetSensorState() { // Actual sensor state is calculated on the main thread, // within VRDeviceProxyOrientationFallBack VRHMDSensorState result; result.Clear(); return result; }
VRHMDSensorState VRDisplayOpenVR::GetSensorState(double timeOffset) { { ::vr::VREvent_t event; while (mVRSystem->PollNextEvent(&event, sizeof(event))) { // ignore } } ::vr::TrackedDevicePose_t poses[::vr::k_unMaxTrackedDeviceCount]; // Note: We *must* call WaitGetPoses in order for any rendering to happen at all mVRCompositor->WaitGetPoses(poses, ::vr::k_unMaxTrackedDeviceCount, nullptr, 0); VRHMDSensorState result; result.Clear(); result.timestamp = PR_Now(); if (poses[::vr::k_unTrackedDeviceIndex_Hmd].bDeviceIsConnected && poses[::vr::k_unTrackedDeviceIndex_Hmd].bPoseIsValid && poses[::vr::k_unTrackedDeviceIndex_Hmd].eTrackingResult == ::vr::TrackingResult_Running_OK) { const ::vr::TrackedDevicePose_t& pose = poses[::vr::k_unTrackedDeviceIndex_Hmd]; gfx::Matrix4x4 m; // NOTE! mDeviceToAbsoluteTracking is a 3x4 matrix, not 4x4. But // because of its arrangement, we can copy the 12 elements in and // then transpose them to the right place. We do this so we can // pull out a Quaternion. memcpy(&m._11, &pose.mDeviceToAbsoluteTracking, sizeof(float) * 12); m.Transpose(); gfx::Quaternion rot; rot.SetFromRotationMatrix(m); rot.Invert(); result.flags |= VRDisplayCapabilityFlags::Cap_Orientation; result.orientation[0] = rot.x; result.orientation[1] = rot.y; result.orientation[2] = rot.z; result.orientation[3] = rot.w; result.angularVelocity[0] = pose.vAngularVelocity.v[0]; result.angularVelocity[1] = pose.vAngularVelocity.v[1]; result.angularVelocity[2] = pose.vAngularVelocity.v[2]; result.flags |= VRDisplayCapabilityFlags::Cap_Position; result.position[0] = m._41; result.position[1] = m._42; result.position[2] = m._43; result.linearVelocity[0] = pose.vVelocity.v[0]; result.linearVelocity[1] = pose.vVelocity.v[1]; result.linearVelocity[2] = pose.vVelocity.v[2]; } return result; }
VRHMDSensorState VRDisplayOculus::GetSensorState(double timeOffset) { VRHMDSensorState result; result.Clear(); ovrTrackingState state = ovr_GetTrackingState(mSession, timeOffset, true); ovrPoseStatef& pose(state.HeadPose); result.timestamp = pose.TimeInSeconds; if (state.StatusFlags & ovrStatus_OrientationTracked) { result.flags |= VRDisplayCapabilityFlags::Cap_Orientation; result.orientation[0] = pose.ThePose.Orientation.x; result.orientation[1] = pose.ThePose.Orientation.y; result.orientation[2] = pose.ThePose.Orientation.z; result.orientation[3] = pose.ThePose.Orientation.w; result.angularVelocity[0] = pose.AngularVelocity.x; result.angularVelocity[1] = pose.AngularVelocity.y; result.angularVelocity[2] = pose.AngularVelocity.z; result.flags |= VRDisplayCapabilityFlags::Cap_AngularAcceleration; result.angularAcceleration[0] = pose.AngularAcceleration.x; result.angularAcceleration[1] = pose.AngularAcceleration.y; result.angularAcceleration[2] = pose.AngularAcceleration.z; } if (state.StatusFlags & ovrStatus_PositionTracked) { result.flags |= VRDisplayCapabilityFlags::Cap_Position; result.position[0] = pose.ThePose.Position.x; result.position[1] = pose.ThePose.Position.y; result.position[2] = pose.ThePose.Position.z; result.linearVelocity[0] = pose.LinearVelocity.x; result.linearVelocity[1] = pose.LinearVelocity.y; result.linearVelocity[2] = pose.LinearVelocity.z; result.flags |= VRDisplayCapabilityFlags::Cap_LinearAcceleration; result.linearAcceleration[0] = pose.LinearAcceleration.x; result.linearAcceleration[1] = pose.LinearAcceleration.y; result.linearAcceleration[2] = pose.LinearAcceleration.z; } result.flags |= VRDisplayCapabilityFlags::Cap_External; result.flags |= VRDisplayCapabilityFlags::Cap_Present; return result; }
VRHMDSensorState HMDInfoOculus::GetSensorState(double timeOffset) { VRHMDSensorState result; result.Clear(); // XXX this is the wrong time base for timeOffset; we need to figure out how to synchronize // the Oculus time base and the browser one. ovrTrackingState state = ovr_GetTrackingState(mSession, ovr_GetTimeInSeconds() + timeOffset, true); ovrPoseStatef& pose(state.HeadPose); result.timestamp = pose.TimeInSeconds; if (state.StatusFlags & ovrStatus_OrientationTracked) { result.flags |= VRStateValidFlags::State_Orientation; result.orientation[0] = pose.ThePose.Orientation.x; result.orientation[1] = pose.ThePose.Orientation.y; result.orientation[2] = pose.ThePose.Orientation.z; result.orientation[3] = pose.ThePose.Orientation.w; result.angularVelocity[0] = pose.AngularVelocity.x; result.angularVelocity[1] = pose.AngularVelocity.y; result.angularVelocity[2] = pose.AngularVelocity.z; result.angularAcceleration[0] = pose.AngularAcceleration.x; result.angularAcceleration[1] = pose.AngularAcceleration.y; result.angularAcceleration[2] = pose.AngularAcceleration.z; } if (state.StatusFlags & ovrStatus_PositionTracked) { result.flags |= VRStateValidFlags::State_Position; result.position[0] = pose.ThePose.Position.x; result.position[1] = pose.ThePose.Position.y; result.position[2] = pose.ThePose.Position.z; result.linearVelocity[0] = pose.LinearVelocity.x; result.linearVelocity[1] = pose.LinearVelocity.y; result.linearVelocity[2] = pose.LinearVelocity.z; result.linearAcceleration[0] = pose.LinearAcceleration.x; result.linearAcceleration[1] = pose.LinearAcceleration.y; result.linearAcceleration[2] = pose.LinearAcceleration.z; } mLastTrackingState = state; return result; }
VRHMDSensorState VRDisplayOSVR::GetSensorState() { //update client context before anything //this usually goes into app's mainloop osvr_ClientUpdate(*m_ctx); VRHMDSensorState result; OSVR_TimeValue timestamp; result.Clear(); OSVR_OrientationState orientation; OSVR_ReturnCode ret = osvr_GetOrientationState(*m_iface, ×tamp, &orientation); result.timestamp = timestamp.seconds; if (ret == OSVR_RETURN_SUCCESS) { result.flags |= VRDisplayCapabilityFlags::Cap_Orientation; result.orientation[0] = orientation.data[1]; result.orientation[1] = orientation.data[2]; result.orientation[2] = orientation.data[3]; result.orientation[3] = orientation.data[0]; } OSVR_PositionState position; ret = osvr_GetPositionState(*m_iface, ×tamp, &position); if (ret == OSVR_RETURN_SUCCESS) { result.flags |= VRDisplayCapabilityFlags::Cap_Position; result.position[0] = position.data[0]; result.position[1] = position.data[1]; result.position[2] = position.data[2]; } return result; }