Adjust avatar walking and flying speed based on sensor scale factor

This commit is contained in:
Anthony J. Thibault 2017-08-25 10:10:23 -07:00
parent 246097b65e
commit dd9ee28b18

View file

@ -1979,17 +1979,17 @@ void MyAvatar::updateActionMotor(float deltaTime) {
if (state == CharacterController::State::Hover) { if (state == CharacterController::State::Hover) {
// we're flying --> complex acceleration curve that builds on top of current motor speed and caps at some max speed // we're flying --> complex acceleration curve that builds on top of current motor speed and caps at some max speed
float motorSpeed = glm::length(_actionMotorVelocity); float motorSpeed = glm::length(_actionMotorVelocity);
float finalMaxMotorSpeed = getUniformScale() * MAX_ACTION_MOTOR_SPEED; float finalMaxMotorSpeed = getSensorToWorldScale() * MAX_ACTION_MOTOR_SPEED;
float speedGrowthTimescale = 2.0f; float speedGrowthTimescale = 2.0f;
float speedIncreaseFactor = 1.8f; float speedIncreaseFactor = 1.8f;
motorSpeed *= 1.0f + glm::clamp(deltaTime / speedGrowthTimescale, 0.0f, 1.0f) * speedIncreaseFactor; motorSpeed *= 1.0f + glm::clamp(deltaTime / speedGrowthTimescale, 0.0f, 1.0f) * speedIncreaseFactor;
const float maxBoostSpeed = getUniformScale() * MAX_BOOST_SPEED; const float maxBoostSpeed = getSensorToWorldScale() * MAX_BOOST_SPEED;
if (_isPushing) { if (_isPushing) {
if (motorSpeed < maxBoostSpeed) { if (motorSpeed < maxBoostSpeed) {
// an active action motor should never be slower than this // an active action motor should never be slower than this
float boostCoefficient = (maxBoostSpeed - motorSpeed) / maxBoostSpeed; float boostCoefficient = (maxBoostSpeed - motorSpeed) / maxBoostSpeed;
motorSpeed += MIN_AVATAR_SPEED * boostCoefficient; motorSpeed += getSensorToWorldScale() * MIN_AVATAR_SPEED * boostCoefficient;
} else if (motorSpeed > finalMaxMotorSpeed) { } else if (motorSpeed > finalMaxMotorSpeed) {
motorSpeed = finalMaxMotorSpeed; motorSpeed = finalMaxMotorSpeed;
} }
@ -1997,7 +1997,7 @@ void MyAvatar::updateActionMotor(float deltaTime) {
_actionMotorVelocity = motorSpeed * direction; _actionMotorVelocity = motorSpeed * direction;
} else { } else {
// we're interacting with a floor --> simple horizontal speed and exponential decay // we're interacting with a floor --> simple horizontal speed and exponential decay
_actionMotorVelocity = MAX_WALKING_SPEED * direction; _actionMotorVelocity = getSensorToWorldScale() * MAX_WALKING_SPEED * direction;
} }
float boomChange = getDriveKey(ZOOM); float boomChange = getDriveKey(ZOOM);
@ -2011,22 +2011,24 @@ void MyAvatar::updatePosition(float deltaTime) {
} }
vec3 velocity = getVelocity(); vec3 velocity = getVelocity();
float sensorToWorldScale = getSensorToWorldScale();
float sensorToWorldScale2 = sensorToWorldScale * sensorToWorldScale;
const float MOVING_SPEED_THRESHOLD_SQUARED = 0.0001f; // 0.01 m/s const float MOVING_SPEED_THRESHOLD_SQUARED = 0.0001f; // 0.01 m/s
if (!_characterController.isEnabledAndReady()) { if (!_characterController.isEnabledAndReady()) {
// _characterController is not in physics simulation but it can still compute its target velocity // _characterController is not in physics simulation but it can still compute its target velocity
updateMotors(); updateMotors();
_characterController.computeNewVelocity(deltaTime, velocity); _characterController.computeNewVelocity(deltaTime, velocity);
float speed2 = glm::length2(velocity); float speed2 = glm::length(velocity);
if (speed2 > MIN_AVATAR_SPEED_SQUARED) { if (speed2 > sensorToWorldScale2 * MIN_AVATAR_SPEED_SQUARED) {
// update position ourselves // update position ourselves
applyPositionDelta(deltaTime * velocity); applyPositionDelta(deltaTime * velocity);
} }
measureMotionDerivatives(deltaTime); measureMotionDerivatives(deltaTime);
_moving = speed2 > MOVING_SPEED_THRESHOLD_SQUARED; _moving = speed2 > sensorToWorldScale2 * MOVING_SPEED_THRESHOLD_SQUARED;
} else { } else {
float speed2 = glm::length2(velocity); float speed2 = glm::length2(velocity);
_moving = speed2 > MOVING_SPEED_THRESHOLD_SQUARED; _moving = speed2 > sensorToWorldScale2 * MOVING_SPEED_THRESHOLD_SQUARED;
if (_moving) { if (_moving) {
// scan for walkability // scan for walkability