From 0e9dc1eff8a67c0cfd85a8f7ccb68e38232fe40d Mon Sep 17 00:00:00 2001 From: GPayne Date: Fri, 4 May 2018 10:38:16 -0600 Subject: [PATCH] Fixed numerical error in touch interaction --- modules/touch/src/touchinteraction.cpp | 30 ++++++++++++-------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/modules/touch/src/touchinteraction.cpp b/modules/touch/src/touchinteraction.cpp index 30aec25cbd..9e9eba32ab 100644 --- a/modules/touch/src/touchinteraction.cpp +++ b/modules/touch/src/touchinteraction.cpp @@ -294,7 +294,7 @@ TouchInteraction::TouchInteraction() , _sensitivity{ glm::dvec2(0.08, 0.045), 4.0, 2.75, glm::dvec2(0.08, 0.045) } #ifdef SPEED_BRAKE , _speedLimitFarVelocityDivider(SpeedLimitFarVelocityDividerInfo, 5.f, 1.f, 100.f) - , _speedLimitNearVelocityDivider(SpeedLimitNearVelocityDividerInfo, 500.f, 5000.f, 5.f) + , _speedLimitNearVelocityDivider(SpeedLimitNearVelocityDividerInfo, 20.f, 1.f, 500.f) , _speedLimitDistanceThreshold(SpeedLimitFarDistanceThresholdInfo, 1e12f, 1e9f, 1e15f) #else , _speedLimitDistanceFraction(SpeedLimitDistanceFractionInfo, 7.f, 0.1f, 20.0f) @@ -987,6 +987,7 @@ void TouchInteraction::computeVelocities(const std::vector& list, const int action = interpretInteraction(list, lastProcessed); #ifdef CONST_TIME_DECAY double stepsToDecay = _constTimeDecay_secs / _frameTimeAvg.getAvgFrameTime(); + const double postDecayVelocityTarget = 1e-6; #endif #ifdef TOUCH_DEBUG_PROPERTIES @@ -1016,11 +1017,10 @@ void TouchInteraction::computeVelocities(const std::vector& list, /*double orbitVelocityAvg = (cursor.getXSpeed() * _sensitivity.orbit.x + cursor.getYSpeed() * _sensitivity.orbit.y) / 2.0;*/ double orbitVelocityAvg = glm::distance(_vel.orbit.x, _vel.orbit.y); - if( stepsToDecay > 0.0 ) - _constTimeDecayCoeff.orbit = std::pow((1e-6 / std::abs(orbitVelocityAvg)), (1.0 / stepsToDecay)); + if( stepsToDecay > 0.0 && orbitVelocityAvg > 0.0 ) + _constTimeDecayCoeff.orbit = std::pow((postDecayVelocityTarget / std::abs(orbitVelocityAvg)), (1.0 / stepsToDecay)); else _constTimeDecayCoeff.orbit = 1.0; -//LINFO("Orbit coeff " << _constTimeDecayCoeff.orbit << " with velocity " << orbitVelocityAvg); #endif break; } @@ -1062,8 +1062,8 @@ void TouchInteraction::computeVelocities(const std::vector& list, #endif #ifdef CONST_TIME_DECAY - if( stepsToDecay > 0.0 && std::abs(_vel.zoom) > 1e-6) - _constTimeDecayCoeff.zoom = std::pow((1e-6 / std::abs(_vel.zoom)), (1.0 / stepsToDecay)); + if( stepsToDecay > 0.0 && std::abs(_vel.zoom) > 0.0 ) + _constTimeDecayCoeff.zoom = std::pow((postDecayVelocityTarget / std::abs(_vel.zoom)), (1.0 / stepsToDecay)); else _constTimeDecayCoeff.zoom = 1.0; #endif @@ -1076,14 +1076,14 @@ void TouchInteraction::computeVelocities(const std::vector& list, #ifdef SPEED_BRAKE double nearSpeedLimit = distanceFromFocusSurface/_speedLimitNearVelocityDivider; double farSpeedLimit = distanceFromFocusSurface/_speedLimitFarVelocityDivider; - double velocityFraction = (distanceFromFocusSurface > _speedLimitDistanceThreshold) ? - 1.0 : distanceFromFocusSurface / _speedLimitDistanceThreshold; - double speedLimit = farSpeedLimit * velocityFraction + nearSpeedLimit * (1 - velocityFraction); + double velocityFraction = (distanceFromFocusSurface > (double)_speedLimitDistanceThreshold) ? + 1.0 : distanceFromFocusSurface / (double)_speedLimitDistanceThreshold; + double speedLimit = farSpeedLimit * velocityFraction + nearSpeedLimit * (1.0 - velocityFraction); #else double speedLimit = _speedLimitDistanceFraction * distanceFromFocusSurface; #endif if (std::abs(_vel.zoom) > 1e-7) - _vel.zoom = std::min(std::abs(speedLimit), std::abs(_vel.zoom)) * (_vel.zoom / std::abs(_vel.zoom)); + _vel.zoom = (std::min(std::abs(speedLimit), std::abs(_vel.zoom))) * (_vel.zoom > 0.0 ? 1.0 : -1.0); else _vel.zoom = 0.0; break; @@ -1125,8 +1125,8 @@ void TouchInteraction::computeVelocities(const std::vector& list, _vel.roll += -rollFactor * _sensitivity.roll; #ifdef CONST_TIME_DECAY - if( stepsToDecay > 0.0 ) - _constTimeDecayCoeff.roll = std::pow((1e-6 / std::abs(_vel.roll)), (1.0 / stepsToDecay)); + if( stepsToDecay > 0.0 && _vel.roll > 0.0 ) + _constTimeDecayCoeff.roll = std::pow((postDecayVelocityTarget / std::abs(_vel.roll)), (1.0 / stepsToDecay)); else _constTimeDecayCoeff.roll = 1.0; #endif @@ -1140,8 +1140,8 @@ void TouchInteraction::computeVelocities(const std::vector& list, /*double panVelocityAvg = (cursor.getXSpeed() * _sensitivity.pan.x + cursor.getYSpeed() * _sensitivity.pan.y) / 2.0;*/ double panVelocityAvg = glm::distance(_vel.pan.x, _vel.pan.y); - if( stepsToDecay > 0.0 ) - _constTimeDecayCoeff.pan = std::pow((1e-6 / std::abs(panVelocityAvg)), (1.0 / stepsToDecay)); + if( stepsToDecay > 0.0 && panVelocityAvg > 0.0 ) + _constTimeDecayCoeff.pan = std::pow((postDecayVelocityTarget / std::abs(panVelocityAvg)), (1.0 / stepsToDecay)); else _constTimeDecayCoeff.pan = 1.0; #endif @@ -1385,8 +1385,6 @@ void TouchInteraction::decelerate(double dt) { _vel.zoom = 0.0; } } -//if(std::abs(_vel.zoom) > 10000) LINFO("Decelerate:velocity= " << _vel.zoom << " from " << times << " times using coeff " << _constTimeDecayCoeff.zoom); - #else double frequency = 1.0 / _deceleratesPerSecond; // Number of times velocities should decelerate, depending on chosen frequency and