From f4f43d6b38d2fc2f996eaa2bca2a9af33011da52 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Tue, 30 Dec 2014 15:11:32 -0800 Subject: [PATCH 1/3] added twisting of torso to follow head, fixed bug with body rotation not factored out of head rotation, removed credits from title bar --- interface/src/Application.cpp | 10 ---------- interface/src/avatar/FaceModel.cpp | 11 ++++++++--- interface/src/avatar/Head.cpp | 6 ++++++ interface/src/avatar/Head.h | 5 +++++ interface/src/avatar/SkeletonModel.cpp | 4 +++- 5 files changed, 22 insertions(+), 14 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 6ddf116acd..1c7ab452a0 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3636,16 +3636,6 @@ void Application::updateWindowTitle(){ QString title = QString() + (!username.isEmpty() ? username + " @ " : QString()) + AddressManager::getInstance().getCurrentDomain() + connectionStatus + buildVersion; - AccountManager& accountManager = AccountManager::getInstance(); - if (accountManager.getAccountInfo().hasBalance()) { - float creditBalance = accountManager.getAccountInfo().getBalance() / SATOSHIS_PER_CREDIT; - - QString creditBalanceString; - creditBalanceString.sprintf("%.8f", creditBalance); - - title += " - ₵" + creditBalanceString; - } - #ifndef WIN32 // crashes with vs2013/win32 qDebug("Application title set to: %s", title.toStdString().c_str()); diff --git a/interface/src/avatar/FaceModel.cpp b/interface/src/avatar/FaceModel.cpp index 5a30e8634d..2e6c166bd3 100644 --- a/interface/src/avatar/FaceModel.cpp +++ b/interface/src/avatar/FaceModel.cpp @@ -46,13 +46,18 @@ void FaceModel::simulate(float deltaTime, bool fullUpdate) { } void FaceModel::maybeUpdateNeckRotation(const JointState& parentState, const FBXJoint& joint, JointState& state) { + Avatar* owningAvatar = static_cast(_owningHead->_owningAvatar); // get the rotation axes in joint space and use them to adjust the rotation glm::mat3 axes = glm::mat3_cast(glm::quat()); glm::mat3 inverse = glm::mat3(glm::inverse(parentState.getTransform() * glm::translate(state.getDefaultTranslationInConstrainedFrame()) * joint.preTransform * glm::mat4_cast(joint.preRotation))); - state.setRotationInConstrainedFrame(glm::angleAxis(- RADIANS_PER_DEGREE * _owningHead->getFinalRoll(), glm::normalize(inverse * axes[2])) - * glm::angleAxis(RADIANS_PER_DEGREE * _owningHead->getFinalYaw(), glm::normalize(inverse * axes[1])) - * glm::angleAxis(- RADIANS_PER_DEGREE * _owningHead->getFinalPitch(), glm::normalize(inverse * axes[0])) + state.setRotationInConstrainedFrame( + glm::angleAxis(- RADIANS_PER_DEGREE * (_owningHead->getFinalRoll() - owningAvatar->getHead()->getFinalLeanSideways()), + glm::normalize(inverse * axes[2])) + * glm::angleAxis(RADIANS_PER_DEGREE * (_owningHead->getFinalYaw() - _owningHead->getTorsoTwist()), + glm::normalize(inverse * axes[1])) + * glm::angleAxis(- RADIANS_PER_DEGREE * (_owningHead->getFinalPitch() - owningAvatar->getHead()->getFinalLeanForward()), + glm::normalize(inverse * axes[0])) * joint.rotation, DEFAULT_PRIORITY); } diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index 9c02b0e380..87185eb7eb 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -54,6 +54,7 @@ Head::Head(Avatar* owningAvatar) : _deltaRoll(0.0f), _deltaLeanSideways(0.0f), _deltaLeanForward(0.0f), + _torsoTwist(0.0f), _isCameraMoving(false), _isLookingAtMe(false), _faceModel(this) @@ -89,6 +90,11 @@ void Head::simulate(float deltaTime, bool isMine, bool billboard) { } } } + // Twist the upper body to follow the rotation of the head + const float BODY_FOLLOW_HEAD_YAW_RATE = 0.1f; + const float BODY_FOLLOW_HEAD_FACTOR = 1.5f; + setTorsoTwist((1.0f - BODY_FOLLOW_HEAD_YAW_RATE) * getTorsoTwist() + getFinalYaw() * BODY_FOLLOW_HEAD_YAW_RATE / BODY_FOLLOW_HEAD_FACTOR); + // Update audio trailing average for rendering facial animations const float AUDIO_AVERAGING_SECS = 0.05f; const float AUDIO_LONG_TERM_AVERAGING_SECS = 30.0f; diff --git a/interface/src/avatar/Head.h b/interface/src/avatar/Head.h index 57d74adaf0..43b380eac8 100644 --- a/interface/src/avatar/Head.h +++ b/interface/src/avatar/Head.h @@ -76,6 +76,9 @@ public: float getFinalLeanSideways() const { return _leanSideways + _deltaLeanSideways; } float getFinalLeanForward() const { return _leanForward + _deltaLeanForward; } + float getTorsoTwist() const { return _torsoTwist; } + void setTorsoTwist(float torsoTwist) { _torsoTwist = torsoTwist; } + glm::quat getEyeRotation(const glm::vec3& eyePosition) const; const glm::vec3& getRightEyePosition() const { return _rightEyePosition; } @@ -148,6 +151,8 @@ private: // delta lean angles for lean perturbations (driven by collisions) float _deltaLeanSideways; float _deltaLeanForward; + + float _torsoTwist; bool _isCameraMoving; bool _isLookingAtMe; diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index b707861677..89fea913e7 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -296,11 +296,13 @@ void SkeletonModel::maybeUpdateLeanRotation(const JointState& parentState, Joint } // get the rotation axes in joint space and use them to adjust the rotation glm::vec3 xAxis(1.0f, 0.0f, 0.0f); + glm::vec3 yAxis(0.0f, 1.0f, 0.0f); glm::vec3 zAxis(0.0f, 0.0f, 1.0f); glm::quat inverse = glm::inverse(parentState.getRotation() * state.getDefaultRotationInParentFrame()); state.setRotationInConstrainedFrame( glm::angleAxis(- RADIANS_PER_DEGREE * _owningAvatar->getHead()->getFinalLeanSideways(), inverse * zAxis) - * glm::angleAxis(- RADIANS_PER_DEGREE * _owningAvatar->getHead()->getFinalLeanForward(), inverse * xAxis) + * glm::angleAxis(- RADIANS_PER_DEGREE * _owningAvatar->getHead()->getFinalLeanForward(), inverse * xAxis) + * glm::angleAxis(RADIANS_PER_DEGREE * _owningAvatar->getHead()->getTorsoTwist(), inverse * yAxis) * state.getFBXJoint().rotation, LEAN_PRIORITY); } From dc9937e11a847b16236eea4954bccbc05b86f24d Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Tue, 30 Dec 2014 17:02:53 -0800 Subject: [PATCH 2/3] only twist own body, remove unused head functions --- interface/src/avatar/Head.cpp | 11 ++++++----- libraries/avatars/src/HeadData.cpp | 13 ------------- libraries/avatars/src/HeadData.h | 5 ----- 3 files changed, 6 insertions(+), 23 deletions(-) diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index 87185eb7eb..9923efcea3 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -89,12 +89,13 @@ void Head::simulate(float deltaTime, bool isMine, bool billboard) { _blendshapeCoefficients = faceTracker->getBlendshapeCoefficients(); } } + // Twist the upper body to follow the rotation of the head, but only do this with my avatar, + // since everyone else will see the full joint rotations for other people. + const float BODY_FOLLOW_HEAD_YAW_RATE = 0.1f; + const float BODY_FOLLOW_HEAD_FACTOR = 1.5f; + setTorsoTwist((1.0f - BODY_FOLLOW_HEAD_YAW_RATE) * getTorsoTwist() + getFinalYaw() * BODY_FOLLOW_HEAD_YAW_RATE / BODY_FOLLOW_HEAD_FACTOR); } - // Twist the upper body to follow the rotation of the head - const float BODY_FOLLOW_HEAD_YAW_RATE = 0.1f; - const float BODY_FOLLOW_HEAD_FACTOR = 1.5f; - setTorsoTwist((1.0f - BODY_FOLLOW_HEAD_YAW_RATE) * getTorsoTwist() + getFinalYaw() * BODY_FOLLOW_HEAD_YAW_RATE / BODY_FOLLOW_HEAD_FACTOR); - + // Update audio trailing average for rendering facial animations const float AUDIO_AVERAGING_SECS = 0.05f; const float AUDIO_LONG_TERM_AVERAGING_SECS = 30.0f; diff --git a/libraries/avatars/src/HeadData.cpp b/libraries/avatars/src/HeadData.cpp index 2bdb203034..511ab50c11 100644 --- a/libraries/avatars/src/HeadData.cpp +++ b/libraries/avatars/src/HeadData.cpp @@ -73,16 +73,3 @@ void HeadData::setBlendshape(QString name, float val) { _blendshapeCoefficients[it.value()] = val; } } - -void HeadData::addYaw(float yaw) { - setBaseYaw(_baseYaw + yaw); -} - -void HeadData::addPitch(float pitch) { - setBasePitch(_basePitch + pitch); -} - -void HeadData::addRoll(float roll) { - setBaseRoll(_baseRoll + roll); -} - diff --git a/libraries/avatars/src/HeadData.h b/libraries/avatars/src/HeadData.h index ea7666a6cd..3a4eb3c808 100644 --- a/libraries/avatars/src/HeadData.h +++ b/libraries/avatars/src/HeadData.h @@ -65,11 +65,6 @@ public: float getPupilDilation() const { return _pupilDilation; } void setPupilDilation(float pupilDilation) { _pupilDilation = pupilDilation; } - // degrees - void addYaw(float yaw); - void addPitch(float pitch); - void addRoll(float roll); - const glm::vec3& getLookAtPosition() const { return _lookAtPosition; } void setLookAtPosition(const glm::vec3& lookAtPosition) { _lookAtPosition = lookAtPosition; } From 104f7b757607ad8643ada8a9504e9d94c8211979 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Tue, 30 Dec 2014 20:34:12 -0800 Subject: [PATCH 3/3] make formula more readable --- interface/src/avatar/Head.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index 9923efcea3..a7315a348b 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -90,10 +90,11 @@ void Head::simulate(float deltaTime, bool isMine, bool billboard) { } } // Twist the upper body to follow the rotation of the head, but only do this with my avatar, - // since everyone else will see the full joint rotations for other people. + // since everyone else will see the full joint rotations for other people. const float BODY_FOLLOW_HEAD_YAW_RATE = 0.1f; - const float BODY_FOLLOW_HEAD_FACTOR = 1.5f; - setTorsoTwist((1.0f - BODY_FOLLOW_HEAD_YAW_RATE) * getTorsoTwist() + getFinalYaw() * BODY_FOLLOW_HEAD_YAW_RATE / BODY_FOLLOW_HEAD_FACTOR); + const float BODY_FOLLOW_HEAD_FACTOR = 0.66f; + float currentTwist = getTorsoTwist(); + setTorsoTwist(currentTwist + (getFinalYaw() * BODY_FOLLOW_HEAD_FACTOR - currentTwist) * BODY_FOLLOW_HEAD_YAW_RATE); } // Update audio trailing average for rendering facial animations