From d7cd88a9a7ae80d882f7de69d23eb70f1383c64d Mon Sep 17 00:00:00 2001 From: Mark Peng Date: Fri, 2 Aug 2013 17:30:26 -0700 Subject: [PATCH 1/3] Fix camera positioning so that it is in between avatar's eyes. Plus some code clean up. --- interface/src/Application.cpp | 21 ++++++++++----------- interface/src/avatar/Avatar.cpp | 6 ------ interface/src/avatar/Avatar.h | 1 - interface/src/avatar/Head.cpp | 4 ++-- interface/src/avatar/Head.h | 4 ++-- 5 files changed, 14 insertions(+), 22 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index aacd9f0667..2dd00abb0f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -394,7 +394,7 @@ void Application::paintGL() { if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { _myCamera.setTightness (100.0f); - _myCamera.setTargetPosition(_myAvatar.getUprightHeadPosition()); + _myCamera.setTargetPosition(_myAvatar.getHead().getEyePosition()); _myCamera.setTargetRotation(_myAvatar.getWorldAlignedOrientation() * glm::quat(glm::vec3(0.0f, PIf, 0.0f))); } else if (OculusManager::isConnected()) { @@ -406,7 +406,7 @@ void Application::paintGL() { } else if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) { _myCamera.setTightness(0.0f); // In first person, camera follows head exactly without delay - _myCamera.setTargetPosition(_myAvatar.getUprightEyeLevelPosition()); + _myCamera.setTargetPosition(_myAvatar.getHead().getEyePosition()); _myCamera.setTargetRotation(_myAvatar.getHead().getCameraOrientation()); } else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) { @@ -2100,7 +2100,7 @@ Avatar* Application::isLookingAtOtherAvatar(glm::vec3& mouseRayOrigin, glm::vec3 Avatar* avatar = (Avatar *) node->getLinkedData(); glm::vec3 headPosition = avatar->getHead().getPosition(); if (rayIntersectsSphere(mouseRayOrigin, mouseRayDirection, headPosition, HEAD_SPHERE_RADIUS)) { - eyePosition = avatar->getHead().getEyeLevelPosition(); + eyePosition = avatar->getHead().getEyePosition(); _lookatIndicatorScale = avatar->getScale(); _lookatOtherPosition = headPosition; nodeID = avatar->getOwningNode()->getNodeID(); @@ -2149,21 +2149,20 @@ void Application::update(float deltaTime) { _myAvatar.setMouseRay(mouseRayOrigin, mouseRayDirection); // Set where I am looking based on my mouse ray (so that other people can see) - glm::vec3 eyePosition; + glm::vec3 lookAtSpot; - _isLookingAtOtherAvatar = isLookingAtOtherAvatar(mouseRayOrigin, mouseRayDirection, eyePosition); + _isLookingAtOtherAvatar = isLookingAtOtherAvatar(mouseRayOrigin, mouseRayDirection, lookAtSpot); if (_isLookingAtOtherAvatar) { // If the mouse is over another avatar's head... - glm::vec3 myLookAtFromMouse(eyePosition); - _myAvatar.getHead().setLookAtPosition(myLookAtFromMouse); + _myAvatar.getHead().setLookAtPosition(lookAtSpot); } else if (_isHoverVoxel) { // Look at the hovered voxel - glm::vec3 lookAtSpot = getMouseVoxelWorldCoordinates(_hoverVoxel); + lookAtSpot = getMouseVoxelWorldCoordinates(_hoverVoxel); _myAvatar.getHead().setLookAtPosition(lookAtSpot); } else { // Just look in direction of the mouse ray - glm::vec3 myLookAtFromMouse(mouseRayOrigin + mouseRayDirection); - _myAvatar.getHead().setLookAtPosition(myLookAtFromMouse); + lookAtSpot = mouseRayOrigin + mouseRayDirection; + _myAvatar.getHead().setLookAtPosition(lookAtSpot); } // Find the voxel we are hovering over, and respond if clicked @@ -2732,7 +2731,7 @@ void Application::displaySide(Camera& whichCamera) { glRotatef(-glm::angle(rotation), axis.x, axis.y, axis.z); glTranslatef(-whichCamera.getPosition().x, -whichCamera.getPosition().y, -whichCamera.getPosition().z); - + // Setup 3D lights (after the camera transform, so that they are positioned in world space) glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index b4fef89d94..315ad67433 100755 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -368,12 +368,6 @@ glm::vec3 Avatar::getUprightHeadPosition() const { return _position + getWorldAlignedOrientation() * glm::vec3(0.0f, _pelvisToHeadLength, 0.0f); } -glm::vec3 Avatar::getUprightEyeLevelPosition() const { - const float EYE_UP_OFFSET = 0.36f; - glm::vec3 up = getWorldAlignedOrientation() * IDENTITY_UP; - return _position + up * _scale * BODY_BALL_RADIUS_HEAD_BASE * EYE_UP_OFFSET + glm::vec3(0.0f, _pelvisToHeadLength, 0.0f); -} - void Avatar::updateThrust(float deltaTime, Transmitter * transmitter) { // // Gather thrust information from keyboard and sensors to apply to avatar motion diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 80d5b463bf..c69cbbadbf 100755 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -170,7 +170,6 @@ public: glm::vec3 getGravity () const { return _gravity; } glm::vec3 getUprightHeadPosition() const; - glm::vec3 getUprightEyeLevelPosition() const; AvatarVoxelSystem* getVoxels() { return &_voxels; } diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index 76cf13a44d..7b35750203 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -54,7 +54,7 @@ Head::Head(Avatar* owningAvatar) : _rotation(0.0f, 0.0f, 0.0f), _leftEyePosition(0.0f, 0.0f, 0.0f), _rightEyePosition(0.0f, 0.0f, 0.0f), - _eyeLevelPosition(0.0f, 0.0f, 0.0f), + _eyePosition(0.0f, 0.0f, 0.0f), _leftEyeBrowPosition(0.0f, 0.0f, 0.0f), _rightEyeBrowPosition(0.0f, 0.0f, 0.0f), _leftEarPosition(0.0f, 0.0f, 0.0f), @@ -272,7 +272,7 @@ void Head::calculateGeometry() { + up * _scale * BODY_BALL_RADIUS_HEAD_BASE * EYE_UP_OFFSET + front * _scale * BODY_BALL_RADIUS_HEAD_BASE * EYE_FRONT_OFFSET; - _eyeLevelPosition = _rightEyePosition - right * _scale * BODY_BALL_RADIUS_HEAD_BASE * EYE_RIGHT_OFFSET; + _eyePosition = _rightEyePosition - right * _scale * BODY_BALL_RADIUS_HEAD_BASE * EYE_RIGHT_OFFSET; //calculate the eyebrow positions _leftEyeBrowPosition = _leftEyePosition; diff --git a/interface/src/avatar/Head.h b/interface/src/avatar/Head.h index 4c1429e1d6..2b970cdd75 100644 --- a/interface/src/avatar/Head.h +++ b/interface/src/avatar/Head.h @@ -61,7 +61,7 @@ public: float getScale() const { return _scale; } glm::vec3 getPosition() const { return _position; } - const glm::vec3& getEyeLevelPosition() const { return _eyeLevelPosition; } + const glm::vec3& getEyePosition() const { return _eyePosition; } glm::vec3 getRightDirection() const { return getOrientation() * IDENTITY_RIGHT; } glm::vec3 getUpDirection () const { return getOrientation() * IDENTITY_UP; } glm::vec3 getFrontDirection() const { return getOrientation() * IDENTITY_FRONT; } @@ -99,7 +99,7 @@ private: glm::vec3 _rotation; glm::vec3 _leftEyePosition; glm::vec3 _rightEyePosition; - glm::vec3 _eyeLevelPosition; + glm::vec3 _eyePosition; glm::vec3 _leftEyeBrowPosition; glm::vec3 _rightEyeBrowPosition; glm::vec3 _leftEarPosition; From ff67367221326b0861c237a3d6f7386b798aa881 Mon Sep 17 00:00:00 2001 From: Mark Peng Date: Fri, 2 Aug 2013 17:42:12 -0700 Subject: [PATCH 2/3] Remove extra parenthesis. --- interface/src/Application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ce7bc94c50..3cfa46317c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2238,7 +2238,7 @@ void Application::update(float deltaTime) { } else { // Just look in direction of the mouse ray const float FAR_AWAY_STARE = TREE_SCALE; - lookAtSpot = mouseRayOrigin + mouseRayDirection * FAR_AWAY_STARE); + lookAtSpot = mouseRayOrigin + mouseRayDirection * FAR_AWAY_STARE; _myAvatar.getHead().setLookAtPosition(lookAtSpot); } From 71a919f22683b46288e0599d9e16ce20ea120d77 Mon Sep 17 00:00:00 2001 From: Mark Peng Date: Fri, 2 Aug 2013 18:02:37 -0700 Subject: [PATCH 3/3] Switch back to avatar.getEyePosition() rather than avatar.getHead().getEyePosition() because of mysterious lag. --- interface/src/Application.cpp | 4 ++-- interface/src/avatar/Avatar.cpp | 13 +++++++++++++ interface/src/avatar/Avatar.h | 1 + 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 3cfa46317c..f60fe9a5f8 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -394,7 +394,7 @@ void Application::paintGL() { if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { _myCamera.setTightness (100.0f); - _myCamera.setTargetPosition(_myAvatar.getHead().getEyePosition()); + _myCamera.setTargetPosition(_myAvatar.getUprightHeadPosition()); _myCamera.setTargetRotation(_myAvatar.getWorldAlignedOrientation() * glm::quat(glm::vec3(0.0f, PIf, 0.0f))); } else if (OculusManager::isConnected()) { @@ -406,7 +406,7 @@ void Application::paintGL() { } else if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) { _myCamera.setTightness(0.0f); // In first person, camera follows head exactly without delay - _myCamera.setTargetPosition(_myAvatar.getHead().getEyePosition()); + _myCamera.setTargetPosition(_myAvatar.getEyePosition()); _myCamera.setTargetRotation(_myAvatar.getHead().getCameraOrientation()); } else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) { diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 315ad67433..6e245b21a3 100755 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -368,6 +368,19 @@ glm::vec3 Avatar::getUprightHeadPosition() const { return _position + getWorldAlignedOrientation() * glm::vec3(0.0f, _pelvisToHeadLength, 0.0f); } +glm::vec3 Avatar::getEyePosition() { + const float EYE_UP_OFFSET = 0.36f; + const float EYE_FRONT_OFFSET = 0.8f; + + glm::quat orientation = getWorldAlignedOrientation(); + glm::vec3 up = orientation * IDENTITY_UP; + glm::vec3 front = orientation * IDENTITY_FRONT; + + float scale = _scale * BODY_BALL_RADIUS_HEAD_BASE; + + return getHead().getPosition() + up * scale * EYE_UP_OFFSET + front * scale * EYE_FRONT_OFFSET; +} + void Avatar::updateThrust(float deltaTime, Transmitter * transmitter) { // // Gather thrust information from keyboard and sensors to apply to avatar motion diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index c69cbbadbf..f8aa5f3179 100755 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -170,6 +170,7 @@ public: glm::vec3 getGravity () const { return _gravity; } glm::vec3 getUprightHeadPosition() const; + glm::vec3 getEyePosition(); AvatarVoxelSystem* getVoxels() { return &_voxels; }