diff options
Diffstat (limited to 'Samples/OculusWorldDemo')
-rw-r--r-- | Samples/OculusWorldDemo/OculusWorldDemo.cpp | 306 | ||||
-rw-r--r-- | Samples/OculusWorldDemo/Player.cpp | 2 |
2 files changed, 78 insertions, 230 deletions
diff --git a/Samples/OculusWorldDemo/OculusWorldDemo.cpp b/Samples/OculusWorldDemo/OculusWorldDemo.cpp index 613cdac..1a81c8d 100644 --- a/Samples/OculusWorldDemo/OculusWorldDemo.cpp +++ b/Samples/OculusWorldDemo/OculusWorldDemo.cpp @@ -122,6 +122,9 @@ public: void AdjustDistortionK2(float dt) { AdjustDistortion(dt, 2, "K2"); } void AdjustDistortionK3(float dt) { AdjustDistortion(dt, 3, "K3"); } + void AdjustDistortion(float val, int kIndex); + void AdjustEsd(float val); + // Adds room model to scene. void PopulateScene(const char* fileName); void PopulatePreloadScene(); @@ -137,10 +140,6 @@ protected: int Screen; int FirstScreenInCycle; - // Magnetometer calibration and yaw correction - Util::MagCalibration MagCal; - bool MagAwaitingForwardLook; - // *** Oculus HMD Variables Ptr<DeviceManager> pManager; Ptr<SensorDevice> pSensor; @@ -253,11 +252,6 @@ protected: void RaiseLOD(); void CycleDisplay(); void GamepadStateChanged(const GamepadState& pad); - - // Variable used by UpdateManualCalibration - Anglef FirstMagYaw; - int ManualMagCalStage; - int ManualMagFailures; }; //------------------------------------------------------------------------------------- @@ -679,9 +673,6 @@ void OculusWorldDemoApp::OnKey(OVR::KeyCode key, int chr, bool down, int modifie case Key_R: SFusion.Reset(); - if (MagCal.IsAutoCalibrating() || MagCal.IsManuallyCalibrating()) - MagCal.AbortCalibration(); - SetAdjustMessage("Sensor Fusion Reset"); break; @@ -742,19 +733,11 @@ void OculusWorldDemoApp::OnKey(OVR::KeyCode key, int chr, bool down, int modifie case Key_Escape: if(!down) { - if (MagCal.IsAutoCalibrating() || MagCal.IsManuallyCalibrating()) - { - MagCal.AbortCalibration(); - SetAdjustMessage("Aborting Magnetometer Calibration"); - } - else - { - // switch to primary screen windowed mode - pPlatform->SetFullscreen(RenderParams, Display_Window); - RenderParams.Display = pPlatform->GetDisplay(0); - pRender->SetParams(RenderParams); - Screen = 0; - } + // switch to primary screen windowed mode + pPlatform->SetFullscreen(RenderParams, Display_Window); + RenderParams.Display = pPlatform->GetDisplay(0); + pRender->SetParams(RenderParams); + Screen = 0; } break; @@ -952,27 +935,28 @@ void OculusWorldDemoApp::OnKey(OVR::KeyCode key, int chr, bool down, int modifie DropLOD(); break; */ - // Start calibrating magnetometer - case Key_Z: - if (down) - { - ManualMagCalStage = 0; - if (MagCal.IsManuallyCalibrating()) - MagAwaitingForwardLook = false; - else - { - MagCal.BeginManualCalibration(SFusion); - MagAwaitingForwardLook = true; - } - } - break; - case Key_X: - if (down) - { - MagCal.BeginAutoCalibration(SFusion); - SetAdjustMessage("Starting Auto Mag Calibration"); - } + // Cycle through drift correction options + case Key_Z: + if (down) + { + if (SFusion.IsYawCorrectionEnabled()) + { + SFusion.SetGravityEnabled(false); + SFusion.SetYawCorrectionEnabled(false); + } + else if (SFusion.IsGravityEnabled()) + { + SFusion.SetYawCorrectionEnabled(true); + } + else + { + SFusion.SetGravityEnabled(true); + } + SetAdjustMessage("Tilt Correction %s\nYaw Correction %s", + SFusion.IsGravityEnabled() ? "On" : "Off", + SFusion.IsYawCorrectionEnabled() ? "On" : "Off"); + } break; // Show view of yaw angles (for mag calibration/analysis) @@ -1093,11 +1077,21 @@ void OculusWorldDemoApp::OnIdle() if (!pSensor) { pSensor = *desc.Handle.CreateDeviceTyped<SensorDevice>(); - SFusion.AttachToSensor(pSensor); - - SetAdjustMessage("---------------------------\n" - "SENSOR connected\n" - "---------------------------"); + if (pSensor) + { + SFusion.AttachToSensor(pSensor); + + SetAdjustMessage("---------------------------\n" + "SENSOR connected\n" + "---------------------------"); + } + else + { + SetAdjustMessage("----------------------------\n" + "SENSOR connect failed\n" + "Unplug and reconnect it.\n" + "----------------------------"); + } } else if (!wasAlreadyCreated) { @@ -1200,27 +1194,6 @@ void OculusWorldDemoApp::OnIdle() (this->*pAdjustFunc)(dt * AdjustDirection * (ShiftDown ? 5.0f : 1.0f)); } - // Magnetometer calibration procedure - if (MagCal.IsManuallyCalibrating()) - UpdateManualMagCalibration(); - - if (MagCal.IsAutoCalibrating()) - { - MagCal.UpdateAutoCalibration(SFusion); - int n = MagCal.NumberOfSamples(); - if (n == 1) - SetAdjustMessage(" Magnetometer Calibration Has 1 Sample \n %d Remaining - Please Keep Looking Around ",4-n); - else if (n < 4) - SetAdjustMessage(" Magnetometer Calibration Has %d Samples \n %d Remaining - Please Keep Looking Around ",n,4-n); - if (MagCal.IsCalibrated()) - { - SFusion.SetYawCorrectionEnabled(true); - Vector3f mc = MagCal.GetMagCenter(); - SetAdjustMessage(" Magnetometer Calibration Complete \nCenter: %f %f %f",mc.x,mc.y,mc.z); - } - } - - // Process latency tester results. const char* results = LatencyUtil.GetResultsString(); if (results != NULL) @@ -1341,127 +1314,10 @@ void OculusWorldDemoApp::OnIdle() } -void OculusWorldDemoApp::UpdateManualMagCalibration() -{ - float tyaw, pitch, roll; - Anglef yaw; - Quatf hmdOrient = SFusion.GetOrientation(); - hmdOrient.GetEulerAngles<Axis_Y, Axis_X, Axis_Z>(&tyaw, &pitch, &roll); - Vector3f mag = SFusion.GetMagnetometer(); - float dtr = Math<float>::DegreeToRadFactor; - yaw.Set(tyaw); // Using Angle class to handle angle wraparound arithmetic - - const int timeout = 100; - - switch(ManualMagCalStage) - { - case 0: - if (MagAwaitingForwardLook) - SetAdjustMessage("Magnetometer Calibration\n** Step 1: Please Look Forward **\n** and Press Z When Ready **"); - else - if (fabs(pitch) < 10.0f*dtr) - { - MagCal.InsertIfAcceptable(hmdOrient, mag); - FirstMagYaw = yaw; - MagAwaitingForwardLook = false; - if (MagCal.NumberOfSamples() == 1) - { - ManualMagCalStage = 1; - ManualMagFailures = 0; - } - } - else - MagAwaitingForwardLook = true; - break; - case 1: - SetAdjustMessage("Magnetometer Calibration\n** Step 2: Please Look Up **"); - yaw -= FirstMagYaw; - if ((pitch > 50.0f*dtr) && (yaw.Abs() < 20.0f*dtr)) - { - MagCal.InsertIfAcceptable(hmdOrient, mag); - ManualMagFailures++; - if ((MagCal.NumberOfSamples() == 2)||(ManualMagFailures > timeout)) - { - ManualMagCalStage = 2; - ManualMagFailures = 0; - } - } - break; - case 2: - SetAdjustMessage("Magnetometer Calibration\n** Step 3: Please Look Left **"); - yaw -= FirstMagYaw; - if (yaw.Get() > 60.0f*dtr) - { - MagCal.InsertIfAcceptable(hmdOrient, mag); - ManualMagFailures++; - if ((MagCal.NumberOfSamples() == 3)||(ManualMagFailures > timeout)) - { - ManualMagCalStage = 3; - ManualMagFailures = 0; - } - } - break; - case 3: - SetAdjustMessage("Magnetometer Calibration\n** Step 4: Please Look Right **"); - yaw -= FirstMagYaw; - if (yaw.Get() < -60.0f*dtr) - { - MagCal.InsertIfAcceptable(hmdOrient, mag); - ManualMagFailures++; - if (MagCal.NumberOfSamples() == 4) - ManualMagCalStage = 6; - else - { - if (ManualMagFailures > timeout) - { - ManualMagCalStage = 4; - ManualMagFailures = 0; - } - } - } - break; - case 4: - SetAdjustMessage("Magnetometer Calibration\n** Step 5: Please Look Upper Right **"); - yaw -= FirstMagYaw; - if ((yaw.Get() < -50.0f*dtr) && (pitch > 40.0f*dtr)) - { - MagCal.InsertIfAcceptable(hmdOrient, mag); - if (MagCal.NumberOfSamples() == 4) - ManualMagCalStage = 6; - else - { - if (ManualMagFailures > timeout) - { - ManualMagCalStage = 5; - ManualMagFailures = 0; - } - else - ManualMagFailures++; - } - } - break; - case 5: - SetAdjustMessage("Calibration Failed\n** Try Again From Another Location **"); - MagCal.AbortCalibration(); - break; - case 6: - if (!MagCal.IsCalibrated()) - { - MagCal.SetCalibration(SFusion); - SFusion.SetYawCorrectionEnabled(true); - Vector3f mc = MagCal.GetMagCenter(); - SetAdjustMessage(" Magnetometer Calibration and Activation \nCenter: %f %f %f", - mc.x,mc.y,mc.z); - } - } -} - - - -static const char* HelpText = - "F1 \t100 NoStereo \t420 Z \t520 Manual Mag Calib\n" - "F2 \t100 Stereo \t420 X \t520 Auto Mag Calib\n" - "F3 \t100 StereoHMD \t420 F6 \t520 Yaw Drift Info\n" +static const char* HelpText = + "F1 \t100 NoStereo\n" + "F2 \t100 Stereo \t420 Z \t520 Drift Correction\n" + "F3 \t100 StereoHMD \t420 F6 \t520 Yaw Drift Info\n" "F4 \t100 MSAA \t420 R \t520 Reset SensorFusion\n" "F9 \t100 FullScreen \t420\n" "F11 \t100 Fast FullScreen \t500 - + \t660 Adj EyeHeight\n" @@ -1518,20 +1374,11 @@ void OculusWorldDemoApp::Render(const StereoEyeParams& stereo) if (SceneMode == Scene_YawView) { - Matrix4f calView = Matrix4f(); - float viewYaw = -ThePlayer.LastSensorYaw + SFusion.GetMagRefYaw(); - calView.M[0][0] = calView.M[2][2] = cos(viewYaw); - calView.M[0][2] = sin(viewYaw); - calView.M[2][0] = -sin(viewYaw); - //LogText("yaw: %f\n",SFusion.GetMagRefYaw()); - - if (SFusion.IsYawCorrectionInProgress()) - YawMarkGreenScene.Render(pRender, stereo.ViewAdjust); - else - YawMarkRedScene.Render(pRender, stereo.ViewAdjust); - - if (fabs(ThePlayer.EyePitch) < Math<float>::Pi * 0.33) - YawLinesScene.Render(pRender, stereo.ViewAdjust * calView); + Matrix4f trackerOnlyOrient = Matrix4f::RotationY(ThePlayer.LastSensorYaw) + * Matrix4f::RotationX(ThePlayer.EyePitch) + * Matrix4f::RotationZ(ThePlayer.EyeRoll); + YawLinesScene.Render(pRender, stereo.ViewAdjust * trackerOnlyOrient.Inverted()); + //YawMarkRedScene.Render(pRender, stereo.ViewAdjust); } // *** 2D Text & Grid - Configure Orthographic rendering. @@ -1702,6 +1549,18 @@ void OculusWorldDemoApp::AdjustMotionPrediction(float dt) SetAdjustMessage("MotionPrediction: %6.3fs", motionPred); } +void OculusWorldDemoApp::AdjustDistortion(float val, int kIndex) +{ + SConfig.SetDistortionK(kIndex, val); + SetAdjustMessage("K%d: %6.4f", kIndex, SConfig.GetDistortionK(kIndex)); +} + +void OculusWorldDemoApp::AdjustEsd(float val) +{ + SConfig.SetEyeToScreenDistance(val); + float esd = SConfig.GetEyeToScreenDistance(); + SetAdjustMessage("ESD:%6.3f FOV: %6.3f", esd, SConfig.GetYFOVDegrees()); +} // Loads the scene data void OculusWorldDemoApp::PopulateScene(const char *fileName) @@ -1728,30 +1587,19 @@ void OculusWorldDemoApp::PopulateScene(const char *fileName) Ptr<Model> yawMarkRedModel = *Model::CreateBox(Color(255, 0, 0, 255), Vector3f(0.0f, shifty, -2.0f), Vector3f(0.05f, 0.05f, 0.05f)); YawMarkRedScene.World.Add(yawMarkRedModel); - Ptr<Model> yawLinesModel = *new Model(Prim_Lines); - float r = 2.0f; - float theta0 = Math<float>::PiOver2; - float theta1 = 0.0f; + Ptr<Model> yawLinesModel = *new Model(); Color c = Color(255, 200, 200, 255); - for (int i = 0; i < 35; i++) - { - theta1 = theta0 + Math<float>::Pi / 18.0f; - yawLinesModel->AddLine(yawLinesModel->AddVertex(Vector3f(r*cos(theta0),shifty,-r*sin(theta0)),c), - yawLinesModel->AddVertex(Vector3f(r*cos(theta1),shifty,-r*sin(theta1)),c)); - theta0 = theta1; - yawLinesModel->AddLine(yawLinesModel->AddVertex(Vector3f(r*cos(theta0),shifty,-r*sin(theta0)),c), - yawLinesModel->AddVertex(Vector3f(r*cos(theta0),shifty+0.1f,-r*sin(theta0)),c)); - theta0 = theta1; - } - theta1 = theta0 + Math<float>::Pi / 18.0f; - yawLinesModel->AddLine(yawLinesModel->AddVertex(Vector3f(r*cos(theta0),shifty,-r*sin(theta0)),c), - yawLinesModel->AddVertex(Vector3f(r*cos(theta1),shifty,-r*sin(theta1)),c)); - yawLinesModel->AddLine(yawLinesModel->AddVertex(Vector3f(0.0f,shifty+0.1f,-r),c), - yawLinesModel->AddVertex(Vector3f(r*sin(0.02f),shifty,-r*cos(0.02f)),c)); - yawLinesModel->AddLine(yawLinesModel->AddVertex(Vector3f(0.0f,shifty+0.1f,-r),c), - yawLinesModel->AddVertex(Vector3f(r*sin(-0.02f),shifty,-r*cos(-0.02f)),c)); - yawLinesModel->SetPosition(Vector3f(0.0f,0.0f,0.0f)); - + float r = 1.5f; + yawLinesModel->AddTriangle(yawLinesModel->AddVertex(Vector3f(-0.1f, 0, -r), c), + yawLinesModel->AddVertex(Vector3f(0, 0, -r-0.2f), c), + yawLinesModel->AddVertex(Vector3f(0.1f, 0, -r), c)); + yawLinesModel->AddTriangle(yawLinesModel->AddVertex(Vector3f(-r-0.1f, 0, -r), c), + yawLinesModel->AddVertex(Vector3f(-r, 0, -r-0.2f), c), + yawLinesModel->AddVertex(Vector3f(-r+0.1f, 0, -r), c)); + yawLinesModel->AddTriangle(yawLinesModel->AddVertex(Vector3f(r-0.1f, 0, -r), c), + yawLinesModel->AddVertex(Vector3f(r, 0, -r-0.2f), c), + yawLinesModel->AddVertex(Vector3f(r+0.1f, 0, -r), c)); + yawLinesModel->SetPosition(Vector3f(0.0f,-1.2f,0.0f)); YawLinesScene.World.Add(yawLinesModel); } diff --git a/Samples/OculusWorldDemo/Player.cpp b/Samples/OculusWorldDemo/Player.cpp index 6422920..b910307 100644 --- a/Samples/OculusWorldDemo/Player.cpp +++ b/Samples/OculusWorldDemo/Player.cpp @@ -124,7 +124,7 @@ void Player::HandleCollision(double dt, Array<Ptr<CollisionModel> >* collisionMo { // Project orientationVector onto the plane Vector3f slideVector = orientationVector - collisionPlaneForward.N - * (orientationVector * collisionPlaneForward.N); + * (orientationVector.Dot(collisionPlaneForward.N)); // Make sure we aren't in a corner for(unsigned int j = 0; j < collisionModels->GetSize(); ++j) |