Jump to content
  • Advertisement
Sign in to follow this  

Spinning a wheel and stopping at a given angle

This topic is 3417 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Lets say I have a 2D circle that represents a Party Wheel. The circle is divided into several pie shaped slices of 2 different sizes. The idea is that the player spins the wheel and after a couple of rotations it eventually slows down and stops on a specific slice. So, my question is, once the wheel is spinning, how do I calculate the amount of resistance needed to slow the wheel down and stop on the correct slice? Currently, I just track the speed and angle and dampen the speed by a percentage each frame. This definitely slows the wheel down, but calculating the amount of dampening needed to land on a specific slice is difficult. I'm open to other approaches too. As long as it looks like a spinning party wheel that slowly stops on a given slice, then it fits my needs! Thanks! -- Kory

Share this post

Link to post
Share on other sites
You just have to write down a formula:

angle = f(time)

and solve it to find the time leading to the desired angle

Share this post

Link to post
Share on other sites
You need a function that describes the way your angle changes over time. For example:

Angle(Time) = Initial_Angle + (Angular_Velocity(Time) * Time)

And you have to think if a function that describes how the Angular velocity changes over time:

Angular_Velocity(Time) = Initial_Angular_Velocity - (Friction * Time)

Substitute the latter into the first and you'll get:

Angle(Time) = Initial_Angle + (Initial_Angular_Velocity * Time) - (Friction * Time ^ 2)

Now we have to define Initial_Angle and Initial_Angular_Velocity:

>> Initial_Angle = 0
>> Initial_Angular_Velocity = 2*pi rad/s (one complete rotation per sec)

Now you only need to define the desired angle to stop on, and the time at which it should stop.

>> Time = 10
>> Angle = 1/4*pi (== 90 degrees)

Now we can solve it:

0 + (2*pi * 10) - (Friction * (2*pi) ^ 2) = 1/4*pi + k*2*pi

Note that i've added "k" to the formula wich denotes the ammount of complete rotations until the wheel is stopped. k can be any natural number (0, 1, 2, etc)

If you want the wheel to stop after 3 rotations on the desired angle, you have to solve for:

0 + (2*pi * 10) - (Friction * (2*pi) ^ 2) = 1/4*pi + 3*2*pi

(20*pi) - (Friction * (2*pi) ^ 2) = 6.25*pi

-(Friction * (2*pi) ^ 2) = -13.75*pi

Friction * (2*pi) ^ 2 = 13.75*pi

Friction = ( 13.75*pi ) / ((2*pi) ^ 2)

Friction = 1.09419....

Hope this makes any sense. :)

Share this post

Link to post
Share on other sites
Thanks for the replies. I've come upon a solution that does what I need. You were both correct, I needed an equation I could solve for the angle, which I knew. However, the real problem was the fact that I was dampening the speed by a percentage each frame, thus giving me some funky exponential function based on the frame number.

Making the resistance linear simplified things and allowed me to solve the equation. Basically, I did this:

1. Calculate the amount of time needed to slow the wheel's speed to zero, from its current speed.
2. Calculate the angular distance traveled in that time.
3. Using that distance and the ending angle, calculate the angle where the wheel needs to start slowing down to land on the given angle.
4. Once the wheel reaches the starting angle, it begins to slow down and eventually stops near the desired angle.

It's not perfect, but it works.



Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!