void OculusWorldDemoApp::OnIdle() { double curtime = pPlatform->GetAppTime(); float dt = float(curtime - LastUpdate); LastUpdate = curtime; if (LoadingState == LoadingState_DoLoad) { LoadingState = LoadingState_Finished; return; } // If one of Stereo setting adjustment keys is pressed, adjust related state. if (pAdjustFunc) { (this->*pAdjustFunc)(dt * AdjustDirection * (ShiftDown ? 5.0f : 1.0f)); } // Rotate and position View Camera, using YawPitchRoll in BodyFrame coordinates. // Matrix4f rollPitchYaw = Matrix4f::RotationY(0) * Matrix4f::RotationX(0) * Matrix4f::RotationZ(0); // YAW PITCH ROLL const Vector3f UpVector(0.0f, 1.0f, 0.0f); const Vector3f ForwardVector(0.0f, 0.0f, -1.0f); Vector3f up = rollPitchYaw.Transform(UpVector); Vector3f forward = rollPitchYaw.Transform(ForwardVector); // Minimal head modeling; should be moved as an option to SensorFusion. float headBaseToEyeHeight = 0.15f; // Vertical height of eye from base of head float headBaseToEyeProtrusion = 0.09f; // Distance forward of eye from base of head Vector3f eyeCenterInHeadFrame(0.0f, headBaseToEyeHeight, -headBaseToEyeProtrusion); Vector3f shiftedEyePos = rollPitchYaw.Transform(eyeCenterInHeadFrame); shiftedEyePos.y -= eyeCenterInHeadFrame.y; // Bring the head back down to original height View = Matrix4f::LookAtRH(shiftedEyePos, shiftedEyePos + forward, up); // Transformation without head modeling. // View = Matrix4f::LookAtRH(EyePos, EyePos + forward, up); // This is an alternative to LookAtRH: // Here we transpose the rotation matrix to get its inverse. // View = (Matrix4f::RotationY(EyeYaw) * Matrix4f::RotationX(EyePitch) * // Matrix4f::RotationZ(EyeRoll)).Transposed() * // Matrix4f::Translation(-EyePos); //case Stereo_LeftDouble_Multipass: Render(SConfig.GetEyeRenderParams(StereoEye_Left)); Render(SConfig.GetEyeRenderParams(StereoEye_Right)); pRender->Present(); // Force GPU to flush the scene, resulting in the lowest possible latency. pRender->ForceFlushGPU(); }
void InputTestApp::OnIdle() { double curtime = pPlatform->GetAppTime(); // float dt = float(LastUpdate - curtime); LastUpdate = curtime; if (pBox) { Quatf q = SFusion.GetOrientation(); pBox->SetOrientation(q); // Test Euler conversion, alternative to the above: // Vector3f euler; // SFusion.GetOrientation().GetEulerABC<Axis_Y, Axis_X, Axis_Z, Rotate_CCW, Handed_R>(&euler.y, &euler.x, &euler.z); // Matrix4f mat = Matrix4f::RotationY(euler.y) * Matrix4f::RotationX(euler.x) * Matrix4f::RotationZ(euler.z); // pBox->SetMatrix(mat); // Update titlebar every 20th of a second. if ((curtime - LastTitleUpdate) > 0.05f) { char titleBuffer[512]; SensorDevice::CoordinateFrame coord = SensorDevice::Coord_Sensor; if (pSensor) coord = pSensor->GetCoordinateFrame(); OVR_sprintf(titleBuffer, 512, "OVR SensorBox %s %s Ang: %0.3f", (SFusion.IsGravityEnabled() ? "" : "[Grav Off]"), (coord == SensorDevice::Coord_HMD) ? "[HMD Coord]" : "", CalcDownAngleDegrees(q)); pPlatform->SetWindowTitle(titleBuffer); LastTitleUpdate = curtime; } } if (pBox2) { pBox2->SetOrientation(SFusion2.GetOrientation()); } // Render int w, h; pPlatform->GetWindowSize(&w, &h); pRender->SetViewport(0, 0, w, h); pRender->Clear(); pRender->BeginScene(); pRender->SetProjection(Proj); pRender->SetDepthMode(1,1); Sc.Render(pRender, View); pRender->Present(); }
void InputTestApp::OnIdle() { double curtime = pPlatform->GetAppTime(); time_t t = time(0); // get time now struct tm * now = localtime(&t); // float dt = float(LastUpdate - curtime); LastUpdate = curtime; if (pBox) { Vector3f acceldata = SFusion.GetAcceleration(); Vector3f gyrodata = SFusion.GetAngularVelocity(); Vector3f magdata = SFusion.GetMagnetometer(); Quatf q = SFusion.GetOrientation(); pBox->SetOrientation(q); //fstream outFile; //outFile.open("C://Users//Barrett//Documents//oculus_sensor_data.txt"); // Output the sensor data to the text file ofstream outFile("C://Users//Barrett//Documents//oculus_sensor_data.csv", ios::app); outFile << \ now->tm_sec << "," << \ curtime << "," << \ acceldata.x << "," << acceldata.y << "," << acceldata.z << "," << \ gyrodata.x << "," << gyrodata.y << "," << gyrodata.z << "," << \ magdata.x << "," << magdata.y << "," << magdata.z << "," << \ q.x << "," << q.y << "," << q.z << q.w << "\n"; // Test Euler conversion, alternative to the above: // Vector3f euler; // SFusion.GetOrientation().GetEulerABC<Axis_Y, Axis_X, Axis_Z, Rotate_CCW, Handed_R>(&euler.y, &euler.x, &euler.z); // Matrix4f mat = Matrix4f::RotationY(euler.y) * Matrix4f::RotationX(euler.x) * Matrix4f::RotationZ(euler.z); // pBox->SetMatrix(mat); // Update titlebar every 20th of a second. if ((curtime - LastTitleUpdate) > 0.05f) { char titleBuffer[512]; SensorDevice::CoordinateFrame coord = SensorDevice::Coord_Sensor; if (pSensor) coord = pSensor->GetCoordinateFrame(); OVR_sprintf(titleBuffer, 512, "OVR SensorBox %s %s Ang: %0.3f", (SFusion.IsGravityEnabled() ? "" : "[Grav Off]"), (coord == SensorDevice::Coord_HMD) ? "[HMD Coord]" : "", CalcDownAngleDegrees(q)); pPlatform->SetWindowTitle(titleBuffer); LastTitleUpdate = curtime; } } if (pBox2) { pBox2->SetOrientation(SFusion2.GetOrientation()); } // Render int w, h; pPlatform->GetWindowSize(&w, &h); pRender->SetViewport(0, 0, w, h); pRender->Clear(); pRender->BeginScene(); pRender->SetProjection(Proj); pRender->SetDepthMode(1,1); Sc.Render(pRender, View); pRender->Present(); }