mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 17:01:18 +02:00
working on strafe left and right transitions
This commit is contained in:
parent
bd88d5f15b
commit
096cb0db81
3 changed files with 34 additions and 18 deletions
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue