mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-07-24 01:24:00 +02:00
Turn with head roll in HMD when walking or flying
This commit is contained in:
parent
05f19d54f4
commit
be2bcb1c13
2 changed files with 27 additions and 0 deletions
|
@ -1961,6 +1961,32 @@ void MyAvatar::updateOrientation(float deltaTime) {
|
||||||
totalBodyYaw += (speedFactor * deltaAngle * (180.0f / PI));
|
totalBodyYaw += (speedFactor * deltaAngle * (180.0f / PI));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Use head/HMD roll to turn while walking or flying.
|
||||||
|
if (qApp->isHMDMode() && _hmdRollControlEnabled) {
|
||||||
|
// Turn with head roll.
|
||||||
|
const float MIN_CONTROL_SPEED = 0.01f;
|
||||||
|
float speed = glm::length(getVelocity());
|
||||||
|
if (speed >= MIN_CONTROL_SPEED) {
|
||||||
|
// Feather turn when stopping moving.
|
||||||
|
float speedFactor;
|
||||||
|
if (getDriveKey(TRANSLATE_Z) != 0.0f || _lastDrivenSpeed == 0.0f) {
|
||||||
|
_lastDrivenSpeed = speed;
|
||||||
|
speedFactor = 1.0;
|
||||||
|
} else {
|
||||||
|
speedFactor = glm::min(speed / _lastDrivenSpeed, 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
float direction = glm::dot(getVelocity(), getRotation() * Vectors::UNIT_NEG_Z) > 0.0f ? 1.0f : -1.0f;
|
||||||
|
|
||||||
|
float rollAngle = glm::degrees(asin(glm::dot(IDENTITY_UP, _hmdSensorOrientation * IDENTITY_RIGHT)));
|
||||||
|
float rollSign = rollAngle < 0.0f ? -1.0f : 1.0f;
|
||||||
|
rollAngle = fabsf(rollAngle);
|
||||||
|
|
||||||
|
float yawChange = rollAngle > _hmdRollControlDeadZone ? rollSign * (rollAngle - _hmdRollControlDeadZone) : 0.0f;
|
||||||
|
totalBodyYaw += speedFactor * direction * yawChange * deltaTime * _hmdRollControlSpeed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// update body orientation by movement inputs
|
// update body orientation by movement inputs
|
||||||
glm::quat initialOrientation = getOrientationOutbound();
|
glm::quat initialOrientation = getOrientationOutbound();
|
||||||
setOrientation(getOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f))));
|
setOrientation(getOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f))));
|
||||||
|
|
|
@ -703,6 +703,7 @@ private:
|
||||||
bool _hmdRollControlEnabled { true };
|
bool _hmdRollControlEnabled { true };
|
||||||
float _hmdRollControlDeadZone { ROLL_CONTROL_DEAD_ZONE_DEFAULT };
|
float _hmdRollControlDeadZone { ROLL_CONTROL_DEAD_ZONE_DEFAULT };
|
||||||
float _hmdRollControlSpeed { ROLL_CONTROL_SPEED_DEFAULT };
|
float _hmdRollControlSpeed { ROLL_CONTROL_SPEED_DEFAULT };
|
||||||
|
float _lastDrivenSpeed { 0.0f };
|
||||||
|
|
||||||
// working copies -- see AvatarData for thread-safe _sensorToWorldMatrixCache, used for outward facing access
|
// working copies -- see AvatarData for thread-safe _sensorToWorldMatrixCache, used for outward facing access
|
||||||
glm::mat4 _sensorToWorldMatrix { glm::mat4() };
|
glm::mat4 _sensorToWorldMatrix { glm::mat4() };
|
||||||
|
|
Loading…
Reference in a new issue