mirror of
https://github.com/lubosz/overte.git
synced 2025-08-07 18:41:10 +02:00
Merge pull request #2611 from AndrewMeadows/avatar-speed
fix for sometimes slow avatar
This commit is contained in:
commit
aad3085e08
4 changed files with 10 additions and 14 deletions
|
@ -46,7 +46,6 @@ Avatar::Avatar() :
|
||||||
_mode(AVATAR_MODE_STANDING),
|
_mode(AVATAR_MODE_STANDING),
|
||||||
_velocity(0.0f, 0.0f, 0.0f),
|
_velocity(0.0f, 0.0f, 0.0f),
|
||||||
_thrust(0.0f, 0.0f, 0.0f),
|
_thrust(0.0f, 0.0f, 0.0f),
|
||||||
_speed(0.0f),
|
|
||||||
_leanScale(0.5f),
|
_leanScale(0.5f),
|
||||||
_scale(1.0f),
|
_scale(1.0f),
|
||||||
_worldUpDirection(DEFAULT_UP_DIRECTION),
|
_worldUpDirection(DEFAULT_UP_DIRECTION),
|
||||||
|
@ -137,7 +136,8 @@ void Avatar::simulate(float deltaTime) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// use speed and angular velocity to determine walking vs. standing
|
// use speed and angular velocity to determine walking vs. standing
|
||||||
if (_speed + fabs(_bodyYawDelta) > 0.2) {
|
float speed = glm::length(_velocity);
|
||||||
|
if (speed + fabs(_bodyYawDelta) > 0.2) {
|
||||||
_mode = AVATAR_MODE_WALKING;
|
_mode = AVATAR_MODE_WALKING;
|
||||||
} else {
|
} else {
|
||||||
_mode = AVATAR_MODE_INTERACTING;
|
_mode = AVATAR_MODE_INTERACTING;
|
||||||
|
|
|
@ -160,7 +160,6 @@ protected:
|
||||||
AvatarMode _mode;
|
AvatarMode _mode;
|
||||||
glm::vec3 _velocity;
|
glm::vec3 _velocity;
|
||||||
glm::vec3 _thrust;
|
glm::vec3 _thrust;
|
||||||
float _speed;
|
|
||||||
float _leanScale;
|
float _leanScale;
|
||||||
float _scale;
|
float _scale;
|
||||||
glm::vec3 _worldUpDirection;
|
glm::vec3 _worldUpDirection;
|
||||||
|
|
|
@ -169,9 +169,6 @@ void MyAvatar::simulate(float deltaTime) {
|
||||||
// Collect thrust forces from keyboard and devices
|
// Collect thrust forces from keyboard and devices
|
||||||
updateThrust(deltaTime);
|
updateThrust(deltaTime);
|
||||||
|
|
||||||
// calculate speed
|
|
||||||
_speed = glm::length(_velocity);
|
|
||||||
|
|
||||||
// update the movement of the hand and process handshaking with other avatars...
|
// update the movement of the hand and process handshaking with other avatars...
|
||||||
updateHandMovementAndTouching(deltaTime);
|
updateHandMovementAndTouching(deltaTime);
|
||||||
|
|
||||||
|
@ -203,9 +200,9 @@ void MyAvatar::simulate(float deltaTime) {
|
||||||
if (fabs(_bodyRollDelta) < MINIMUM_ROTATION_RATE) { _bodyRollDelta = 0.f; }
|
if (fabs(_bodyRollDelta) < MINIMUM_ROTATION_RATE) { _bodyRollDelta = 0.f; }
|
||||||
if (fabs(_bodyPitchDelta) < MINIMUM_ROTATION_RATE) { _bodyPitchDelta = 0.f; }
|
if (fabs(_bodyPitchDelta) < MINIMUM_ROTATION_RATE) { _bodyPitchDelta = 0.f; }
|
||||||
|
|
||||||
const float MAX_STATIC_FRICTION_VELOCITY = 0.5f;
|
const float MAX_STATIC_FRICTION_SPEED = 0.5f;
|
||||||
const float STATIC_FRICTION_STRENGTH = _scale * 20.f;
|
const float STATIC_FRICTION_STRENGTH = _scale * 20.f;
|
||||||
applyStaticFriction(deltaTime, _velocity, MAX_STATIC_FRICTION_VELOCITY, STATIC_FRICTION_STRENGTH);
|
applyStaticFriction(deltaTime, _velocity, MAX_STATIC_FRICTION_SPEED, STATIC_FRICTION_STRENGTH);
|
||||||
|
|
||||||
// Damp avatar velocity
|
// Damp avatar velocity
|
||||||
const float LINEAR_DAMPING_STRENGTH = 0.5f;
|
const float LINEAR_DAMPING_STRENGTH = 0.5f;
|
||||||
|
@ -230,7 +227,8 @@ void MyAvatar::simulate(float deltaTime) {
|
||||||
|
|
||||||
const float WALKING_SPEED_THRESHOLD = 0.2f;
|
const float WALKING_SPEED_THRESHOLD = 0.2f;
|
||||||
// use speed and angular velocity to determine walking vs. standing
|
// use speed and angular velocity to determine walking vs. standing
|
||||||
if (_speed + fabs(_bodyYawDelta) > WALKING_SPEED_THRESHOLD) {
|
float speed = glm::length(_velocity);
|
||||||
|
if (speed + fabs(_bodyYawDelta) > WALKING_SPEED_THRESHOLD) {
|
||||||
_mode = AVATAR_MODE_WALKING;
|
_mode = AVATAR_MODE_WALKING;
|
||||||
} else {
|
} else {
|
||||||
_mode = AVATAR_MODE_INTERACTING;
|
_mode = AVATAR_MODE_INTERACTING;
|
||||||
|
@ -238,7 +236,7 @@ void MyAvatar::simulate(float deltaTime) {
|
||||||
|
|
||||||
// update moving flag based on speed
|
// update moving flag based on speed
|
||||||
const float MOVING_SPEED_THRESHOLD = 0.01f;
|
const float MOVING_SPEED_THRESHOLD = 0.01f;
|
||||||
_moving = _speed > MOVING_SPEED_THRESHOLD;
|
_moving = speed > MOVING_SPEED_THRESHOLD;
|
||||||
|
|
||||||
// If a move target is set, update position explicitly
|
// If a move target is set, update position explicitly
|
||||||
const float MOVE_FINISHED_TOLERANCE = 0.1f;
|
const float MOVE_FINISHED_TOLERANCE = 0.1f;
|
||||||
|
@ -681,7 +679,6 @@ void MyAvatar::updateThrust(float deltaTime) {
|
||||||
if (_driveKeys[FWD] || _driveKeys[BACK] || _driveKeys[RIGHT] || _driveKeys[LEFT] || _driveKeys[UP] || _driveKeys[DOWN]) {
|
if (_driveKeys[FWD] || _driveKeys[BACK] || _driveKeys[RIGHT] || _driveKeys[LEFT] || _driveKeys[UP] || _driveKeys[DOWN]) {
|
||||||
const float THRUST_INCREASE_RATE = 1.05f;
|
const float THRUST_INCREASE_RATE = 1.05f;
|
||||||
const float MAX_THRUST_MULTIPLIER = 75.0f;
|
const float MAX_THRUST_MULTIPLIER = 75.0f;
|
||||||
//printf("m = %.3f\n", _thrustMultiplier);
|
|
||||||
_thrustMultiplier *= 1.f + deltaTime * THRUST_INCREASE_RATE;
|
_thrustMultiplier *= 1.f + deltaTime * THRUST_INCREASE_RATE;
|
||||||
if (_thrustMultiplier > MAX_THRUST_MULTIPLIER) {
|
if (_thrustMultiplier > MAX_THRUST_MULTIPLIER) {
|
||||||
_thrustMultiplier = MAX_THRUST_MULTIPLIER;
|
_thrustMultiplier = MAX_THRUST_MULTIPLIER;
|
||||||
|
@ -703,11 +700,12 @@ void MyAvatar::updateThrust(float deltaTime) {
|
||||||
if ((glm::length(_thrust) == 0.0f) && _isThrustOn && (glm::length(_velocity) > MIN_SPEED_BRAKE_VELOCITY)) {
|
if ((glm::length(_thrust) == 0.0f) && _isThrustOn && (glm::length(_velocity) > MIN_SPEED_BRAKE_VELOCITY)) {
|
||||||
_speedBrakes = true;
|
_speedBrakes = true;
|
||||||
}
|
}
|
||||||
|
_isThrustOn = (glm::length(_thrust) > EPSILON);
|
||||||
|
|
||||||
if (_speedBrakes && (glm::length(_velocity) < MIN_SPEED_BRAKE_VELOCITY)) {
|
if (_isThrustOn || (_speedBrakes && (glm::length(_velocity) < MIN_SPEED_BRAKE_VELOCITY))) {
|
||||||
_speedBrakes = false;
|
_speedBrakes = false;
|
||||||
}
|
}
|
||||||
_isThrustOn = (glm::length(_thrust) > EPSILON);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyAvatar::updateHandMovementAndTouching(float deltaTime) {
|
void MyAvatar::updateHandMovementAndTouching(float deltaTime) {
|
||||||
|
|
|
@ -50,7 +50,6 @@ public:
|
||||||
void setShouldRenderLocally(bool shouldRender) { _shouldRender = shouldRender; }
|
void setShouldRenderLocally(bool shouldRender) { _shouldRender = shouldRender; }
|
||||||
|
|
||||||
// getters
|
// getters
|
||||||
float getSpeed() const { return _speed; }
|
|
||||||
AvatarMode getMode() const { return _mode; }
|
AvatarMode getMode() const { return _mode; }
|
||||||
float getLeanScale() const { return _leanScale; }
|
float getLeanScale() const { return _leanScale; }
|
||||||
float getElapsedTimeStopped() const { return _elapsedTimeStopped; }
|
float getElapsedTimeStopped() const { return _elapsedTimeStopped; }
|
||||||
|
|
Loading…
Reference in a new issue