mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-07-23 11:04:02 +02:00
Added inAir animations
This commit is contained in:
parent
ee96341380
commit
e9fd439ffd
5 changed files with 125 additions and 14 deletions
|
@ -247,7 +247,8 @@
|
||||||
{ "var": "isTurningRight", "state": "turnRight" },
|
{ "var": "isTurningRight", "state": "turnRight" },
|
||||||
{ "var": "isTurningLeft", "state": "turnLeft" },
|
{ "var": "isTurningLeft", "state": "turnLeft" },
|
||||||
{ "var": "isAway", "state": "awayIntro" },
|
{ "var": "isAway", "state": "awayIntro" },
|
||||||
{ "var": "isFlying", "state": "fly" }
|
{ "var": "isFlying", "state": "fly" },
|
||||||
|
{ "var": "isInAir", "state": "inAir" }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -263,7 +264,8 @@
|
||||||
{ "var": "isTurningRight", "state": "turnRight" },
|
{ "var": "isTurningRight", "state": "turnRight" },
|
||||||
{ "var": "isTurningLeft", "state": "turnLeft" },
|
{ "var": "isTurningLeft", "state": "turnLeft" },
|
||||||
{ "var": "isAway", "state": "awayIntro" },
|
{ "var": "isAway", "state": "awayIntro" },
|
||||||
{ "var": "isFlying", "state": "fly" }
|
{ "var": "isFlying", "state": "fly" },
|
||||||
|
{ "var": "isInAir", "state": "inAir" }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -278,7 +280,8 @@
|
||||||
{ "var": "isTurningRight", "state": "turnRight" },
|
{ "var": "isTurningRight", "state": "turnRight" },
|
||||||
{ "var": "isTurningLeft", "state": "turnLeft" },
|
{ "var": "isTurningLeft", "state": "turnLeft" },
|
||||||
{ "var": "isAway", "state": "awayIntro" },
|
{ "var": "isAway", "state": "awayIntro" },
|
||||||
{ "var": "isFlying", "state": "fly" }
|
{ "var": "isFlying", "state": "fly" },
|
||||||
|
{ "var": "isInAir", "state": "inAir" }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -293,7 +296,8 @@
|
||||||
{ "var": "isTurningRight", "state": "turnRight" },
|
{ "var": "isTurningRight", "state": "turnRight" },
|
||||||
{ "var": "isTurningLeft", "state": "turnLeft" },
|
{ "var": "isTurningLeft", "state": "turnLeft" },
|
||||||
{ "var": "isAway", "state": "awayIntro" },
|
{ "var": "isAway", "state": "awayIntro" },
|
||||||
{ "var": "isFlying", "state": "fly" }
|
{ "var": "isFlying", "state": "fly" },
|
||||||
|
{ "var": "isInAir", "state": "inAir" }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -308,7 +312,8 @@
|
||||||
{ "var": "isTurningRight", "state": "turnRight" },
|
{ "var": "isTurningRight", "state": "turnRight" },
|
||||||
{ "var": "isTurningLeft", "state": "turnLeft" },
|
{ "var": "isTurningLeft", "state": "turnLeft" },
|
||||||
{ "var": "isAway", "state": "awayIntro" },
|
{ "var": "isAway", "state": "awayIntro" },
|
||||||
{ "var": "isFlying", "state": "fly" }
|
{ "var": "isFlying", "state": "fly" },
|
||||||
|
{ "var": "isInAir", "state": "inAir" }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -323,7 +328,8 @@
|
||||||
{ "var": "isTurningRight", "state": "turnRight" },
|
{ "var": "isTurningRight", "state": "turnRight" },
|
||||||
{ "var": "isTurningLeft", "state": "turnLeft" },
|
{ "var": "isTurningLeft", "state": "turnLeft" },
|
||||||
{ "var": "isAway", "state": "awayIntro" },
|
{ "var": "isAway", "state": "awayIntro" },
|
||||||
{ "var": "isFlying", "state": "fly" }
|
{ "var": "isFlying", "state": "fly" },
|
||||||
|
{ "var": "isInAir", "state": "inAir" }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -338,7 +344,8 @@
|
||||||
{ "var": "isMovingLeft", "state": "strafeLeft" },
|
{ "var": "isMovingLeft", "state": "strafeLeft" },
|
||||||
{ "var": "isTurningLeft", "state": "turnLeft" },
|
{ "var": "isTurningLeft", "state": "turnLeft" },
|
||||||
{ "var": "isAway", "state": "awayIntro" },
|
{ "var": "isAway", "state": "awayIntro" },
|
||||||
{ "var": "isFlying", "state": "fly" }
|
{ "var": "isFlying", "state": "fly" },
|
||||||
|
{ "var": "isInAir", "state": "inAir" }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -353,7 +360,8 @@
|
||||||
{ "var": "isMovingLeft", "state": "strafeLeft" },
|
{ "var": "isMovingLeft", "state": "strafeLeft" },
|
||||||
{ "var": "isTurningRight", "state": "turnRight" },
|
{ "var": "isTurningRight", "state": "turnRight" },
|
||||||
{ "var": "isAway", "state": "awayIntro" },
|
{ "var": "isAway", "state": "awayIntro" },
|
||||||
{ "var": "isFlying", "state": "fly" }
|
{ "var": "isFlying", "state": "fly" },
|
||||||
|
{ "var": "isInAir", "state": "inAir" }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -385,8 +393,18 @@
|
||||||
"interpTarget": 6,
|
"interpTarget": 6,
|
||||||
"interpDuration": 6,
|
"interpDuration": 6,
|
||||||
"transitions": [
|
"transitions": [
|
||||||
|
{ "var": "isAway", "state": "awayIntro" },
|
||||||
{ "var": "isNotFlying", "state": "idle" }
|
{ "var": "isNotFlying", "state": "idle" }
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "inAir",
|
||||||
|
"interpTarget": 3,
|
||||||
|
"interpDuration": 3,
|
||||||
|
"transitions": [
|
||||||
|
{ "var": "isAway", "state": "awayIntro" },
|
||||||
|
{ "var": "isNotInAir", "state": "idle" }
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -685,6 +703,52 @@
|
||||||
"loopFlag": true
|
"loopFlag": true
|
||||||
},
|
},
|
||||||
"children": []
|
"children": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "inAir",
|
||||||
|
"type": "blendLinear",
|
||||||
|
"data": {
|
||||||
|
"alpha": 0.0,
|
||||||
|
"alphaVar": "inAirAlpha"
|
||||||
|
},
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "inAirPreApex",
|
||||||
|
"type": "clip",
|
||||||
|
"data": {
|
||||||
|
"url": "https://hifi-content.s3.amazonaws.com/ozan/dev/anim/standard_anims_160127/jump_in_air.fbx",
|
||||||
|
"startFrame": 0.0,
|
||||||
|
"endFrame": 0.0,
|
||||||
|
"timeScale": 0.0,
|
||||||
|
"loopFlag": true
|
||||||
|
},
|
||||||
|
"children": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "inAirApex",
|
||||||
|
"type": "clip",
|
||||||
|
"data": {
|
||||||
|
"url": "https://hifi-content.s3.amazonaws.com/ozan/dev/anim/standard_anims_160127/jump_in_air.fbx",
|
||||||
|
"startFrame": 6.0,
|
||||||
|
"endFrame": 6.0,
|
||||||
|
"timeScale": 1.0,
|
||||||
|
"loopFlag": true
|
||||||
|
},
|
||||||
|
"children": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "inAirPostApex",
|
||||||
|
"type": "clip",
|
||||||
|
"data": {
|
||||||
|
"url": "https://hifi-content.s3.amazonaws.com/ozan/dev/anim/standard_anims_160127/jump_in_air.fbx",
|
||||||
|
"startFrame": 11.0,
|
||||||
|
"endFrame": 11.0,
|
||||||
|
"timeScale": 1.0,
|
||||||
|
"loopFlag": true
|
||||||
|
},
|
||||||
|
"children": []
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -133,7 +133,14 @@ void SkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) {
|
||||||
|
|
||||||
_rig->updateFromHandParameters(handParams, deltaTime);
|
_rig->updateFromHandParameters(handParams, deltaTime);
|
||||||
|
|
||||||
_rig->computeMotionAnimationState(deltaTime, _owningAvatar->getPosition(), _owningAvatar->getVelocity(), _owningAvatar->getOrientation(), myAvatar->isHovering());
|
Rig::CharacterControllerState ccState = Rig::CharacterControllerState::Ground;
|
||||||
|
if (myAvatar->getCharacterController()->isHovering()) {
|
||||||
|
ccState = Rig::CharacterControllerState::Hover;
|
||||||
|
} else if (myAvatar->getCharacterController()->isJumping()) {
|
||||||
|
ccState = Rig::CharacterControllerState::Jump;
|
||||||
|
}
|
||||||
|
|
||||||
|
_rig->computeMotionAnimationState(deltaTime, _owningAvatar->getPosition(), _owningAvatar->getVelocity(), _owningAvatar->getOrientation(), ccState);
|
||||||
|
|
||||||
// evaluate AnimGraph animation and update jointStates.
|
// evaluate AnimGraph animation and update jointStates.
|
||||||
Model::updateRig(deltaTime, parentTransform);
|
Model::updateRig(deltaTime, parentTransform);
|
||||||
|
|
|
@ -504,7 +504,7 @@ static const std::vector<float> FORWARD_SPEEDS = { 0.4f, 1.4f, 4.5f }; // m/s
|
||||||
static const std::vector<float> BACKWARD_SPEEDS = { 0.6f, 1.45f }; // m/s
|
static const std::vector<float> BACKWARD_SPEEDS = { 0.6f, 1.45f }; // m/s
|
||||||
static const std::vector<float> LATERAL_SPEEDS = { 0.2f, 0.65f }; // m/s
|
static const std::vector<float> LATERAL_SPEEDS = { 0.2f, 0.65f }; // m/s
|
||||||
|
|
||||||
void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPosition, const glm::vec3& worldVelocity, const glm::quat& worldRotation, bool isHovering) {
|
void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPosition, const glm::vec3& worldVelocity, const glm::quat& worldRotation, CharacterControllerState ccState) {
|
||||||
|
|
||||||
glm::vec3 front = worldRotation * IDENTITY_FRONT;
|
glm::vec3 front = worldRotation * IDENTITY_FRONT;
|
||||||
|
|
||||||
|
@ -572,11 +572,16 @@ void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPos
|
||||||
const float TURN_ENTER_SPEED_THRESHOLD = 0.5f; // rad/sec
|
const float TURN_ENTER_SPEED_THRESHOLD = 0.5f; // rad/sec
|
||||||
const float TURN_EXIT_SPEED_THRESHOLD = 0.2f; // rad/sec
|
const float TURN_EXIT_SPEED_THRESHOLD = 0.2f; // rad/sec
|
||||||
|
|
||||||
if (isHovering) {
|
if (ccState == CharacterControllerState::Hover) {
|
||||||
if (_desiredState != RigRole::Hover) {
|
if (_desiredState != RigRole::Hover) {
|
||||||
_desiredStateAge = 0.0f;
|
_desiredStateAge = 0.0f;
|
||||||
}
|
}
|
||||||
_desiredState = RigRole::Hover;
|
_desiredState = RigRole::Hover;
|
||||||
|
} else if (ccState == CharacterControllerState::Jump) {
|
||||||
|
if (_desiredState != RigRole::Jump) {
|
||||||
|
_desiredStateAge = 0.0f;
|
||||||
|
}
|
||||||
|
_desiredState = RigRole::Jump;
|
||||||
} else {
|
} else {
|
||||||
float moveThresh;
|
float moveThresh;
|
||||||
if (_state != RigRole::Move) {
|
if (_state != RigRole::Move) {
|
||||||
|
@ -662,6 +667,8 @@ void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPos
|
||||||
_animVars.set("isNotTurning", true);
|
_animVars.set("isNotTurning", true);
|
||||||
_animVars.set("isFlying", false);
|
_animVars.set("isFlying", false);
|
||||||
_animVars.set("isNotFlying", true);
|
_animVars.set("isNotFlying", true);
|
||||||
|
_animVars.set("isInAir", false);
|
||||||
|
_animVars.set("isNotInAir", true);
|
||||||
}
|
}
|
||||||
} else if (_state == RigRole::Turn) {
|
} else if (_state == RigRole::Turn) {
|
||||||
if (turningSpeed > 0.0f) {
|
if (turningSpeed > 0.0f) {
|
||||||
|
@ -682,6 +689,8 @@ void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPos
|
||||||
_animVars.set("isNotMoving", true);
|
_animVars.set("isNotMoving", true);
|
||||||
_animVars.set("isFlying", false);
|
_animVars.set("isFlying", false);
|
||||||
_animVars.set("isNotFlying", true);
|
_animVars.set("isNotFlying", true);
|
||||||
|
_animVars.set("isInAir", false);
|
||||||
|
_animVars.set("isNotInAir", true);
|
||||||
} else if (_state == RigRole::Idle ) {
|
} else if (_state == RigRole::Idle ) {
|
||||||
// default anim vars to notMoving and notTurning
|
// default anim vars to notMoving and notTurning
|
||||||
_animVars.set("isMovingForward", false);
|
_animVars.set("isMovingForward", false);
|
||||||
|
@ -694,7 +703,9 @@ void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPos
|
||||||
_animVars.set("isNotTurning", true);
|
_animVars.set("isNotTurning", true);
|
||||||
_animVars.set("isFlying", false);
|
_animVars.set("isFlying", false);
|
||||||
_animVars.set("isNotFlying", true);
|
_animVars.set("isNotFlying", true);
|
||||||
} else {
|
_animVars.set("isInAir", false);
|
||||||
|
_animVars.set("isNotInAir", true);
|
||||||
|
} else if (_state == RigRole::Hover) {
|
||||||
// flying.
|
// flying.
|
||||||
_animVars.set("isMovingForward", false);
|
_animVars.set("isMovingForward", false);
|
||||||
_animVars.set("isMovingBackward", false);
|
_animVars.set("isMovingBackward", false);
|
||||||
|
@ -706,6 +717,27 @@ void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPos
|
||||||
_animVars.set("isNotTurning", true);
|
_animVars.set("isNotTurning", true);
|
||||||
_animVars.set("isFlying", true);
|
_animVars.set("isFlying", true);
|
||||||
_animVars.set("isNotFlying", false);
|
_animVars.set("isNotFlying", false);
|
||||||
|
_animVars.set("isInAir", false);
|
||||||
|
_animVars.set("isNotInAir", true);
|
||||||
|
} else if (_state == RigRole::Jump) {
|
||||||
|
// jumping in-air
|
||||||
|
_animVars.set("isMovingForward", false);
|
||||||
|
_animVars.set("isMovingBackward", false);
|
||||||
|
_animVars.set("isMovingLeft", false);
|
||||||
|
_animVars.set("isMovingRight", false);
|
||||||
|
_animVars.set("isNotMoving", true);
|
||||||
|
_animVars.set("isTurningLeft", false);
|
||||||
|
_animVars.set("isTurningRight", false);
|
||||||
|
_animVars.set("isNotTurning", true);
|
||||||
|
_animVars.set("isFlying", false);
|
||||||
|
_animVars.set("isNotFlying", true);
|
||||||
|
_animVars.set("isInAir", true);
|
||||||
|
_animVars.set("isNotInAir", false);
|
||||||
|
|
||||||
|
// compute blend based on velocity
|
||||||
|
const float JUMP_SPEED = 3.5f;
|
||||||
|
float alpha = glm::clamp(-worldVelocity.y / JUMP_SPEED, -1.0f, 1.0f) + 1.0f;
|
||||||
|
_animVars.set("inAirAlpha", alpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
t += deltaTime;
|
t += deltaTime;
|
||||||
|
|
|
@ -73,6 +73,12 @@ public:
|
||||||
glm::quat rightOrientation = glm::quat(); // rig space (z forward)
|
glm::quat rightOrientation = glm::quat(); // rig space (z forward)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class CharacterControllerState {
|
||||||
|
Ground = 0,
|
||||||
|
Jump,
|
||||||
|
Hover
|
||||||
|
};
|
||||||
|
|
||||||
virtual ~Rig() {}
|
virtual ~Rig() {}
|
||||||
|
|
||||||
void destroyAnimGraph();
|
void destroyAnimGraph();
|
||||||
|
@ -141,7 +147,7 @@ public:
|
||||||
glm::mat4 getJointTransform(int jointIndex) const;
|
glm::mat4 getJointTransform(int jointIndex) const;
|
||||||
|
|
||||||
// Start or stop animations as needed.
|
// Start or stop animations as needed.
|
||||||
void computeMotionAnimationState(float deltaTime, const glm::vec3& worldPosition, const glm::vec3& worldVelocity, const glm::quat& worldRotation, bool isHovering);
|
void computeMotionAnimationState(float deltaTime, const glm::vec3& worldPosition, const glm::vec3& worldVelocity, const glm::quat& worldRotation, CharacterControllerState ccState);
|
||||||
|
|
||||||
// Regardless of who started the animations or how many, update the joints.
|
// Regardless of who started the animations or how many, update the joints.
|
||||||
void updateAnimations(float deltaTime, glm::mat4 rootTransform);
|
void updateAnimations(float deltaTime, glm::mat4 rootTransform);
|
||||||
|
@ -271,7 +277,8 @@ public:
|
||||||
Idle = 0,
|
Idle = 0,
|
||||||
Turn,
|
Turn,
|
||||||
Move,
|
Move,
|
||||||
Hover
|
Hover,
|
||||||
|
Jump
|
||||||
};
|
};
|
||||||
RigRole _state { RigRole::Idle };
|
RigRole _state { RigRole::Idle };
|
||||||
RigRole _desiredState { RigRole::Idle };
|
RigRole _desiredState { RigRole::Idle };
|
||||||
|
|
|
@ -75,6 +75,7 @@ public:
|
||||||
|
|
||||||
glm::vec3 getLinearVelocity() const;
|
glm::vec3 getLinearVelocity() const;
|
||||||
|
|
||||||
|
bool isJumping() const { return _isJumping; }
|
||||||
bool isHovering() const { return _isHovering; }
|
bool isHovering() const { return _isHovering; }
|
||||||
void setHovering(bool enabled);
|
void setHovering(bool enabled);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue