- Home /
Make SmoothDamp Reach Target?
As for as I understand, the SmoothDamp function will never actually reach its target, just forvever approach it. Is there a way to force it to arrive at its target? Im using it to de-accelerate my player and the player seemingly eventually stops, but is always moving VERY slightly. This complicates some of my other coding.
Thanks!
I've not seen the problem you specify with SmoothDamp. Is there a Rigidbody on the character that might have some velocity, or is there any other code attempting to move the object? If you are just interested in arriving exactly at the destination, you can insert some check like:
if ((transform.position - dest).magnitude < .01)
transform.position = dest;
The velocity of the rigidbody is what the SmoothDamp is dictating.
So does using a threshold and setting the velocity to the destination velocity solve the problem? Are there other forces like gravity on the object that the SmoothDamp is fighting?
Answer by marklin · Dec 31, 2016 at 07:04 AM
I found a solution that might work for other people, which consists on reducing, on each iteration, the value of the smoothTime parameter. This will result in the smooth damp going faster by the end, instead of going slower and slower, thus it will reach its target faster.
Note that if you're changing the value for smoothTime (which is 1.1f in the example) you might have to change smoothTimeChange.
IEnumerator SmoothDampExample()
{
// Say this is your target position
var targetPosition = new Vector3(someX, someY, someZ);
// This is your initial smooth time
float smoothTime = 1.1f;
// This is the amount you will be reducing smoothTime on each iteartion
float smoothTimeChange = 0.0075f;
// Store the result of smooth damp here
Vector3 newPosition;
// current smooth velocity
float currentSmoothVelocity;
// Let's say we want to move this component's transform position.
// We will do this until smooth damp is done.
while (true) {
// Get the new position
newPosition = Vector3.SmoothDamp(transform.position, targetPosition, ref currentSmoothVelocity, smoothTime);
// If new position equals to current position, it means
// it didn't change. SmoothDamp never actually reaches its target,
// so when it doesn't move it's when we know it is done.
if (newPosition == transform.position) {
break;
}
// Set new position
transform.position = newPosition;
// Reduce smoothTime so SmoothDamp will go faster
smoothTime = smoothTime - smoothTimeChange;
// Wait for next frame
yield return null;
}
// Smooth damp is done!
}
Your answer