diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b019e29cc1..6087a4493e 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -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.getEyePosition()); + _myCamera.setTargetPosition(_myAvatar.getUprightEyeLevelPosition()); _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 5d7e59deb1..346d5ff7d5 100755 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -368,6 +368,12 @@ 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); +} + glm::vec3 Avatar::getEyePosition() { const float EYE_UP_OFFSET = 0.36f; const float EYE_FRONT_OFFSET = 0.8f; diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index f8aa5f3179..e9df1c125d 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 getUprightEyeLevelPosition() const; glm::vec3 getEyePosition(); AvatarVoxelSystem* getVoxels() { return &_voxels; }