From b2709652b444d82cf8ea460de009f99c8a118f40 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Thu, 16 May 2013 14:43:46 -0600 Subject: [PATCH 1/2] Tweaks to improve mouse Yaw behavior. --- interface/src/Avatar.cpp | 33 ++++++++++++++++++++++++++------- interface/src/Avatar.h | 2 ++ 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index 03c803b798..d5a0e514a7 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -101,7 +101,9 @@ Avatar::Avatar(bool isMine) { _sphere = NULL; _handHoldingPosition = glm::vec3(0.0f, 0.0f, 0.0f); _distanceToNearestAvatar = std::numeric_limits::max(); - _gravity = glm::vec3(0.0f, -1.0f, 0.0f); // default + _gravity = glm::vec3(0.0f, -1.0f, 0.0f); + _cumulativeMouseYaw = 0.f; + _isMouseTurningRight = false; initializeSkeleton(); @@ -292,16 +294,33 @@ bool Avatar::getIsNearInteractingOther() { } void Avatar::updateFromMouse(int mouseX, int mouseY, int screenWidth, int screenHeight) { - // Update pitch and yaw based on mouse behavior + // Update yaw based on mouse behavior const float MOUSE_MOVE_RADIUS = 0.25f; const float MOUSE_ROTATE_SPEED = 7.5f; + const float MAX_YAW_TO_ADD = 180.f; float mouseLocationX = (float)mouseX / (float)screenWidth - 0.5f; - - if (fabs(mouseLocationX) > MOUSE_MOVE_RADIUS) { - float mouseMag = (fabs(mouseLocationX) - MOUSE_MOVE_RADIUS) / (0.5f - MOUSE_MOVE_RADIUS) * MOUSE_ROTATE_SPEED; - setBodyYaw(getBodyYaw() - ((mouseLocationX > 0.f) ? mouseMag : -mouseMag)); + + printLog("mouse %d, %d\n", mouseX, mouseY); + + if ((fabs(mouseLocationX) > MOUSE_MOVE_RADIUS) && + (mouseX > 1) && + (mouseX < screenWidth) && + (mouseY > 1) && + (mouseY < screenHeight)) { + float mouseYawAdd = (fabs(mouseLocationX) - MOUSE_MOVE_RADIUS) / (0.5f - MOUSE_MOVE_RADIUS) * MOUSE_ROTATE_SPEED; + bool rightTurning = (mouseLocationX > 0.f); + if (_isMouseTurningRight == rightTurning) { + _cumulativeMouseYaw += mouseYawAdd; + } else { + _cumulativeMouseYaw = 0; + _isMouseTurningRight = rightTurning; + } + if (_cumulativeMouseYaw < MAX_YAW_TO_ADD) { + setBodyYaw(getBodyYaw() - (rightTurning ? mouseYawAdd : -mouseYawAdd)); + } + } else { + _cumulativeMouseYaw = 0; } - return; } diff --git a/interface/src/Avatar.h b/interface/src/Avatar.h index b653440461..11ef6a8327 100644 --- a/interface/src/Avatar.h +++ b/interface/src/Avatar.h @@ -200,6 +200,8 @@ private: glm::vec3 _mouseRayOrigin; glm::vec3 _mouseRayDirection; glm::vec3 _cameraPosition; + float _cumulativeMouseYaw; + bool _isMouseTurningRight; //AvatarJointID _jointTouched; From 9f57787ece12eb4eacbeba10948fd6437047c8e2 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Thu, 16 May 2013 17:05:45 -0600 Subject: [PATCH 2/2] Fixed jerking on gravity, added mouse pitch, yaw behavior. --- interface/src/Application.cpp | 10 ++++-- interface/src/Avatar.cpp | 50 ++++++++++++++++------------ interface/src/Head.cpp | 3 -- libraries/avatars/src/AvatarData.cpp | 9 +++++ libraries/avatars/src/AvatarData.h | 4 +-- 5 files changed, 46 insertions(+), 30 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 1546d8be13..c70b674f38 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -306,13 +306,13 @@ void Application::paintGL() { if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) { _myCamera.setTargetPosition(_myAvatar.getSpringyHeadPosition()); _myCamera.setTargetRotation(_myAvatar.getAbsoluteHeadYaw(), - _myAvatar.getAbsoluteHeadPitch(), + -_myAvatar.getAbsoluteHeadPitch(), 0.0f); } else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) { _myCamera.setTargetPosition(_myAvatar.getHeadPosition()); _myCamera.setTargetRotation(_myAvatar.getBodyYaw(), - 0.0f, + -_myAvatar.getAbsoluteHeadPitch(), 0.0f); } } @@ -864,7 +864,11 @@ void Application::idle() { } // Update from Mouse - _myAvatar.updateFromMouse(_mouseX, _mouseY, _glWidget->width(), _glWidget->height()); + QPoint mouse = QCursor::pos(); + _myAvatar.updateFromMouse(_glWidget->mapFromGlobal(mouse).x(), + _glWidget->mapFromGlobal(mouse).y(), + _glWidget->width(), + _glWidget->height()); // Read serial port interface devices if (_serialPort.active) { diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index d5a0e514a7..7251c1ab96 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -214,7 +214,6 @@ void Avatar::reset() { _head.leanForward = _head.leanSideways = 0; } - // Update avatar head rotation with sensor data void Avatar::updateHeadFromGyros(float deltaTime, SerialInterface* serialInterface, glm::vec3* gravity) { float measuredPitchRate = 0.0f; @@ -226,8 +225,6 @@ void Avatar::updateHeadFromGyros(float deltaTime, SerialInterface* serialInterfa measuredRollRate = serialInterface->getLastRollRate(); // Update avatar head position based on measured gyro rates - const float MAX_PITCH = 45; - const float MIN_PITCH = -45; const float MAX_YAW = 85; const float MIN_YAW = -85; const float MAX_ROLL = 50; @@ -237,7 +234,6 @@ void Avatar::updateHeadFromGyros(float deltaTime, SerialInterface* serialInterfa addHeadYaw(measuredYawRate * deltaTime); addHeadRoll(measuredRollRate * deltaTime); - setHeadPitch(glm::clamp(getHeadPitch(), MIN_PITCH, MAX_PITCH)); setHeadYaw(glm::clamp(getHeadYaw(), MIN_YAW, MAX_YAW)); setHeadRoll(glm::clamp(getHeadRoll(), MIN_ROLL, MAX_ROLL)); @@ -296,31 +292,41 @@ bool Avatar::getIsNearInteractingOther() { void Avatar::updateFromMouse(int mouseX, int mouseY, int screenWidth, int screenHeight) { // Update yaw based on mouse behavior const float MOUSE_MOVE_RADIUS = 0.25f; - const float MOUSE_ROTATE_SPEED = 7.5f; + const float MOUSE_ROTATE_SPEED = 5.0f; + const float MOUSE_PITCH_SPEED = 3.0f; const float MAX_YAW_TO_ADD = 180.f; + const int TITLE_BAR_HEIGHT = 46; float mouseLocationX = (float)mouseX / (float)screenWidth - 0.5f; + float mouseLocationY = (float)mouseY / (float)screenHeight - 0.5f; - printLog("mouse %d, %d\n", mouseX, mouseY); - - if ((fabs(mouseLocationX) > MOUSE_MOVE_RADIUS) && - (mouseX > 1) && - (mouseX < screenWidth) && - (mouseY > 1) && - (mouseY < screenHeight)) { - float mouseYawAdd = (fabs(mouseLocationX) - MOUSE_MOVE_RADIUS) / (0.5f - MOUSE_MOVE_RADIUS) * MOUSE_ROTATE_SPEED; - bool rightTurning = (mouseLocationX > 0.f); - if (_isMouseTurningRight == rightTurning) { - _cumulativeMouseYaw += mouseYawAdd; + if ((mouseX > 1) && (mouseX < screenWidth) && (mouseY > TITLE_BAR_HEIGHT) && (mouseY < screenHeight)) { + // + // Mouse must be inside screen (not at edge) and not on title bar for movement to happen + // + if (fabs(mouseLocationX) > MOUSE_MOVE_RADIUS) { + // Add Yaw + float mouseYawAdd = (fabs(mouseLocationX) - MOUSE_MOVE_RADIUS) / (0.5f - MOUSE_MOVE_RADIUS) * MOUSE_ROTATE_SPEED; + bool rightTurning = (mouseLocationX > 0.f); + if (_isMouseTurningRight == rightTurning) { + _cumulativeMouseYaw += mouseYawAdd; + } else { + _cumulativeMouseYaw = 0; + _isMouseTurningRight = rightTurning; + } + if (_cumulativeMouseYaw < MAX_YAW_TO_ADD) { + setBodyYaw(getBodyYaw() - (rightTurning ? mouseYawAdd : -mouseYawAdd)); + } } else { _cumulativeMouseYaw = 0; - _isMouseTurningRight = rightTurning; } - if (_cumulativeMouseYaw < MAX_YAW_TO_ADD) { - setBodyYaw(getBodyYaw() - (rightTurning ? mouseYawAdd : -mouseYawAdd)); + if (fabs(mouseLocationY) > MOUSE_MOVE_RADIUS) { + float mousePitchAdd = (fabs(mouseLocationY) - MOUSE_MOVE_RADIUS) / (0.5f - MOUSE_MOVE_RADIUS) * MOUSE_PITCH_SPEED; + bool downPitching = (mouseLocationY > 0.f); + setHeadPitch(getHeadPitch() + (downPitching ? mousePitchAdd : -mousePitchAdd)); } - } else { - _cumulativeMouseYaw = 0; + } + return; } @@ -348,7 +354,7 @@ void Avatar::simulate(float deltaTime) { _avatarTouch.simulate(deltaTime); // apply gravity and collision with the ground/floor - if (USING_AVATAR_GRAVITY) { + if (_isMine && USING_AVATAR_GRAVITY) { if (_position.y > _pelvisStandingHeight + 0.01f) { _velocity += _gravity * (GRAVITY_SCALE * deltaTime); } else if (_position.y < _pelvisStandingHeight) { diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index ebedb44397..8e29c683e2 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -221,9 +221,6 @@ void Head::simulate(float deltaTime, bool isMine) { (deltaTime / AUDIO_AVERAGING_SECS) * audioLoudness; } - - - void Head::render(bool lookingInMirror, float bodyYaw) { int side = 0; diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 1f4856abf7..ab60088cf8 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -236,4 +236,13 @@ void AvatarData::setBodyRoll(float bodyRoll) { _bodyRoll = bodyRoll; } +void AvatarData::setHeadPitch(float p) { + // Set head pitch and apply limits + const float MAX_PITCH = 60; + const float MIN_PITCH = -60; + _headPitch = glm::clamp(p, MIN_PITCH, MAX_PITCH); +} + + + diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index c66402e21a..f131f82c85 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -73,13 +73,13 @@ public: void setBodyRoll(float bodyRoll); // Head Rotation - void setHeadPitch(float p) {_headPitch = p; } + void setHeadPitch(float p); void setHeadYaw(float y) {_headYaw = y; } void setHeadRoll(float r) {_headRoll = r; }; float getHeadPitch() const { return _headPitch; }; float getHeadYaw() const { return _headYaw; }; float getHeadRoll() const { return _headRoll; }; - void addHeadPitch(float p) {_headPitch -= p; } + void addHeadPitch(float p) { setHeadPitch(_headPitch - p); } void addHeadYaw(float y){_headYaw -= y; } void addHeadRoll(float r){_headRoll += r; }