From 995f5f92cdc855fde5ea64cdc39f31395618727e Mon Sep 17 00:00:00 2001 From: DouglasWilcox <916219+DouglasWilcox@users.noreply.github.com> Date: Tue, 12 Nov 2019 11:11:19 -0800 Subject: [PATCH] Do not use turningSpeed when setting seatedTurn vars, and iterate acceleration formula --- interface/src/avatar/MyAvatar.cpp | 58 +++++++++++++++++-- libraries/animation/src/Rig.cpp | 34 ++++++----- .../src/avatars-renderer/Avatar.h | 1 + 3 files changed, 72 insertions(+), 21 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 87e7c4be5c..8ed629d89e 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -3513,21 +3513,69 @@ 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 = -getDriveKey(TRANSLATE_X) * _yawSpeed; - - const float SEATED_ROTATION_RAMP_TIMESCALE = 0.5f; + const float SEATED_ROTATION_RAMP_TIMESCALE = 1.0; //used as divisor float blend = deltaTime / SEATED_ROTATION_RAMP_TIMESCALE; if (blend > 1.0f) { blend = 1.0f; } - _seatedBodyYawDelta = (1.0f - blend) * _seatedBodyYawDelta + blend * seatedTargetSpeed; + + /////// ease in + //_seatedBodyYawDelta = (1.0f - blend) * _seatedBodyYawDelta + blend * seatedTargetSpeed; + + /////// ease out WIP + + 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; + } + } else { + //init rotation + _seatedInterpTime = blend; + _seatedBodyYawDelta = blend * direction; + } + + //////// linear + //if (_seatedBodyYawDelta < seatedTargetSpeed) { + // _seatedBodyYawDelta += blend; + //} + setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, _seatedBodyYawDelta, 0.0f)))); + qDebug() << "_seatedBodyYawDelta: " << _seatedBodyYawDelta; - + //original //float rotatingWhileSeatedYaw = -getDriveKey(TRANSLATE_X) * _yawSpeed * deltaTime; //setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, rotatingWhileSeatedYaw, 0.0f)))); + + //qDebug() << "_seatedBodyYawDelta: " << rotatingWhileSeatedYaw; + } else if (_characterController.getSeated() && _seatedBodyYawDelta > 0.0f) { + // attenuate body rotation speed + const float SEATED_ROTATION_DECAY_TIMESCALE = 0.05f; + float attenuation = 1.0f - deltaTime / SEATED_ROTATION_DECAY_TIMESCALE; + if (attenuation < 0.0f) { + attenuation = 0.0f; + } + _seatedBodyYawDelta *= attenuation; + + float MINIMUM_ROTATION_RATE = 2.0f; + if (fabsf(_seatedBodyYawDelta) < MINIMUM_ROTATION_RATE) { + _seatedBodyYawDelta = 0.0f; + } + + setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, _seatedBodyYawDelta, 0.0f)))); + + qDebug() << "attenuated _seatedBodyYawDelta: " << _seatedBodyYawDelta; + } else { + _seatedBodyYawDelta = 0.0f; + _seatedInterpTime = 0.0f; } } diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index 6a9bd6a15c..612b104540 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -1093,6 +1093,12 @@ void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPos const float TURN_ENTER_SPEED_THRESHOLD = 0.5f; // rad/sec const float TURN_EXIT_SPEED_THRESHOLD = 0.2f; // rad/sec + //stategraph vars based on input + const float INPUT_DEADZONE_THRESHOLD = 0.05f; + const float SLOW_SPEED_THRESHOLD = 1.5f; + const float HAS_MOMENTUM_THRESHOLD = 2.2f; + const float RESET_MOMENTUM_THRESHOLD = 0.05f; + if (ccState == CharacterControllerState::Hover) { if (_desiredState != RigRole::Hover) { _desiredStateAge = 0.0f; @@ -1412,21 +1418,21 @@ void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPos _animVars.set("inAirAlpha", alpha); } else if (_state == RigRole::Seated) { - if (turningSpeed > 0.05f) { - // seated turning right - _animVars.set("isSeatedTurningRight", true); - _animVars.set("isSeatedTurningLeft", false); - _animVars.set("isSeatedNotTurning", false); - } else if (turningSpeed < -0.05f) { - // seated turning left - _animVars.set("isSeatedTurningRight", false); - _animVars.set("isSeatedTurningLeft", true); - _animVars.set("isSeatedNotTurning", false); - } else { + if (fabsf(_previousControllerParameters.inputX) <= INPUT_DEADZONE_THRESHOLD) { // seated not turning _animVars.set("isSeatedTurningRight", false); _animVars.set("isSeatedTurningLeft", false); _animVars.set("isSeatedNotTurning", true); + } else if (turningSpeed > 0.1f) { + // seated turning right + _animVars.set("isSeatedTurningRight", true); + _animVars.set("isSeatedTurningLeft", false); + _animVars.set("isSeatedNotTurning", false); + } else if (turningSpeed < -0.1f) { + // seated turning left + _animVars.set("isSeatedTurningRight", false); + _animVars.set("isSeatedTurningLeft", true); + _animVars.set("isSeatedNotTurning", false); } _animVars.set("isMovingForward", false); @@ -1470,11 +1476,7 @@ void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPos _lastEnableInverseKinematics = _enableInverseKinematics; - //stategraph vars based on input - const float INPUT_DEADZONE_THRESHOLD = 0.05f; - const float SLOW_SPEED_THRESHOLD = 1.5f; - const float HAS_MOMENTUM_THRESHOLD = 2.2f; - const float RESET_MOMENTUM_THRESHOLD = 0.05f; + if (fabsf(_previousControllerParameters.inputX) <= INPUT_DEADZONE_THRESHOLD && fabsf(_previousControllerParameters.inputZ) <= INPUT_DEADZONE_THRESHOLD) { diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 86c19695e1..505ffa71dd 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -663,6 +663,7 @@ protected: float _bodyYawDelta { 0.0f }; // degrees/sec float _seatedBodyYawDelta{ 0.0f }; //degrees/sec + float _seatedInterpTime{ 0.0f }; //used to transition rot while seated. // These position histories and derivatives are in the world-frame. // The derivatives are the MEASURED results of all external and internal forces