working on strafe left and right transitions

This commit is contained in:
amantley 2018-08-02 13:32:06 -07:00
parent bd88d5f15b
commit 096cb0db81
3 changed files with 34 additions and 18 deletions

View file

@ -109,13 +109,8 @@ const AnimPoseVec& AnimStateMachine::evaluate(const AnimVariantMap& animVars, co
_animStack[_currentState->getID()] = 1.0f; _animStack[_currentState->getID()] = 1.0f;
_poses = currentStateNode->evaluate(animVars, context, dt, triggersOut); _poses = currentStateNode->evaluate(animVars, context, dt, triggersOut);
} }
<<<<<<< HEAD
=======
processOutputJoints(triggersOut); processOutputJoints(triggersOut);
>>>>>>> upstream/master
return _poses; return _poses;
} }
@ -127,7 +122,7 @@ void AnimStateMachine::addState(State::Pointer state) {
_states.push_back(state); _states.push_back(state);
} }
void AnimStateMachine::switchState(AnimVariantMap& animVars, const AnimContext& context, State::Pointer desiredState) { void AnimStateMachine::switchState(const AnimVariantMap& animVars, const AnimContext& context, State::Pointer desiredState) {
const float FRAMES_PER_SECOND = 30.0f; const float FRAMES_PER_SECOND = 30.0f;

View file

@ -123,7 +123,7 @@ protected:
void addState(State::Pointer state); void addState(State::Pointer state);
void switchState(AnimVariantMap& animVars, const AnimContext& context, State::Pointer desiredState); void switchState(const AnimVariantMap& animVars, const AnimContext& context, State::Pointer desiredState);
State::Pointer evaluateTransitions(const AnimVariantMap& animVars) const; State::Pointer evaluateTransitions(const AnimVariantMap& animVars) const;
// for AnimDebugDraw rendering // for AnimDebugDraw rendering

View file

@ -641,6 +641,11 @@ void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPos
float lateralSpeed = glm::dot(localVel, IDENTITY_RIGHT); float lateralSpeed = glm::dot(localVel, IDENTITY_RIGHT);
float turningSpeed = glm::orientedAngle(forward, _lastForward, IDENTITY_UP) / deltaTime; float turningSpeed = glm::orientedAngle(forward, _lastForward, IDENTITY_UP) / deltaTime;
glm::vec3 lastVel = glm::inverse(worldRotation) * _lastVelocity;
float lastForwardSpeed = glm::dot(lastVel, IDENTITY_FORWARD);
float lastLateralSpeed = glm::dot(lastVel, IDENTITY_RIGHT);
// filter speeds using a simple moving average. // filter speeds using a simple moving average.
_averageForwardSpeed.updateAverage(forwardSpeed); _averageForwardSpeed.updateAverage(forwardSpeed);
_averageLateralSpeed.updateAverage(lateralSpeed); _averageLateralSpeed.updateAverage(lateralSpeed);
@ -723,26 +728,20 @@ void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPos
if ((_desiredStateAge >= STATE_CHANGE_HYSTERESIS_TIMER) && _desiredState != _state) { if ((_desiredStateAge >= STATE_CHANGE_HYSTERESIS_TIMER) && _desiredState != _state) {
_state = _desiredState; _state = _desiredState;
_desiredStateAge = 0.0f; _desiredStateAge = 0.0f;
// if we are changing anim states.
//reset the average speed to the current reading of speed
qCDebug(animation) << "reset the average movement speeds";
_averageForwardSpeed.reset();
_averageLateralSpeed.reset();
_averageForwardSpeed.updateAverage(forwardSpeed);
_averageLateralSpeed.updateAverage(lateralSpeed);
_animVars.set("moveForwardSpeed", _averageForwardSpeed.getAverage());
_animVars.set("moveBackwardSpeed", -_averageForwardSpeed.getAverage());
_animVars.set("moveLateralSpeed", fabsf(_averageLateralSpeed.getAverage()));
} }
_desiredStateAge += deltaTime; _desiredStateAge += deltaTime;
bool resetVelocityAverage = false;
if (_state == RigRole::Move) { if (_state == RigRole::Move) {
glm::vec3 horizontalVel = localVel - glm::vec3(0.0f, localVel.y, 0.0f); glm::vec3 horizontalVel = localVel - glm::vec3(0.0f, localVel.y, 0.0f);
if (glm::length(horizontalVel) > MOVE_ENTER_SPEED_THRESHOLD) { if (glm::length(horizontalVel) > MOVE_ENTER_SPEED_THRESHOLD) {
if (fabsf(forwardSpeed) > 0.5f * fabsf(lateralSpeed)) { if (fabsf(forwardSpeed) > 0.5f * fabsf(lateralSpeed)) {
if (forwardSpeed > 0.0f) { if (forwardSpeed > 0.0f) {
if (lastForwardSpeed < 0.0f){
resetVelocityAverage = true;
}
// forward // forward
_animVars.set("isMovingForward", true); _animVars.set("isMovingForward", true);
_animVars.set("isMovingBackward", false); _animVars.set("isMovingBackward", false);
@ -751,6 +750,9 @@ void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPos
_animVars.set("isNotMoving", false); _animVars.set("isNotMoving", false);
} else { } else {
if (lastForwardSpeed > 0.0f) {
resetVelocityAverage = true;
}
// backward // backward
_animVars.set("isMovingBackward", true); _animVars.set("isMovingBackward", true);
_animVars.set("isMovingForward", false); _animVars.set("isMovingForward", false);
@ -760,6 +762,9 @@ void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPos
} }
} else { } else {
if (lateralSpeed > 0.0f) { if (lateralSpeed > 0.0f) {
if (lastLateralSpeed < 0.0f) {
resetVelocityAverage = true;
}
// right // right
_animVars.set("isMovingRight", true); _animVars.set("isMovingRight", true);
_animVars.set("isMovingLeft", false); _animVars.set("isMovingLeft", false);
@ -767,6 +772,9 @@ void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPos
_animVars.set("isMovingBackward", false); _animVars.set("isMovingBackward", false);
_animVars.set("isNotMoving", false); _animVars.set("isNotMoving", false);
} else { } else {
if (lastLateralSpeed > 0.0f) {
resetVelocityAverage = true;
}
// left // left
_animVars.set("isMovingLeft", true); _animVars.set("isMovingLeft", true);
_animVars.set("isMovingRight", false); _animVars.set("isMovingRight", false);
@ -788,6 +796,19 @@ void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPos
_animVars.set("isInAirRun", false); _animVars.set("isInAirRun", false);
_animVars.set("isNotInAir", true); _animVars.set("isNotInAir", true);
if (false) {
// if we are changing anim states.
//reset the average speed to the current reading of speed
qCDebug(animation) << "reset the average movement speeds";
_averageForwardSpeed.reset();
_averageLateralSpeed.reset();
_averageForwardSpeed.updateAverage(forwardSpeed);
_averageLateralSpeed.updateAverage(lateralSpeed);
_animVars.set("moveForwardSpeed", _averageForwardSpeed.getAverage());
_animVars.set("moveBackwardSpeed", -_averageForwardSpeed.getAverage());
_animVars.set("moveLateralSpeed", fabsf(_averageLateralSpeed.getAverage()));
}
} else if (_state == RigRole::Turn) { } else if (_state == RigRole::Turn) {
if (turningSpeed > 0.0f) { if (turningSpeed > 0.0f) {
// turning right // turning right