From 00e2ff93e39a53f92830bbe0ff38446939f9fd17 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 11 Apr 2014 10:08:44 -0700 Subject: [PATCH 1/3] Playing around with zooming in while pulling back. --- interface/src/Application.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 84ce1f7efe..b3b8c24b69 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -589,6 +589,9 @@ void Application::paintGL() { if (pushback > 0.0f) { _myCamera.setTargetPosition(_myCamera.getTargetPosition() + _myCamera.getTargetRotation() * glm::vec3(0.0f, 0.0f, pushback)); + float enlargement = _myCamera.getDistance() / (_myCamera.getDistance() + pushback); + _myCamera.setFieldOfView(glm::degrees(2.0f * atanf(enlargement * tanf( + glm::radians(Menu::getInstance()->getFieldOfView() * 0.5f))))); } } From b7725f094da474fbd1068cd686679560cbd590a1 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 11 Apr 2014 10:19:16 -0700 Subject: [PATCH 2/3] Trying the narrowing effect with pushback for other avatars. --- interface/src/Application.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b3b8c24b69..df31349624 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -566,6 +566,9 @@ void Application::paintGL() { const float PUSHBACK_DECAY = 0.5f; _myCamera.setDistance(qMax(qMin(pushback, MAX_PUSHBACK * _myAvatar->getScale()), _myCamera.getDistance() * PUSHBACK_DECAY)); + float enlargement = pushbackRadius / (pushbackRadius + _myCamera.getDistance()); + _myCamera.setFieldOfView(glm::degrees(2.0f * atanf(enlargement * tanf( + glm::radians(Menu::getInstance()->getFieldOfView() * 0.5f))))); } else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) { _myCamera.setTightness(0.0f); // Camera is directly connected to head without smoothing @@ -583,15 +586,17 @@ void Application::paintGL() { // if the head would intersect the near clip plane, we must push the camera out glm::vec3 relativePosition = glm::inverse(_myCamera.getTargetRotation()) * (eyePosition - _myCamera.getTargetPosition()); - const float PUSHBACK_RADIUS = 0.2f; - float pushback = relativePosition.z + _myCamera.getNearClip() + - _myAvatar->getScale() * PUSHBACK_RADIUS - _myCamera.getDistance(); + const float BASE_PUSHBACK_RADIUS = 0.2f; + float pushbackRadius = _myCamera.getNearClip() + _myAvatar->getScale() * BASE_PUSHBACK_RADIUS; + float pushback = relativePosition.z + pushbackRadius - _myCamera.getDistance(); if (pushback > 0.0f) { _myCamera.setTargetPosition(_myCamera.getTargetPosition() + _myCamera.getTargetRotation() * glm::vec3(0.0f, 0.0f, pushback)); - float enlargement = _myCamera.getDistance() / (_myCamera.getDistance() + pushback); + float enlargement = pushbackRadius / (pushbackRadius + pushback); _myCamera.setFieldOfView(glm::degrees(2.0f * atanf(enlargement * tanf( glm::radians(Menu::getInstance()->getFieldOfView() * 0.5f))))); + } else { + _myCamera.setFieldOfView(Menu::getInstance()->getFieldOfView()); } } From d6534d6026a26b8a68a9ffe21e8b8903f7694a31 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 11 Apr 2014 11:10:22 -0700 Subject: [PATCH 3/3] Tweak to zoom on pushback. --- interface/src/Application.cpp | 29 ++++++++++++++++++----------- interface/src/Application.h | 1 + 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index df31349624..a7f2d7d7ec 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -151,6 +151,7 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : _lastQueriedViewFrustum(), _lastQueriedTime(usecTimestampNow()), _mirrorViewRect(QRect(MIRROR_VIEW_LEFT_PADDING, MIRROR_VIEW_TOP_PADDING, MIRROR_VIEW_WIDTH, MIRROR_VIEW_HEIGHT)), + _cameraPushback(0.0f), _mouseX(0), _mouseY(0), _lastMouseMove(usecTimestampNow()), @@ -519,6 +520,8 @@ void Application::paintGL() { glEnable(GL_LINE_SMOOTH); + float pushback = 0.0f; + float pushbackFocalLength = 0.0f; if (OculusManager::isConnected()) { _myCamera.setUpShift(0.0f); _myCamera.setDistance(0.0f); @@ -537,7 +540,6 @@ void Application::paintGL() { glm::vec4 plane(planeNormal, -glm::dot(planeNormal, _myCamera.getTargetPosition()) - pushbackRadius); // push camera out of any intersecting avatars - float pushback = 0.0f; foreach (const AvatarSharedPointer& avatarData, _avatarManager.getAvatarHash()) { Avatar* avatar = static_cast(avatarData.data()); if (avatar->isMyAvatar()) { @@ -563,12 +565,9 @@ void Application::paintGL() { } } const float MAX_PUSHBACK = 0.35f; - const float PUSHBACK_DECAY = 0.5f; - _myCamera.setDistance(qMax(qMin(pushback, MAX_PUSHBACK * _myAvatar->getScale()), - _myCamera.getDistance() * PUSHBACK_DECAY)); - float enlargement = pushbackRadius / (pushbackRadius + _myCamera.getDistance()); - _myCamera.setFieldOfView(glm::degrees(2.0f * atanf(enlargement * tanf( - glm::radians(Menu::getInstance()->getFieldOfView() * 0.5f))))); + pushback = qMin(pushback, MAX_PUSHBACK * _myAvatar->getScale()); + const float BASE_PUSHBACK_FOCAL_LENGTH = 0.5f; + pushbackFocalLength = BASE_PUSHBACK_FOCAL_LENGTH * _myAvatar->getScale(); } else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) { _myCamera.setTightness(0.0f); // Camera is directly connected to head without smoothing @@ -588,16 +587,24 @@ void Application::paintGL() { (eyePosition - _myCamera.getTargetPosition()); const float BASE_PUSHBACK_RADIUS = 0.2f; float pushbackRadius = _myCamera.getNearClip() + _myAvatar->getScale() * BASE_PUSHBACK_RADIUS; - float pushback = relativePosition.z + pushbackRadius - _myCamera.getDistance(); - if (pushback > 0.0f) { + pushback = relativePosition.z + pushbackRadius - _myCamera.getDistance(); + pushbackFocalLength = _myCamera.getDistance(); + } + + // handle pushback, if any + if (pushbackFocalLength > 0.0f) { + const float PUSHBACK_DECAY = 0.5f; + _cameraPushback = qMax(pushback, _cameraPushback * PUSHBACK_DECAY); + if (_cameraPushback > EPSILON) { _myCamera.setTargetPosition(_myCamera.getTargetPosition() + - _myCamera.getTargetRotation() * glm::vec3(0.0f, 0.0f, pushback)); - float enlargement = pushbackRadius / (pushbackRadius + pushback); + _myCamera.getTargetRotation() * glm::vec3(0.0f, 0.0f, _cameraPushback)); + float enlargement = pushbackFocalLength / (pushbackFocalLength + _cameraPushback); _myCamera.setFieldOfView(glm::degrees(2.0f * atanf(enlargement * tanf( glm::radians(Menu::getInstance()->getFieldOfView() * 0.5f))))); } else { _myCamera.setFieldOfView(Menu::getInstance()->getFieldOfView()); } + updateProjectionMatrix(_myCamera, true); } // Update camera position diff --git a/interface/src/Application.h b/interface/src/Application.h index eedb866d53..ed269226fe 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -432,6 +432,7 @@ private: QRect _mirrorViewRect; RearMirrorTools* _rearMirrorTools; + float _cameraPushback; glm::mat4 _untranslatedViewMatrix; glm::vec3 _viewMatrixTranslation; glm::mat4 _projectionMatrix;