From c36c4a17b1748ea7d195a5876125784110957c11 Mon Sep 17 00:00:00 2001 From: DouglasWilcox <916219+DouglasWilcox@users.noreply.github.com> Date: Mon, 11 Nov 2019 11:31:34 -0800 Subject: [PATCH] first pass hookup of seated rotation with acceleration and animation response --- interface/src/avatar/MyAvatar.cpp | 17 +++++++-- libraries/animation/src/Rig.cpp | 35 +++++++++++++++++++ .../src/avatars-renderer/Avatar.h | 1 + 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 2522d0e4c6..87e7c4be5c 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -3513,8 +3513,21 @@ void MyAvatar::updateOrientation(float deltaTime) { } setWorldOrientation(glm::slerp(getWorldOrientation(), faceRotation, blend)); } else if (isRotatingWhileSeated) { - float rotatingWhileSeatedYaw = -getDriveKey(TRANSLATE_X) * _yawSpeed * deltaTime; - setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, rotatingWhileSeatedYaw, 0.0f)))); + + float seatedTargetSpeed = -getDriveKey(TRANSLATE_X) * _yawSpeed; + + const float SEATED_ROTATION_RAMP_TIMESCALE = 0.5f; + float blend = deltaTime / SEATED_ROTATION_RAMP_TIMESCALE; + if (blend > 1.0f) { + blend = 1.0f; + } + _seatedBodyYawDelta = (1.0f - blend) * _seatedBodyYawDelta + blend * seatedTargetSpeed; + setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, _seatedBodyYawDelta, 0.0f)))); + + + + //float rotatingWhileSeatedYaw = -getDriveKey(TRANSLATE_X) * _yawSpeed * deltaTime; + //setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, rotatingWhileSeatedYaw, 0.0f)))); } } diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index 0a9efadb81..0d8eeb2535 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -1245,6 +1245,9 @@ void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPos _animVars.set("isNotInAir", true); _animVars.set("isSeated", false); _animVars.set("isNotSeated", true); + _animVars.set("isSeatedTurningRight", false); + _animVars.set("isSeatedTurningLeft", false); + _animVars.set("isSeatedNotTurning", false); } else if (_state == RigRole::Turn) { if (turningSpeed > 0.0f) { @@ -1275,6 +1278,9 @@ void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPos _animVars.set("isNotInAir", true); _animVars.set("isSeated", false); _animVars.set("isNotSeated", true); + _animVars.set("isSeatedTurningRight", false); + _animVars.set("isSeatedTurningLeft", false); + _animVars.set("isSeatedNotTurning", false); } else if (_state == RigRole::Idle) { // default anim vars to notMoving and notTurning @@ -1298,6 +1304,9 @@ void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPos _animVars.set("isNotInAir", true); _animVars.set("isSeated", false); _animVars.set("isNotSeated", true); + _animVars.set("isSeatedTurningRight", false); + _animVars.set("isSeatedTurningLeft", false); + _animVars.set("isSeatedNotTurning", false); } else if (_state == RigRole::Hover) { // flying. @@ -1321,6 +1330,9 @@ void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPos _animVars.set("isNotInAir", true); _animVars.set("isSeated", false); _animVars.set("isNotSeated", true); + _animVars.set("isSeatedTurningRight", false); + _animVars.set("isSeatedTurningLeft", false); + _animVars.set("isSeatedNotTurning", false); } else if (_state == RigRole::Takeoff) { // jumping in-air @@ -1352,6 +1364,9 @@ void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPos _animVars.set("isNotInAir", false); _animVars.set("isSeated", false); _animVars.set("isNotSeated", true); + _animVars.set("isSeatedTurningRight", false); + _animVars.set("isSeatedTurningLeft", false); + _animVars.set("isSeatedNotTurning", false); } else if (_state == RigRole::InAir) { // jumping in-air @@ -1372,6 +1387,9 @@ void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPos _animVars.set("isNotTakeoff", true); _animVars.set("isSeated", false); _animVars.set("isNotSeated", true); + _animVars.set("isSeatedTurningRight", false); + _animVars.set("isSeatedTurningLeft", false); + _animVars.set("isSeatedNotTurning", false); bool inAirRun = forwardSpeed > 0.1f; if (inAirRun) { @@ -1394,6 +1412,23 @@ 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 { + // seated not turning + _animVars.set("isSeatedTurningRight", false); + _animVars.set("isSeatedTurningLeft", false); + _animVars.set("isSeatedNotTurning", true); + } + _animVars.set("isMovingForward", false); _animVars.set("isMovingBackward", false); _animVars.set("isMovingRight", false); diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 031b2f1309..86c19695e1 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -662,6 +662,7 @@ protected: std::vector> _attachmentsToDelete; float _bodyYawDelta { 0.0f }; // degrees/sec + float _seatedBodyYawDelta{ 0.0f }; //degrees/sec // These position histories and derivatives are in the world-frame. // The derivatives are the MEASURED results of all external and internal forces