mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-08 22:27:25 +02:00
Tweak to zoom on pushback.
This commit is contained in:
parent
b7725f094d
commit
d6534d6026
2 changed files with 19 additions and 11 deletions
|
@ -151,6 +151,7 @@ Application::Application(int& argc, char** argv, timeval &startup_time) :
|
||||||
_lastQueriedViewFrustum(),
|
_lastQueriedViewFrustum(),
|
||||||
_lastQueriedTime(usecTimestampNow()),
|
_lastQueriedTime(usecTimestampNow()),
|
||||||
_mirrorViewRect(QRect(MIRROR_VIEW_LEFT_PADDING, MIRROR_VIEW_TOP_PADDING, MIRROR_VIEW_WIDTH, MIRROR_VIEW_HEIGHT)),
|
_mirrorViewRect(QRect(MIRROR_VIEW_LEFT_PADDING, MIRROR_VIEW_TOP_PADDING, MIRROR_VIEW_WIDTH, MIRROR_VIEW_HEIGHT)),
|
||||||
|
_cameraPushback(0.0f),
|
||||||
_mouseX(0),
|
_mouseX(0),
|
||||||
_mouseY(0),
|
_mouseY(0),
|
||||||
_lastMouseMove(usecTimestampNow()),
|
_lastMouseMove(usecTimestampNow()),
|
||||||
|
@ -519,6 +520,8 @@ void Application::paintGL() {
|
||||||
|
|
||||||
glEnable(GL_LINE_SMOOTH);
|
glEnable(GL_LINE_SMOOTH);
|
||||||
|
|
||||||
|
float pushback = 0.0f;
|
||||||
|
float pushbackFocalLength = 0.0f;
|
||||||
if (OculusManager::isConnected()) {
|
if (OculusManager::isConnected()) {
|
||||||
_myCamera.setUpShift(0.0f);
|
_myCamera.setUpShift(0.0f);
|
||||||
_myCamera.setDistance(0.0f);
|
_myCamera.setDistance(0.0f);
|
||||||
|
@ -537,7 +540,6 @@ void Application::paintGL() {
|
||||||
glm::vec4 plane(planeNormal, -glm::dot(planeNormal, _myCamera.getTargetPosition()) - pushbackRadius);
|
glm::vec4 plane(planeNormal, -glm::dot(planeNormal, _myCamera.getTargetPosition()) - pushbackRadius);
|
||||||
|
|
||||||
// push camera out of any intersecting avatars
|
// push camera out of any intersecting avatars
|
||||||
float pushback = 0.0f;
|
|
||||||
foreach (const AvatarSharedPointer& avatarData, _avatarManager.getAvatarHash()) {
|
foreach (const AvatarSharedPointer& avatarData, _avatarManager.getAvatarHash()) {
|
||||||
Avatar* avatar = static_cast<Avatar*>(avatarData.data());
|
Avatar* avatar = static_cast<Avatar*>(avatarData.data());
|
||||||
if (avatar->isMyAvatar()) {
|
if (avatar->isMyAvatar()) {
|
||||||
|
@ -563,12 +565,9 @@ void Application::paintGL() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const float MAX_PUSHBACK = 0.35f;
|
const float MAX_PUSHBACK = 0.35f;
|
||||||
const float PUSHBACK_DECAY = 0.5f;
|
pushback = qMin(pushback, MAX_PUSHBACK * _myAvatar->getScale());
|
||||||
_myCamera.setDistance(qMax(qMin(pushback, MAX_PUSHBACK * _myAvatar->getScale()),
|
const float BASE_PUSHBACK_FOCAL_LENGTH = 0.5f;
|
||||||
_myCamera.getDistance() * PUSHBACK_DECAY));
|
pushbackFocalLength = BASE_PUSHBACK_FOCAL_LENGTH * _myAvatar->getScale();
|
||||||
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) {
|
} else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) {
|
||||||
_myCamera.setTightness(0.0f); // Camera is directly connected to head without smoothing
|
_myCamera.setTightness(0.0f); // Camera is directly connected to head without smoothing
|
||||||
|
@ -588,16 +587,24 @@ void Application::paintGL() {
|
||||||
(eyePosition - _myCamera.getTargetPosition());
|
(eyePosition - _myCamera.getTargetPosition());
|
||||||
const float BASE_PUSHBACK_RADIUS = 0.2f;
|
const float BASE_PUSHBACK_RADIUS = 0.2f;
|
||||||
float pushbackRadius = _myCamera.getNearClip() + _myAvatar->getScale() * BASE_PUSHBACK_RADIUS;
|
float pushbackRadius = _myCamera.getNearClip() + _myAvatar->getScale() * BASE_PUSHBACK_RADIUS;
|
||||||
float pushback = relativePosition.z + pushbackRadius - _myCamera.getDistance();
|
pushback = relativePosition.z + pushbackRadius - _myCamera.getDistance();
|
||||||
if (pushback > 0.0f) {
|
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.setTargetPosition(_myCamera.getTargetPosition() +
|
||||||
_myCamera.getTargetRotation() * glm::vec3(0.0f, 0.0f, pushback));
|
_myCamera.getTargetRotation() * glm::vec3(0.0f, 0.0f, _cameraPushback));
|
||||||
float enlargement = pushbackRadius / (pushbackRadius + pushback);
|
float enlargement = pushbackFocalLength / (pushbackFocalLength + _cameraPushback);
|
||||||
_myCamera.setFieldOfView(glm::degrees(2.0f * atanf(enlargement * tanf(
|
_myCamera.setFieldOfView(glm::degrees(2.0f * atanf(enlargement * tanf(
|
||||||
glm::radians(Menu::getInstance()->getFieldOfView() * 0.5f)))));
|
glm::radians(Menu::getInstance()->getFieldOfView() * 0.5f)))));
|
||||||
} else {
|
} else {
|
||||||
_myCamera.setFieldOfView(Menu::getInstance()->getFieldOfView());
|
_myCamera.setFieldOfView(Menu::getInstance()->getFieldOfView());
|
||||||
}
|
}
|
||||||
|
updateProjectionMatrix(_myCamera, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update camera position
|
// Update camera position
|
||||||
|
|
|
@ -432,6 +432,7 @@ private:
|
||||||
QRect _mirrorViewRect;
|
QRect _mirrorViewRect;
|
||||||
RearMirrorTools* _rearMirrorTools;
|
RearMirrorTools* _rearMirrorTools;
|
||||||
|
|
||||||
|
float _cameraPushback;
|
||||||
glm::mat4 _untranslatedViewMatrix;
|
glm::mat4 _untranslatedViewMatrix;
|
||||||
glm::vec3 _viewMatrixTranslation;
|
glm::vec3 _viewMatrixTranslation;
|
||||||
glm::mat4 _projectionMatrix;
|
glm::mat4 _projectionMatrix;
|
||||||
|
|
Loading…
Reference in a new issue