mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-26 03:15:21 +02:00
Merge pull request #13952 from amantley/steppingReboot
Fix for lurching walk(case 16945), when walking in hmd.
This commit is contained in:
commit
2ac0377a6e
4 changed files with 43 additions and 16 deletions
|
@ -516,6 +516,10 @@ void MyAvatar::update(float deltaTime) {
|
||||||
head->relax(deltaTime);
|
head->relax(deltaTime);
|
||||||
updateFromTrackers(deltaTime);
|
updateFromTrackers(deltaTime);
|
||||||
|
|
||||||
|
if (getIsInWalkingState() && glm::length(getControllerPoseInAvatarFrame(controller::Action::HEAD).getVelocity()) < DEFAULT_AVATAR_WALK_SPEED_THRESHOLD) {
|
||||||
|
setIsInWalkingState(false);
|
||||||
|
}
|
||||||
|
|
||||||
// Get audio loudness data from audio input device
|
// Get audio loudness data from audio input device
|
||||||
// Also get the AudioClient so we can update the avatar bounding box data
|
// Also get the AudioClient so we can update the avatar bounding box data
|
||||||
// on the AudioClient side.
|
// on the AudioClient side.
|
||||||
|
@ -3678,10 +3682,10 @@ static bool headAngularVelocityBelowThreshold(const controller::Pose& head) {
|
||||||
return isBelowThreshold;
|
return isBelowThreshold;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isWithinThresholdHeightMode(const controller::Pose& head,const float& newMode) {
|
static bool isWithinThresholdHeightMode(const controller::Pose& head, const float& newMode, const float& scale) {
|
||||||
bool isWithinThreshold = true;
|
bool isWithinThreshold = true;
|
||||||
if (head.isValid()) {
|
if (head.isValid()) {
|
||||||
isWithinThreshold = (head.getTranslation().y - newMode) > DEFAULT_AVATAR_MODE_HEIGHT_STEPPING_THRESHOLD;
|
isWithinThreshold = (head.getTranslation().y - newMode) > (DEFAULT_AVATAR_MODE_HEIGHT_STEPPING_THRESHOLD * scale);
|
||||||
}
|
}
|
||||||
return isWithinThreshold;
|
return isWithinThreshold;
|
||||||
}
|
}
|
||||||
|
@ -3802,6 +3806,10 @@ float MyAvatar::getUserEyeHeight() const {
|
||||||
return userHeight - userHeight * ratio;
|
return userHeight - userHeight * ratio;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MyAvatar::getIsInWalkingState() const {
|
||||||
|
return _isInWalkingState;
|
||||||
|
}
|
||||||
|
|
||||||
float MyAvatar::getWalkSpeed() const {
|
float MyAvatar::getWalkSpeed() const {
|
||||||
return _walkSpeed.get() * _walkSpeedScalar;
|
return _walkSpeed.get() * _walkSpeedScalar;
|
||||||
}
|
}
|
||||||
|
@ -3818,6 +3826,10 @@ void MyAvatar::setSprintMode(bool sprint) {
|
||||||
_walkSpeedScalar = sprint ? _sprintSpeed.get() : AVATAR_WALK_SPEED_SCALAR;
|
_walkSpeedScalar = sprint ? _sprintSpeed.get() : AVATAR_WALK_SPEED_SCALAR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MyAvatar::setIsInWalkingState(bool isWalking) {
|
||||||
|
_isInWalkingState = isWalking;
|
||||||
|
}
|
||||||
|
|
||||||
void MyAvatar::setWalkSpeed(float value) {
|
void MyAvatar::setWalkSpeed(float value) {
|
||||||
_walkSpeed.set(value);
|
_walkSpeed.set(value);
|
||||||
}
|
}
|
||||||
|
@ -3912,7 +3924,6 @@ void MyAvatar::lateUpdatePalms() {
|
||||||
Avatar::updatePalms();
|
Avatar::updatePalms();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static const float FOLLOW_TIME = 0.5f;
|
static const float FOLLOW_TIME = 0.5f;
|
||||||
|
|
||||||
MyAvatar::FollowHelper::FollowHelper() {
|
MyAvatar::FollowHelper::FollowHelper() {
|
||||||
|
@ -4004,24 +4015,36 @@ bool MyAvatar::FollowHelper::shouldActivateHorizontalCG(MyAvatar& myAvatar) cons
|
||||||
controller::Pose currentRightHandPose = myAvatar.getControllerPoseInAvatarFrame(controller::Action::RIGHT_HAND);
|
controller::Pose currentRightHandPose = myAvatar.getControllerPoseInAvatarFrame(controller::Action::RIGHT_HAND);
|
||||||
|
|
||||||
bool stepDetected = false;
|
bool stepDetected = false;
|
||||||
if (!withinBaseOfSupport(currentHeadPose) &&
|
float myScale = myAvatar.getAvatarScale();
|
||||||
|
|
||||||
|
if (myAvatar.getIsInWalkingState()) {
|
||||||
|
stepDetected = true;
|
||||||
|
} else {
|
||||||
|
if (!withinBaseOfSupport(currentHeadPose) &&
|
||||||
headAngularVelocityBelowThreshold(currentHeadPose) &&
|
headAngularVelocityBelowThreshold(currentHeadPose) &&
|
||||||
isWithinThresholdHeightMode(currentHeadPose, myAvatar.getCurrentStandingHeight()) &&
|
isWithinThresholdHeightMode(currentHeadPose, myAvatar.getCurrentStandingHeight(), myScale) &&
|
||||||
handDirectionMatchesHeadDirection(currentLeftHandPose, currentRightHandPose, currentHeadPose) &&
|
handDirectionMatchesHeadDirection(currentLeftHandPose, currentRightHandPose, currentHeadPose) &&
|
||||||
handAngularVelocityBelowThreshold(currentLeftHandPose, currentRightHandPose) &&
|
handAngularVelocityBelowThreshold(currentLeftHandPose, currentRightHandPose) &&
|
||||||
headVelocityGreaterThanThreshold(currentHeadPose) &&
|
headVelocityGreaterThanThreshold(currentHeadPose) &&
|
||||||
isHeadLevel(currentHeadPose, myAvatar.getAverageHeadRotation())) {
|
isHeadLevel(currentHeadPose, myAvatar.getAverageHeadRotation())) {
|
||||||
// a step is detected
|
// a step is detected
|
||||||
stepDetected = true;
|
|
||||||
} else {
|
|
||||||
glm::vec3 defaultHipsPosition = myAvatar.getAbsoluteDefaultJointTranslationInObjectFrame(myAvatar.getJointIndex("Hips"));
|
|
||||||
glm::vec3 defaultHeadPosition = myAvatar.getAbsoluteDefaultJointTranslationInObjectFrame(myAvatar.getJointIndex("Head"));
|
|
||||||
glm::vec3 currentHeadPosition = currentHeadPose.getTranslation();
|
|
||||||
float anatomicalHeadToHipsDistance = glm::length(defaultHeadPosition - defaultHipsPosition);
|
|
||||||
if (!isActive(Horizontal) &&
|
|
||||||
(glm::length(currentHeadPosition - defaultHipsPosition) > (anatomicalHeadToHipsDistance + (DEFAULT_AVATAR_SPINE_STRETCH_LIMIT * anatomicalHeadToHipsDistance)))) {
|
|
||||||
myAvatar.setResetMode(true);
|
|
||||||
stepDetected = true;
|
stepDetected = true;
|
||||||
|
if (glm::length(currentHeadPose.velocity) > DEFAULT_AVATAR_WALK_SPEED_THRESHOLD) {
|
||||||
|
myAvatar.setIsInWalkingState(true);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
glm::vec3 defaultHipsPosition = myAvatar.getAbsoluteDefaultJointTranslationInObjectFrame(myAvatar.getJointIndex("Hips"));
|
||||||
|
glm::vec3 defaultHeadPosition = myAvatar.getAbsoluteDefaultJointTranslationInObjectFrame(myAvatar.getJointIndex("Head"));
|
||||||
|
glm::vec3 currentHeadPosition = currentHeadPose.getTranslation();
|
||||||
|
float anatomicalHeadToHipsDistance = glm::length(defaultHeadPosition - defaultHipsPosition);
|
||||||
|
if (!isActive(Horizontal) &&
|
||||||
|
(glm::length(currentHeadPosition - defaultHipsPosition) > (anatomicalHeadToHipsDistance + (DEFAULT_AVATAR_SPINE_STRETCH_LIMIT * anatomicalHeadToHipsDistance)))) {
|
||||||
|
myAvatar.setResetMode(true);
|
||||||
|
stepDetected = true;
|
||||||
|
if (glm::length(currentHeadPose.velocity) > DEFAULT_AVATAR_WALK_SPEED_THRESHOLD) {
|
||||||
|
myAvatar.setIsInWalkingState(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return stepDetected;
|
return stepDetected;
|
||||||
|
|
|
@ -1086,6 +1086,8 @@ public:
|
||||||
|
|
||||||
const QUuid& getSelfID() const { return AVATAR_SELF_ID; }
|
const QUuid& getSelfID() const { return AVATAR_SELF_ID; }
|
||||||
|
|
||||||
|
void setIsInWalkingState(bool isWalking);
|
||||||
|
bool getIsInWalkingState() const;
|
||||||
void setWalkSpeed(float value);
|
void setWalkSpeed(float value);
|
||||||
float getWalkSpeed() const;
|
float getWalkSpeed() const;
|
||||||
void setWalkBackwardSpeed(float value);
|
void setWalkBackwardSpeed(float value);
|
||||||
|
@ -1788,6 +1790,7 @@ private:
|
||||||
ThreadSafeValueCache<float> _walkBackwardSpeed { DEFAULT_AVATAR_MAX_WALKING_BACKWARD_SPEED };
|
ThreadSafeValueCache<float> _walkBackwardSpeed { DEFAULT_AVATAR_MAX_WALKING_BACKWARD_SPEED };
|
||||||
ThreadSafeValueCache<float> _sprintSpeed { AVATAR_SPRINT_SPEED_SCALAR };
|
ThreadSafeValueCache<float> _sprintSpeed { AVATAR_SPRINT_SPEED_SCALAR };
|
||||||
float _walkSpeedScalar { AVATAR_WALK_SPEED_SCALAR };
|
float _walkSpeedScalar { AVATAR_WALK_SPEED_SCALAR };
|
||||||
|
bool _isInWalkingState { false };
|
||||||
|
|
||||||
// load avatar scripts once when rig is ready
|
// load avatar scripts once when rig is ready
|
||||||
bool _shouldLoadScripts { false };
|
bool _shouldLoadScripts { false };
|
||||||
|
|
|
@ -46,7 +46,7 @@ static AnimPose computeHipsInSensorFrame(MyAvatar* myAvatar, bool isFlying) {
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::mat4 hipsMat;
|
glm::mat4 hipsMat;
|
||||||
if (myAvatar->getCenterOfGravityModelEnabled() && !isFlying) {
|
if (myAvatar->getCenterOfGravityModelEnabled() && !isFlying && !(myAvatar->getIsInWalkingState())) {
|
||||||
// then we use center of gravity model
|
// then we use center of gravity model
|
||||||
hipsMat = myAvatar->deriveBodyUsingCgModel();
|
hipsMat = myAvatar->deriveBodyUsingCgModel();
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -68,6 +68,7 @@ const glm::quat DEFAULT_AVATAR_RIGHTFOOT_ROT { -0.4016716778278351f, 0.915461599
|
||||||
const float DEFAULT_AVATAR_MAX_WALKING_SPEED = 2.6f; // meters / second
|
const float DEFAULT_AVATAR_MAX_WALKING_SPEED = 2.6f; // meters / second
|
||||||
const float DEFAULT_AVATAR_MAX_WALKING_BACKWARD_SPEED = 2.2f; // meters / second
|
const float DEFAULT_AVATAR_MAX_WALKING_BACKWARD_SPEED = 2.2f; // meters / second
|
||||||
const float DEFAULT_AVATAR_MAX_FLYING_SPEED = 30.0f; // meters / second
|
const float DEFAULT_AVATAR_MAX_FLYING_SPEED = 30.0f; // meters / second
|
||||||
|
const float DEFAULT_AVATAR_WALK_SPEED_THRESHOLD = 0.15f;
|
||||||
|
|
||||||
const float DEFAULT_AVATAR_GRAVITY = -5.0f; // meters / second^2
|
const float DEFAULT_AVATAR_GRAVITY = -5.0f; // meters / second^2
|
||||||
const float DEFAULT_AVATAR_JUMP_SPEED = 3.5f; // meters / second
|
const float DEFAULT_AVATAR_JUMP_SPEED = 3.5f; // meters / second
|
||||||
|
|
Loading…
Reference in a new issue