From ffc1c334556f51762b4f6a1a8e9a3bf0a98c366c Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Thu, 6 Jun 2013 17:25:52 -0700 Subject: [PATCH 1/6] Removed double negation for coordinates, world aligned orientation -> camera orientation, removed roll. --- interface/src/Application.cpp | 4 ++-- interface/src/Head.cpp | 5 ++--- interface/src/Head.h | 2 +- interface/src/SerialInterface.cpp | 10 +++++----- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c85e8ecd96..0480a4a087 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -311,11 +311,11 @@ void Application::paintGL() { } else if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) { _myCamera.setTightness(0.0f); // In first person, camera follows head exactly without delay _myCamera.setTargetPosition(_myAvatar.getBallPosition(AVATAR_JOINT_HEAD_BASE)); - _myCamera.setTargetRotation(_myAvatar.getHead().getWorldAlignedOrientation()); + _myCamera.setTargetRotation(_myAvatar.getHead().getCameraOrientation()); } else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) { _myCamera.setTargetPosition(_myAvatar.getHeadJointPosition()); - _myCamera.setTargetRotation(_myAvatar.getHead().getWorldAlignedOrientation()); + _myCamera.setTargetRotation(_myAvatar.getHead().getCameraOrientation()); } // Update camera position diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 44a8ef299d..b4459f52b3 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -314,10 +314,9 @@ glm::quat Head::getOrientation() const { glm::vec3(_pitch, -_yaw, -_roll) : glm::vec3(_pitch, _yaw, _roll))); } -glm::quat Head::getWorldAlignedOrientation () const { +glm::quat Head::getCameraOrientation () const { Avatar* owningAvatar = static_cast(_owningAvatar); - return owningAvatar->getWorldAlignedOrientation() * glm::quat(glm::radians(_lookingInMirror ? - glm::vec3(_pitch, -_yaw, -_roll) : glm::vec3(_pitch, _yaw, _roll))); + return owningAvatar->getWorldAlignedOrientation() * glm::quat(glm::radians(glm::vec3(_pitch, _yaw, 0.0f))); } void Head::renderHeadSphere() { diff --git a/interface/src/Head.h b/interface/src/Head.h index 66ce07d133..65f944205b 100644 --- a/interface/src/Head.h +++ b/interface/src/Head.h @@ -47,7 +47,7 @@ public: void setRenderLookatVectors(bool onOff ) { _renderLookatVectors = onOff; } glm::quat getOrientation() const; - glm::quat getWorldAlignedOrientation () const; + glm::quat getCameraOrientation () const; glm::vec3 getRightDirection() const { return getOrientation() * IDENTITY_RIGHT; } glm::vec3 getUpDirection () const { return getOrientation() * IDENTITY_UP; } diff --git a/interface/src/SerialInterface.cpp b/interface/src/SerialInterface.cpp index 8c765544fd..b585e4b428 100644 --- a/interface/src/SerialInterface.cpp +++ b/interface/src/SerialInterface.cpp @@ -215,7 +215,7 @@ void SerialInterface::readData(float deltaTime) { // From MPU-9150 register map, with setting on // highest resolution = +/- 2G - _lastAcceleration = glm::vec3(-accelXRate, -accelYRate, -accelZRate) * LSB_TO_METERS_PER_SECOND2; + _lastAcceleration = glm::vec3(accelXRate, accelYRate, accelZRate) * LSB_TO_METERS_PER_SECOND2; int rollRate, yawRate, pitchRate; @@ -225,9 +225,9 @@ void SerialInterface::readData(float deltaTime) { // Convert the integer rates to floats const float LSB_TO_DEGREES_PER_SECOND = 1.f / 16.4f; // From MPU-9150 register map, 2000 deg/sec. - _lastRotationRates[0] = ((float) -pitchRate) * LSB_TO_DEGREES_PER_SECOND; - _lastRotationRates[1] = ((float) -yawRate) * LSB_TO_DEGREES_PER_SECOND; - _lastRotationRates[2] = ((float) -rollRate) * LSB_TO_DEGREES_PER_SECOND; + _lastRotationRates[0] = ((float) pitchRate) * LSB_TO_DEGREES_PER_SECOND; + _lastRotationRates[1] = ((float) yawRate) * LSB_TO_DEGREES_PER_SECOND; + _lastRotationRates[2] = ((float) rollRate) * LSB_TO_DEGREES_PER_SECOND; // Update raw rotation estimates glm::quat estimatedRotation = glm::quat(glm::radians(_estimatedRotation)) * @@ -264,7 +264,7 @@ void SerialInterface::readData(float deltaTime) { 1.0f / SENSOR_FUSION_SAMPLES); // Without a compass heading, always decay estimated Yaw slightly - const float YAW_DECAY = 0.995; + const float YAW_DECAY = 0.999f; glm::vec3 forward = estimatedRotation * glm::vec3(0.0f, 0.0f, -1.0f); estimatedRotation = safeMix(glm::angleAxis(glm::degrees(atan2f(forward.x, -forward.z)), glm::vec3(0.0f, 1.0f, 0.0f)) * estimatedRotation, estimatedRotation, YAW_DECAY); From e0e94481c9d9d221dedeb174686373ebb8b33f47 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Thu, 6 Jun 2013 17:53:00 -0700 Subject: [PATCH 2/6] Add pitch/yaw scale preference to control degree of view rotation. --- interface/src/Application.cpp | 14 ++++++++++++-- interface/src/Application.h | 1 + interface/src/Head.cpp | 5 +++-- interface/src/Head.h | 2 +- interface/src/SerialInterface.cpp | 8 ++++---- 5 files changed, 21 insertions(+), 9 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0480a4a087..970e5a77c8 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -144,6 +145,7 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : _viewFrustumOffsetUp(0.0), _audioScope(256, 200, true), _manualFirstPerson(false), + _headCameraPitchYawScale(0.0f), _mouseX(0), _mouseY(0), _mousePressed(false), @@ -311,11 +313,11 @@ void Application::paintGL() { } else if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) { _myCamera.setTightness(0.0f); // In first person, camera follows head exactly without delay _myCamera.setTargetPosition(_myAvatar.getBallPosition(AVATAR_JOINT_HEAD_BASE)); - _myCamera.setTargetRotation(_myAvatar.getHead().getCameraOrientation()); + _myCamera.setTargetRotation(_myAvatar.getHead().getCameraOrientation(_headCameraPitchYawScale)); } else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) { _myCamera.setTargetPosition(_myAvatar.getHeadJointPosition()); - _myCamera.setTargetRotation(_myAvatar.getHead().getCameraOrientation()); + _myCamera.setTargetRotation(_myAvatar.getHead().getCameraOrientation(_headCameraPitchYawScale)); } // Update camera position @@ -1026,6 +1028,10 @@ void Application::editPreferences() { avatarURL->setMinimumWidth(400); form->addRow("Avatar URL:", avatarURL); + QDoubleSpinBox* headCameraPitchYawScale = new QDoubleSpinBox(); + headCameraPitchYawScale->setValue(_headCameraPitchYawScale); + form->addRow("Head Camera Pitch/Yaw Scale:", headCameraPitchYawScale); + QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); dialog.connect(buttons, SIGNAL(accepted()), SLOT(accept())); dialog.connect(buttons, SIGNAL(rejected()), SLOT(reject())); @@ -1038,6 +1044,8 @@ void Application::editPreferences() { _settings->setValue("avatarURL", url); _myAvatar.getVoxels()->setVoxelURL(url); sendAvatarVoxelURLMessage(url); + + _headCameraPitchYawScale = headCameraPitchYawScale->value(); } void Application::pair() { @@ -2538,6 +2546,7 @@ void Application::loadSettings(QSettings* set) { scanMenuBar(&Application::loadAction, set); getAvatar()->loadData(set); + _headCameraPitchYawScale = set->value("headCameraPitchYawScale").toFloat(); } void Application::saveSettings(QSettings* set) { @@ -2545,6 +2554,7 @@ void Application::saveSettings(QSettings* set) { scanMenuBar(&Application::saveAction, set); getAvatar()->saveData(set); + set->setValue("headCameraPitchYawScale", _headCameraPitchYawScale); } void Application::importSettings() { diff --git a/interface/src/Application.h b/interface/src/Application.h index 15fe56c8f8..63a32d35e7 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -248,6 +248,7 @@ private: int _headMouseX, _headMouseY; bool _manualFirstPerson; + float _headCameraPitchYawScale; HandControl _handControl; diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index b4459f52b3..d58c29f84d 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -314,9 +314,10 @@ glm::quat Head::getOrientation() const { glm::vec3(_pitch, -_yaw, -_roll) : glm::vec3(_pitch, _yaw, _roll))); } -glm::quat Head::getCameraOrientation () const { +glm::quat Head::getCameraOrientation (float pitchYawScale) const { Avatar* owningAvatar = static_cast(_owningAvatar); - return owningAvatar->getWorldAlignedOrientation() * glm::quat(glm::radians(glm::vec3(_pitch, _yaw, 0.0f))); + return owningAvatar->getWorldAlignedOrientation() * glm::quat(glm::radians(glm::vec3( + _pitch * pitchYawScale, _yaw * pitchYawScale, 0.0f))); } void Head::renderHeadSphere() { diff --git a/interface/src/Head.h b/interface/src/Head.h index 65f944205b..4150cbbc50 100644 --- a/interface/src/Head.h +++ b/interface/src/Head.h @@ -47,7 +47,7 @@ public: void setRenderLookatVectors(bool onOff ) { _renderLookatVectors = onOff; } glm::quat getOrientation() const; - glm::quat getCameraOrientation () const; + glm::quat getCameraOrientation (float pitchYawScale) const; glm::vec3 getRightDirection() const { return getOrientation() * IDENTITY_RIGHT; } glm::vec3 getUpDirection () const { return getOrientation() * IDENTITY_UP; } diff --git a/interface/src/SerialInterface.cpp b/interface/src/SerialInterface.cpp index b585e4b428..28ae7eceb4 100644 --- a/interface/src/SerialInterface.cpp +++ b/interface/src/SerialInterface.cpp @@ -215,7 +215,7 @@ void SerialInterface::readData(float deltaTime) { // From MPU-9150 register map, with setting on // highest resolution = +/- 2G - _lastAcceleration = glm::vec3(accelXRate, accelYRate, accelZRate) * LSB_TO_METERS_PER_SECOND2; + _lastAcceleration = glm::vec3(-accelXRate, -accelYRate, -accelZRate) * LSB_TO_METERS_PER_SECOND2; int rollRate, yawRate, pitchRate; @@ -225,9 +225,9 @@ void SerialInterface::readData(float deltaTime) { // Convert the integer rates to floats const float LSB_TO_DEGREES_PER_SECOND = 1.f / 16.4f; // From MPU-9150 register map, 2000 deg/sec. - _lastRotationRates[0] = ((float) pitchRate) * LSB_TO_DEGREES_PER_SECOND; - _lastRotationRates[1] = ((float) yawRate) * LSB_TO_DEGREES_PER_SECOND; - _lastRotationRates[2] = ((float) rollRate) * LSB_TO_DEGREES_PER_SECOND; + _lastRotationRates[0] = ((float) -pitchRate) * LSB_TO_DEGREES_PER_SECOND; + _lastRotationRates[1] = ((float) -yawRate) * LSB_TO_DEGREES_PER_SECOND; + _lastRotationRates[2] = ((float) -rollRate) * LSB_TO_DEGREES_PER_SECOND; // Update raw rotation estimates glm::quat estimatedRotation = glm::quat(glm::radians(_estimatedRotation)) * From ce68c1a6a4f6e90440ad87dc7a8d4846d1d1e065 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Thu, 6 Jun 2013 18:03:38 -0700 Subject: [PATCH 3/6] Think this needs to be a double. --- interface/src/Application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 970e5a77c8..b1b1ea826c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2546,7 +2546,7 @@ void Application::loadSettings(QSettings* set) { scanMenuBar(&Application::loadAction, set); getAvatar()->loadData(set); - _headCameraPitchYawScale = set->value("headCameraPitchYawScale").toFloat(); + _headCameraPitchYawScale = set->value("headCameraPitchYawScale").toDouble(); } void Application::saveSettings(QSettings* set) { From 1b698b24e2cf93eec6f6b69e8d2279f7a0dc24b0 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Thu, 6 Jun 2013 18:05:39 -0700 Subject: [PATCH 4/6] OK, one more try. --- interface/src/Application.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b1b1ea826c..afbc6ae5f7 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2544,17 +2544,17 @@ void Application::setAutosave(bool wantsAutosave) { void Application::loadSettings(QSettings* set) { if (!set) set = getSettings(); - scanMenuBar(&Application::loadAction, set); - getAvatar()->loadData(set); _headCameraPitchYawScale = set->value("headCameraPitchYawScale").toDouble(); + scanMenuBar(&Application::loadAction, set); + getAvatar()->loadData(set); } void Application::saveSettings(QSettings* set) { if (!set) set = getSettings(); - scanMenuBar(&Application::saveAction, set); - getAvatar()->saveData(set); set->setValue("headCameraPitchYawScale", _headCameraPitchYawScale); + scanMenuBar(&Application::saveAction, set); + getAvatar()->saveData(set); } void Application::importSettings() { From acc8efa026c53ae772a48153aa07d1164760df91 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Thu, 6 Jun 2013 18:10:21 -0700 Subject: [PATCH 5/6] One more "one more try." --- interface/src/Application.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index afbc6ae5f7..ef2a44fa68 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -145,7 +145,6 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : _viewFrustumOffsetUp(0.0), _audioScope(256, 200, true), _manualFirstPerson(false), - _headCameraPitchYawScale(0.0f), _mouseX(0), _mouseY(0), _mousePressed(false), @@ -2544,7 +2543,7 @@ void Application::setAutosave(bool wantsAutosave) { void Application::loadSettings(QSettings* set) { if (!set) set = getSettings(); - _headCameraPitchYawScale = set->value("headCameraPitchYawScale").toDouble(); + _headCameraPitchYawScale = set->value("headCameraPitchYawScale", 0.0f).toFloat(); scanMenuBar(&Application::loadAction, set); getAvatar()->loadData(set); } From 26de3028fa2403fa21c3b929e3cb09f96d233a0f Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Thu, 6 Jun 2013 18:25:16 -0700 Subject: [PATCH 6/6] We need to sync in order to ensure that the settings are saved. --- interface/src/Application.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ef2a44fa68..645717b8db 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2553,7 +2553,9 @@ void Application::saveSettings(QSettings* set) { set->setValue("headCameraPitchYawScale", _headCameraPitchYawScale); scanMenuBar(&Application::saveAction, set); - getAvatar()->saveData(set); + getAvatar()->saveData(set); + + set->sync(); } void Application::importSettings() {