I need to make a wheel fall on 1 of five angles and I want it to teeter when it gets to the angle. After the user spins the wheel, I have it slow down by multiplying the rotation velocity by .98 per tick. I sort of have it working by finding the closest of the angles and adding a small value in its direction to the velocity. However this looks unrealistic and can be glitchy.
I was thinking of implementing a damped sine wave but i’m not sure how I would do this.
Current Pseudocode:
var rotation, rotationVelocity, stoppingPoints[5];
update(deltaT) {
velocity -= rotationVelocity * 0.5 * dt;
closestAngle = findClosestAngle().angle;
rotationVelocity += (closestAngle - rotation) / 36 * dt;
rotation += rotationVelocity;
}
Edit:
Teeter: move or balance unsteadily; sway back and forth:
subtract a constant amount from it’s velocity every iteration until it reaches zero
not only does this actually represent how friction works in real life, but it’s easier too.
If you want it to move as though it were connected to a spring:
Hooke’s law for springs is
F = -kxwherekis a constant and x is the distance from the origin if you want it to sway back and forth as though it were on a spring. keep track of it’s rotation from an origin, and add-kxwherexis it’s rotational distance(or angle) from the origin.Now, if you apply both friction and hooke’s law to the spring, it should look realistic.