diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 011439193c..8194051d9e 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -3514,42 +3514,56 @@ void MyAvatar::updateOrientation(float deltaTime) { setWorldOrientation(glm::slerp(getWorldOrientation(), faceRotation, blend)); } else if (isRotatingWhileSeated) { float direction = -getDriveKey(TRANSLATE_X); - float seatedTargetSpeed = direction * _yawSpeed * deltaTime; + //float seatedTargetSpeed = direction * _yawSpeed; //deg/sec + float seatedTargetSpeed = direction * _yawSpeed * deltaTime; //deg/renderframe - const float SEATED_ROTATION_RAMP_TIMESCALE = 0.25; //used as divisor - float blend = deltaTime / SEATED_ROTATION_RAMP_TIMESCALE; + //if (_seatedBodyYawDelta / seatedTargetSpeed < 0.0f) { + // //reverse direction, start acceleration timer again + // _seatedInterpTime = 0.0f; + //} + + const float SEATED_ROTATION_RAMP_TIMESCALE = 2.5; + float blend = deltaTime * SEATED_ROTATION_RAMP_TIMESCALE; if (blend > 1.0f) { blend = 1.0f; } - /////// ease in - //_seatedBodyYawDelta = (1.0f - blend) * _seatedBodyYawDelta + blend * seatedTargetSpeed; - - /////// ease out - + //init, accelerate or clamp rotation at target speed if (fabsf(_seatedBodyYawDelta) > 0.0f) { - //we are rotating if (fabsf(_seatedBodyYawDelta) >= fabsf(seatedTargetSpeed)) { - //we've reached target speed _seatedBodyYawDelta = seatedTargetSpeed; } else { - _seatedInterpTime += blend; - _seatedBodyYawDelta = _seatedInterpTime * _seatedInterpTime * direction; + //_seatedInterpTime += blend; + //_seatedBodyYawDelta = _seatedInterpTime * _seatedInterpTime * direction / blend; + _seatedBodyYawDelta += blend * direction; } } else { - //init rotation _seatedInterpTime = blend; _seatedBodyYawDelta = blend * direction; } - + float totalSeatedBodyYaw = _seatedBodyYawDelta * deltaTime; + //setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, totalSeatedBodyYaw, 0.0f)))); setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, _seatedBodyYawDelta, 0.0f)))); + } else if (_seatedBodyYawDelta != 0.0f) { + //qDebug() << "start _seatedBodyYawDelta: " << _seatedBodyYawDelta; + // decelerate + const float ROTATION_DECAY_TIMESCALE = 0.25f; + float attenuation = 1.0f - deltaTime / ROTATION_DECAY_TIMESCALE; + if (attenuation < 0.0f) { + attenuation = 0.0f; + } + _seatedBodyYawDelta *= attenuation; - //original - //float rotatingWhileSeatedYaw = -getDriveKey(TRANSLATE_X) * _yawSpeed * deltaTime; - //setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, rotatingWhileSeatedYaw, 0.0f)))); + float MINIMUM_ROTATION_RATE = 2.0f; + if (fabsf(_seatedBodyYawDelta) < MINIMUM_ROTATION_RATE * deltaTime) { + _seatedBodyYawDelta = 0.0f; + } + //float totalSeatedBodyYaw = _seatedBodyYawDelta * deltaTime; + //setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, totalSeatedBodyYaw, 0.0f)))); + setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, _seatedBodyYawDelta, 0.0f)))); } else { _seatedBodyYawDelta = 0.0f; _seatedInterpTime = 0.0f; @@ -3611,20 +3625,20 @@ void MyAvatar::updateOrientation(float deltaTime) { const float DEFAULT_REORIENT_ANGLE = 65.0f; const float FIRST_PERSON_REORIENT_ANGLE = 95.0f; - const float TRIGGER_REORIENT_ANGLE = 45.0f; + const float TRIGGER_REORIENT_ANGLE = 135.0f; const float FIRST_PERSON_TRIGGER_REORIENT_ANGLE = 65.0f; glm::vec3 ajustedYawVector = cameraYawVector; - float limitAngle = 0.0f; - float triggerAngle = -glm::sin(glm::radians(TRIGGER_REORIENT_ANGLE)); + float triggerAngle = glm::sin(glm::radians(90.0f - TRIGGER_REORIENT_ANGLE)); + float limitAngle = triggerAngle; if (mode == CAMERA_MODE_FIRST_PERSON_LOOK_AT) { limitAngle = glm::sin(glm::radians(90.0f - FIRST_PERSON_TRIGGER_REORIENT_ANGLE)); triggerAngle = limitAngle; } float reorientAngle = mode == CAMERA_MODE_FIRST_PERSON_LOOK_AT ? FIRST_PERSON_REORIENT_ANGLE : DEFAULT_REORIENT_ANGLE; + if (frontBackDot < 0.0f) { + ajustedYawVector = (leftRightDot < 0.0f ? -avatarVectorRight : avatarVectorRight); + } if (frontBackDot < limitAngle) { - if (frontBackDot < 0.0f) { - ajustedYawVector = (leftRightDot < 0.0f ? -avatarVectorRight : avatarVectorRight); - } if (!isRotatingWhileSeated) { if (frontBackDot < triggerAngle) { _shouldTurnToFaceCamera = true; @@ -3632,6 +3646,7 @@ void MyAvatar::updateOrientation(float deltaTime) { } } else { setWorldOrientation(previousOrientation); + _seatedBodyYawDelta = 0.0f; } } else if (frontBackDot > glm::sin(glm::radians(reorientAngle))) { _shouldTurnToFaceCamera = false;