linear acceleration experiment

This commit is contained in:
DouglasWilcox 2019-11-14 09:23:16 -08:00
parent b8e85aedc7
commit 11e1c4e6fe

View file

@ -3514,42 +3514,56 @@ void MyAvatar::updateOrientation(float deltaTime) {
setWorldOrientation(glm::slerp(getWorldOrientation(), faceRotation, blend)); setWorldOrientation(glm::slerp(getWorldOrientation(), faceRotation, blend));
} else if (isRotatingWhileSeated) { } else if (isRotatingWhileSeated) {
float direction = -getDriveKey(TRANSLATE_X); float direction = -getDriveKey(TRANSLATE_X);
float seatedTargetSpeed = direction * _yawSpeed * deltaTime; //float seatedTargetSpeed = direction * _yawSpeed; //deg/sec
float seatedTargetSpeed = direction * _yawSpeed * deltaTime; //deg/renderframe
const float SEATED_ROTATION_RAMP_TIMESCALE = 0.25; //used as divisor //if (_seatedBodyYawDelta / seatedTargetSpeed < 0.0f) {
float blend = deltaTime / SEATED_ROTATION_RAMP_TIMESCALE; // //reverse direction, start acceleration timer again
// _seatedInterpTime = 0.0f;
//}
const float SEATED_ROTATION_RAMP_TIMESCALE = 2.5;
float blend = deltaTime * SEATED_ROTATION_RAMP_TIMESCALE;
if (blend > 1.0f) { if (blend > 1.0f) {
blend = 1.0f; blend = 1.0f;
} }
/////// ease in //init, accelerate or clamp rotation at target speed
//_seatedBodyYawDelta = (1.0f - blend) * _seatedBodyYawDelta + blend * seatedTargetSpeed;
/////// ease out
if (fabsf(_seatedBodyYawDelta) > 0.0f) { if (fabsf(_seatedBodyYawDelta) > 0.0f) {
//we are rotating
if (fabsf(_seatedBodyYawDelta) >= fabsf(seatedTargetSpeed)) { if (fabsf(_seatedBodyYawDelta) >= fabsf(seatedTargetSpeed)) {
//we've reached target speed
_seatedBodyYawDelta = seatedTargetSpeed; _seatedBodyYawDelta = seatedTargetSpeed;
} else { } else {
_seatedInterpTime += blend; //_seatedInterpTime += blend;
_seatedBodyYawDelta = _seatedInterpTime * _seatedInterpTime * direction; //_seatedBodyYawDelta = _seatedInterpTime * _seatedInterpTime * direction / blend;
_seatedBodyYawDelta += blend * direction;
} }
} else { } else {
//init rotation
_seatedInterpTime = blend; _seatedInterpTime = blend;
_seatedBodyYawDelta = blend * direction; _seatedBodyYawDelta = blend * direction;
} }
float totalSeatedBodyYaw = _seatedBodyYawDelta * deltaTime;
//setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, totalSeatedBodyYaw, 0.0f))));
setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, _seatedBodyYawDelta, 0.0f)))); setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, _seatedBodyYawDelta, 0.0f))));
} else if (_seatedBodyYawDelta != 0.0f) {
//qDebug() << "start _seatedBodyYawDelta: " << _seatedBodyYawDelta;
// decelerate
const float ROTATION_DECAY_TIMESCALE = 0.25f;
float attenuation = 1.0f - deltaTime / ROTATION_DECAY_TIMESCALE;
if (attenuation < 0.0f) {
attenuation = 0.0f;
}
_seatedBodyYawDelta *= attenuation;
//original float MINIMUM_ROTATION_RATE = 2.0f;
//float rotatingWhileSeatedYaw = -getDriveKey(TRANSLATE_X) * _yawSpeed * deltaTime; if (fabsf(_seatedBodyYawDelta) < MINIMUM_ROTATION_RATE * deltaTime) {
//setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, rotatingWhileSeatedYaw, 0.0f)))); _seatedBodyYawDelta = 0.0f;
}
//float totalSeatedBodyYaw = _seatedBodyYawDelta * deltaTime;
//setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, totalSeatedBodyYaw, 0.0f))));
setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, _seatedBodyYawDelta, 0.0f))));
} else { } else {
_seatedBodyYawDelta = 0.0f; _seatedBodyYawDelta = 0.0f;
_seatedInterpTime = 0.0f; _seatedInterpTime = 0.0f;
@ -3611,20 +3625,20 @@ void MyAvatar::updateOrientation(float deltaTime) {
const float DEFAULT_REORIENT_ANGLE = 65.0f; const float DEFAULT_REORIENT_ANGLE = 65.0f;
const float FIRST_PERSON_REORIENT_ANGLE = 95.0f; const float FIRST_PERSON_REORIENT_ANGLE = 95.0f;
const float TRIGGER_REORIENT_ANGLE = 45.0f; const float TRIGGER_REORIENT_ANGLE = 135.0f;
const float FIRST_PERSON_TRIGGER_REORIENT_ANGLE = 65.0f; const float FIRST_PERSON_TRIGGER_REORIENT_ANGLE = 65.0f;
glm::vec3 ajustedYawVector = cameraYawVector; glm::vec3 ajustedYawVector = cameraYawVector;
float limitAngle = 0.0f; float triggerAngle = glm::sin(glm::radians(90.0f - TRIGGER_REORIENT_ANGLE));
float triggerAngle = -glm::sin(glm::radians(TRIGGER_REORIENT_ANGLE)); float limitAngle = triggerAngle;
if (mode == CAMERA_MODE_FIRST_PERSON_LOOK_AT) { if (mode == CAMERA_MODE_FIRST_PERSON_LOOK_AT) {
limitAngle = glm::sin(glm::radians(90.0f - FIRST_PERSON_TRIGGER_REORIENT_ANGLE)); limitAngle = glm::sin(glm::radians(90.0f - FIRST_PERSON_TRIGGER_REORIENT_ANGLE));
triggerAngle = limitAngle; triggerAngle = limitAngle;
} }
float reorientAngle = mode == CAMERA_MODE_FIRST_PERSON_LOOK_AT ? FIRST_PERSON_REORIENT_ANGLE : DEFAULT_REORIENT_ANGLE; float reorientAngle = mode == CAMERA_MODE_FIRST_PERSON_LOOK_AT ? FIRST_PERSON_REORIENT_ANGLE : DEFAULT_REORIENT_ANGLE;
if (frontBackDot < 0.0f) {
ajustedYawVector = (leftRightDot < 0.0f ? -avatarVectorRight : avatarVectorRight);
}
if (frontBackDot < limitAngle) { if (frontBackDot < limitAngle) {
if (frontBackDot < 0.0f) {
ajustedYawVector = (leftRightDot < 0.0f ? -avatarVectorRight : avatarVectorRight);
}
if (!isRotatingWhileSeated) { if (!isRotatingWhileSeated) {
if (frontBackDot < triggerAngle) { if (frontBackDot < triggerAngle) {
_shouldTurnToFaceCamera = true; _shouldTurnToFaceCamera = true;
@ -3632,6 +3646,7 @@ void MyAvatar::updateOrientation(float deltaTime) {
} }
} else { } else {
setWorldOrientation(previousOrientation); setWorldOrientation(previousOrientation);
_seatedBodyYawDelta = 0.0f;
} }
} else if (frontBackDot > glm::sin(glm::radians(reorientAngle))) { } else if (frontBackDot > glm::sin(glm::radians(reorientAngle))) {
_shouldTurnToFaceCamera = false; _shouldTurnToFaceCamera = false;