From e0e94481c9d9d221dedeb174686373ebb8b33f47 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Thu, 6 Jun 2013 17:53:00 -0700 Subject: [PATCH] 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)) *