Fix look-at position calculation when in HMD display

Calculate look-at target from camera position and orientation.
Render own look-at vectors from camera eye positions.
Draw other avatar's look-at vectors from their eyeballs.
With and without eye trackers.
This commit is contained in:
David Rowe 2015-08-06 16:41:06 -07:00
parent d7b42e264e
commit 551c00dc23
4 changed files with 27 additions and 9 deletions

View file

@ -2347,10 +2347,15 @@ void Application::updateMyAvatarLookAtPosition() {
} else {
lookAtSpot = _myCamera.getPosition() + OculusManager::getMidEyePosition();
}
} else if (eyeTracker->isTracking() && (isHMDMode() || eyeTracker->isSimulating())) {
} else if (eyeTracker->isTracking() && (OculusManager::isConnected() || eyeTracker->isSimulating())) {
// Look at the point that the user is looking at.
lookAtSpot = _myAvatar->getHead()->getEyePosition() +
(_myAvatar->getHead()->getFinalOrientationInWorldFrame() * eyeTracker->getLookAtPosition());
if (OculusManager::isConnected()) {
lookAtSpot = _myCamera.getPosition() + OculusManager::getMidEyePosition() +
_myAvatar->getOrientation() * (OculusManager::getOrientation() * eyeTracker->getLookAtPosition());
} else {
lookAtSpot = _myAvatar->getHead()->getEyePosition() +
(_myAvatar->getHead()->getFinalOrientationInWorldFrame() * eyeTracker->getLookAtPosition());
}
} else {
AvatarSharedPointer lookingAt = _myAvatar->getLookAtTargetAvatar().lock();
if (lookingAt && _myAvatar != lookingAt.get()) {
@ -2383,8 +2388,13 @@ void Application::updateMyAvatarLookAtPosition() {
}
} else {
// I am not looking at anyone else, so just look forward
lookAtSpot = _myAvatar->getHead()->getEyePosition() +
(_myAvatar->getHead()->getFinalOrientationInWorldFrame() * glm::vec3(0.0f, 0.0f, -TREE_SCALE));
if (OculusManager::isConnected()) {
lookAtSpot = _myCamera.getPosition() + OculusManager::getMidEyePosition() +
_myAvatar->getOrientation() * (OculusManager::getOrientation() * glm::vec3(0.0f, 0.0f, -TREE_SCALE));
} else {
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 the face tracker if active.

View file

@ -305,9 +305,9 @@ void Head::relaxLean(float deltaTime) {
void Head::render(RenderArgs* renderArgs, float alpha, ViewFrustum* renderFrustum) {
}
void Head::renderLookAts(RenderArgs* renderArgs) {
void Head::renderLookAts(RenderArgs* renderArgs, glm::vec3 eyeOffset) {
if (_renderLookatVectors) {
renderLookatVectors(renderArgs, _leftEyePosition, _rightEyePosition, getCorrectedLookAtPosition());
renderLookatVectors(renderArgs, _leftEyePosition + eyeOffset, _rightEyePosition + eyeOffset, getCorrectedLookAtPosition());
}
if (_renderLookatTarget) {
renderLookatTarget(renderArgs, getCorrectedLookAtPosition());

View file

@ -40,7 +40,7 @@ public:
void setReturnToCenter (bool returnHeadToCenter) { _returnHeadToCenter = returnHeadToCenter; }
void setRenderLookatVectors(bool onOff) { _renderLookatVectors = onOff; }
void setRenderLookatTarget(bool onOff) { _renderLookatTarget = onOff; }
void renderLookAts(RenderArgs* renderArgs);
void renderLookAts(RenderArgs* renderArgs, glm::vec3 eyeOffset = glm::vec3());
/// \return orientationBase+Delta
glm::quat getFinalOrientationInLocalFrame() const;

View file

@ -1166,7 +1166,15 @@ void MyAvatar::renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, fl
if (shouldRenderHead(renderArgs)) {
getHead()->render(renderArgs, 1.0f, renderFrustum);
}
getHead()->renderLookAts(renderArgs);
if (qApp->isHMDMode()) {
glm::vec3 eyeOffset =
OculusManager::getMidEyePosition() + Application::getInstance()->getCamera()->getPosition() - getEyePosition();
getHead()->renderLookAts(renderArgs, eyeOffset);
} else {
getHead()->renderLookAts(renderArgs);
}
getHand()->render(renderArgs, true);
}