diff --git a/interface/src/avatar/AvatarActionHold.cpp b/interface/src/avatar/AvatarActionHold.cpp index 70216eca11..6078d326e0 100644 --- a/interface/src/avatar/AvatarActionHold.cpp +++ b/interface/src/avatar/AvatarActionHold.cpp @@ -107,8 +107,12 @@ void AvatarActionHold::doKinematicUpdate(float deltaTimeStep) { withWriteLock([&]{ if (_kinematicSetVelocity) { if (_previousSet) { - glm::vec3 positionalVelocity = (_positionalTarget - _previousPositionalTarget) / deltaTimeStep; + // smooth velocity over 2 frames + glm::vec3 positionalDelta = _positionalTarget - _previousPositionalTarget; + glm::vec3 positionalVelocity = (positionalDelta + previousPositionalDelta) / (deltaTimeStep + previousDeltaTimeStep); rigidBody->setLinearVelocity(glmToBullet(positionalVelocity)); + previousPositionalDelta = positionalDelta; + previousDeltaTimeStep = deltaTimeStep; } } diff --git a/interface/src/avatar/AvatarActionHold.h b/interface/src/avatar/AvatarActionHold.h index 6badf97e9e..4856a17b89 100644 --- a/interface/src/avatar/AvatarActionHold.h +++ b/interface/src/avatar/AvatarActionHold.h @@ -46,6 +46,9 @@ private: bool _previousSet { false }; glm::vec3 _previousPositionalTarget; glm::quat _previousRotationalTarget; + + float previousDeltaTimeStep = 0.0f; + glm::vec3 previousPositionalDelta; }; #endif // hifi_AvatarActionHold_h