From 3e8d0ad712ad3e0993bc90b353c1931bf9142e59 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 11 Aug 2015 13:40:08 -0700 Subject: [PATCH] Fix to use new HMD methods --- interface/src/Application.cpp | 30 +++++++++++++++++++++++------- interface/src/Application.h | 3 ++- interface/src/avatar/MyAvatar.cpp | 14 ++++++++++++-- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index fa85aa2192..23fc1f13e1 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2371,11 +2371,19 @@ void Application::updateMyAvatarLookAtPosition() { } else { lookAtSpot = _myCamera.getPosition() + transformPoint(_myAvatar->getSensorToWorldMatrix(), extractTranslation(getHMDSensorPose())); } - } else if (eyeTracker->isTracking() && (OculusManager::isConnected() || eyeTracker->isSimulating())) { + } else if (eyeTracker->isTracking() && (isHMDMode() || eyeTracker->isSimulating())) { // Look at the point that the user is looking at. - if (OculusManager::isConnected()) { - lookAtSpot = _myCamera.getPosition() + OculusManager::getMidEyePosition() + - _myAvatar->getOrientation() * (OculusManager::getOrientation() * eyeTracker->getLookAtPosition()); + if (isHMDMode()) { + + // TODO: Test ... + // Position of simulated look-at target should change with change in HMD position and orientation + + glm::mat4 headPose = getActiveDisplayPlugin()->getHeadPose(); + glm::quat hmdOrientation = glm::quat_cast(headPose); + glm::vec3 hmdPosition = glm::vec3(headPose[3]); + + lookAtSpot = _myCamera.getPosition() + hmdPosition + + _myAvatar->getOrientation() * (hmdOrientation * eyeTracker->getLookAtPosition()); } else { lookAtSpot = _myAvatar->getHead()->getEyePosition() + (_myAvatar->getHead()->getFinalOrientationInWorldFrame() * eyeTracker->getLookAtPosition()); @@ -2412,9 +2420,17 @@ void Application::updateMyAvatarLookAtPosition() { } } else { // I am not looking at anyone else, so just look forward - if (OculusManager::isConnected()) { - lookAtSpot = _myCamera.getPosition() + OculusManager::getMidEyePosition() + - _myAvatar->getOrientation() * (OculusManager::getOrientation() * glm::vec3(0.0f, 0.0f, -TREE_SCALE)); + if (isHMDMode()) { + + // TODO: Test ... + // Look-at vector should go into distance based on HMD position and orientation + + glm::mat4 headPose = getActiveDisplayPlugin()->getHeadPose(); + glm::quat hmdOrientation = glm::quat_cast(headPose); + glm::vec3 hmdPosition = glm::vec3(headPose[3]); + + lookAtSpot = _myCamera.getPosition() + hmdPosition + + _myAvatar->getOrientation() * (hmdOrientation * glm::vec3(0.0f, 0.0f, -TREE_SCALE)); } else { lookAtSpot = _myAvatar->getHead()->getEyePosition() + (_myAvatar->getHead()->getFinalOrientationInWorldFrame() * glm::vec3(0.0f, 0.0f, -TREE_SCALE)); diff --git a/interface/src/Application.h b/interface/src/Application.h index 0d308e7a8f..239b440822 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -292,9 +292,10 @@ public: virtual QGLWidget* getPrimarySurface() override; void setActiveDisplayPlugin(const QString& pluginName); -private: + DisplayPlugin * getActiveDisplayPlugin(); const DisplayPlugin * getActiveDisplayPlugin() const; + public: FileLogger* getLogger() { return _logger; } diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 18c29d49fe..99973f2256 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -1253,9 +1254,18 @@ void MyAvatar::renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, fl } if (qApp->isHMDMode()) { + + // TODO: Test ... + // Look-at vectors should go from HMD mid eyes regardless of combined position and orientation + + glm::mat4 leftEye = Application::getInstance()->getActiveDisplayPlugin()->getEyePose(Eye::Left); + glm::vec3 leftEyePosition = glm::vec3(leftEye[3]); + glm::mat4 rightEye = Application::getInstance()->getActiveDisplayPlugin()->getEyePose(Eye::Right); + glm::vec3 rightEyePosition = glm::vec3(leftEye[3]); + glm::vec3 cameraPosition = Application::getInstance()->getCamera()->getPosition(); - getHead()->renderLookAts(renderArgs, cameraPosition + OculusManager::getLeftEyePosition(), - cameraPosition + OculusManager::getRightEyePosition()); + getHead()->renderLookAts(renderArgs, cameraPosition + leftEyePosition, + cameraPosition + rightEyePosition); } else { getHead()->renderLookAts(renderArgs); }