Just wondering if there is any add on, feature, tool or third party software to set an object too rotate at a certain speed during animations such as making a wheel rotate at 1000 rpm or something like a drill drilling at 150 rpm. Any answer is appreciated. Thanks.
For this you need to do a little math. We need to find out how much the wheel spins withing 1 second.
Let's say you render at 30fps and one rotation equals 360°. First we have convert rotations per minute into rotations per second. Then we have to convert rotations per second into degrees per second.
1000rpm / 60s = 16.667rps
We multiply 360° by 16.667rps to get how many degrees it spins in a second.
16.667rps * 360° = 6000°ps
The wheel spins ~6000° per second. To find out how many degrees it spins in a frame, divide the spins per second (6000°) by the number of frames per second (30fps).
6000° / 30 = 500°
The wheel needs to spin 500° per frame to complete 1000rpm.
To do that, go to frame 1 and set a keyframe at 0° rotation. Then set a keyframe at 500° rotation on frame 2. To make it continue speaking, location the rotation fcurve in the graph editor, select it and press ⇧ ShiftE > Linear Extrapolation. (See this related answer.)
You can also use this online calculator.
For constant rpm use a driver
Similarly to answer by @DrachenSeele some simple maths.
The frame rate of your blender scene. Test in python console, where
C = bpy.context
>>> fps = C.scene.render.fps / C.scene.render.fps_base
Convert revs per minute to revs per frame
>>> rpm = 150 >>> rps = 150 / 60 >>> rpf = rps / fps
Make this an angular velocity. Note that blender uses radians as its native unit of angle. (displayed as degrees if that is the unit set in scene units) One revolution is 2pi radians.
>>> angular_velocity = 2 * pi * rpf >>> angular_velocity 0.6551529985521121
Ok now add a simple driver
0.6552 * frame (rounded for example sake) to a rotation value, an axis of euler rotation or an angle of angle-axis rotation.
The expression above can be typed directly into the field with a hash prefix to designate it as a driver
#0.6552 * frame The variable
frame is known to the driver namespace and is the value of
Driver added to default cube to spin around X axis at 150 rpm. Notice the sampling rate of animated gif makes this look sluggish due to the wagon wheel effect
To avoid the wagon wheel effect try setting the rpm to a prime number near the target rpm (eg 151 instead of 150) or add a slight randomness to the driver.
0.655153 * frame + noise.random()
mathutils.noise module is known to driver namespaces as
Also note that this is easily extended using the driver system. Another driver variable could be a custom property ranging from 0 to 1, eg stopped to full speed which can also be animated.
An example using an
rpm custom property.
similarly to above make a custom property named "rpm"
Make a driver
check the use self option, this way
self["rpm"] is our custom property. Can get the fps from the scene. I haven't bothered with base frame rate per example here. Also notice this spits the "slow driver expression" warning. I don't think for simple examples like this it is an issue. I have enquired here Use self and the slow python expression .
pi * frame * self["rpm"] / (30 * fps)
Now I can adjust the custom property to spin the cube around Y (where i stuck the driver) at the designated rpm.