From 9980233a0df5e57176b607cc60bffaa83119fab9 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 16 Jul 2015 13:03:33 -0700 Subject: [PATCH] Use estimated eye pitch and yaw from DDE to deflect eyes --- interface/src/Application.cpp | 29 ++++++++++++------------ interface/src/devices/DdeFaceTracker.cpp | 11 +++++++++ interface/src/devices/DdeFaceTracker.h | 1 + 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 027ad159d0..931cdc47ab 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2359,23 +2359,22 @@ void Application::updateMyAvatarLookAtPosition() { lookAtSpot = _myAvatar->getHead()->getEyePosition() + (_myAvatar->getHead()->getFinalOrientationInWorldFrame() * glm::vec3(0.0f, 0.0f, -TREE_SCALE)); } - } - // Deflect the eyes a bit to match the detected gaze from Faceshift if active. - // DDE doesn't track eyes. - if (tracker && typeid(*tracker) == typeid(Faceshift) && !tracker->isMuted()) { - float eyePitch = tracker->getEstimatedEyePitch(); - float eyeYaw = tracker->getEstimatedEyeYaw(); - const float GAZE_DEFLECTION_REDUCTION_DURING_EYE_CONTACT = 0.1f; - glm::vec3 origin = _myAvatar->getHead()->getEyePosition(); - float pitchSign = (_myCamera.getMode() == CAMERA_MODE_MIRROR) ? -1.0f : 1.0f; - float deflection = DependencyManager::get()->getEyeDeflection(); - if (isLookingAtSomeone) { - deflection *= GAZE_DEFLECTION_REDUCTION_DURING_EYE_CONTACT; - } - lookAtSpot = origin + _myCamera.getRotation() * glm::quat(glm::radians(glm::vec3( - eyePitch * pitchSign * deflection, eyeYaw * deflection, 0.0f))) * + // Deflect the eyes a bit to match the detected gaze from the face tracker if active. + if (tracker && !tracker->isMuted()) { + float eyePitch = tracker->getEstimatedEyePitch(); + float eyeYaw = tracker->getEstimatedEyeYaw(); + const float GAZE_DEFLECTION_REDUCTION_DURING_EYE_CONTACT = 0.1f; + glm::vec3 origin = _myAvatar->getHead()->getEyePosition(); + float pitchSign = (_myCamera.getMode() == CAMERA_MODE_MIRROR) ? -1.0f : 1.0f; + float deflection = DependencyManager::get()->getEyeDeflection(); + if (isLookingAtSomeone) { + deflection *= GAZE_DEFLECTION_REDUCTION_DURING_EYE_CONTACT; + } + lookAtSpot = origin + _myCamera.getRotation() * glm::quat(glm::radians(glm::vec3( + eyePitch * pitchSign * deflection, eyeYaw * deflection, 0.0f))) * glm::inverse(_myCamera.getRotation()) * (lookAtSpot - origin); + } } _myAvatar->getHead()->setLookAtPosition(lookAtSpot); diff --git a/interface/src/devices/DdeFaceTracker.cpp b/interface/src/devices/DdeFaceTracker.cpp index 307e3ccd39..d09cba3b61 100644 --- a/interface/src/devices/DdeFaceTracker.cpp +++ b/interface/src/devices/DdeFaceTracker.cpp @@ -294,6 +294,17 @@ void DdeFaceTracker::reset() { } } +void DdeFaceTracker::update(float deltaTime) { + if (!isActive()) { + return; + } + FaceTracker::update(deltaTime); + + glm::vec3 headEulers = glm::degrees(glm::eulerAngles(_headRotation)); + _estimatedEyePitch = _eyePitch - headEulers.x; + _estimatedEyeYaw = _eyeYaw - headEulers.y; +} + bool DdeFaceTracker::isActive() const { return (_ddeProcess != NULL); } diff --git a/interface/src/devices/DdeFaceTracker.h b/interface/src/devices/DdeFaceTracker.h index bf51f85778..5536fa14bd 100644 --- a/interface/src/devices/DdeFaceTracker.h +++ b/interface/src/devices/DdeFaceTracker.h @@ -31,6 +31,7 @@ class DdeFaceTracker : public FaceTracker, public Dependency { public: virtual void init(); virtual void reset(); + virtual void update(float deltaTime); virtual bool isActive() const; virtual bool isTracking() const;