From 93a5bdd79a6dc27abe8f6123490b44f737fc068f Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Fri, 8 Apr 2016 15:27:43 -0700 Subject: [PATCH] Prevent avatar rotation due to HMD head turning in third-person camera. Also, fix one frame glitch during snap turning, by updating the sensorToWorld matrix after the MyAvatar::updateOrientation rotates the avatar, but before we perform IK. --- interface/src/Application.cpp | 3 --- interface/src/avatar/MyAvatar.cpp | 25 ++++++++++++++++--------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a6555352dd..daf83d7a52 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3490,9 +3490,6 @@ void Application::update(float deltaTime) { avatarManager->updateOtherAvatars(deltaTime); } - // update sensorToWorldMatrix for camera and hand controllers - getMyAvatar()->updateSensorToWorldMatrix(); - qApp->updateMyAvatarLookAtPosition(); { diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 6aa6f57e07..906f7b4c9f 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -294,20 +294,18 @@ void MyAvatar::update(float deltaTime) { auto audio = DependencyManager::get(); head->setAudioLoudness(audio->getLastInputLoudness()); head->setAudioAverageLoudness(audio->getAudioAverageInputLoudness()); - - simulate(deltaTime); - + + simulate(deltaTime); + currentEnergy += energyChargeRate; currentEnergy -= getAccelerationEnergy(); currentEnergy -= getAudioEnergy(); - + if(didTeleport()) { currentEnergy = 0.0f; } currentEnergy = max(0.0f, min(currentEnergy,1.0f)); emit energyChanged(currentEnergy); - - } extern QByteArray avatarStateToFrame(const AvatarData* _avatar); @@ -333,6 +331,10 @@ void MyAvatar::simulate(float deltaTime) { updatePosition(deltaTime); } + // update sensorToWorldMatrix for camera and hand controllers + // before we perform rig animations and IK. + updateSensorToWorldMatrix(); + { PerformanceTimer perfTimer("skeleton"); _skeletonModel->simulate(deltaTime); @@ -1975,9 +1977,14 @@ void MyAvatar::FollowHelper::decrementTimeRemaining(float dt) { } bool MyAvatar::FollowHelper::shouldActivateRotation(const MyAvatar& myAvatar, const glm::mat4& desiredBodyMatrix, const glm::mat4& currentBodyMatrix) const { - const float FOLLOW_ROTATION_THRESHOLD = cosf(PI / 6.0f); // 30 degrees - glm::vec2 bodyFacing = getFacingDir2D(currentBodyMatrix); - return glm::dot(myAvatar.getHMDSensorFacingMovingAverage(), bodyFacing) < FOLLOW_ROTATION_THRESHOLD; + auto cameraMode = qApp->getCamera()->getMode(); + if (cameraMode == CAMERA_MODE_THIRD_PERSON) { + return false; + } else { + const float FOLLOW_ROTATION_THRESHOLD = cosf(PI / 6.0f); // 30 degrees + glm::vec2 bodyFacing = getFacingDir2D(currentBodyMatrix); + return glm::dot(myAvatar.getHMDSensorFacingMovingAverage(), bodyFacing) < FOLLOW_ROTATION_THRESHOLD; + } } bool MyAvatar::FollowHelper::shouldActivateHorizontal(const MyAvatar& myAvatar, const glm::mat4& desiredBodyMatrix, const glm::mat4& currentBodyMatrix) const {