30 January 2012

Creating a Forklift

After having created this forklift for a project, it started gathering dust.  After having seen BlenderArt's call-for-content on blendernation one morning, I noticed the theme was 'Industrial Revolution'.  This was right in line with what I had recently been doing on Tube, and in a previous project for Bassam.  I dug through some files which had been gathering dust and decided to submit an entry for it.  For me the most interesting part of it is the rigging, as I quite enjoy powerful yet simple equations that make things mimick real life.

View the BlenderArt Issue online here or download it from here


The first step was to get reference images from a google image search.  If you do a google image search for ‘forklift’, the second image result is rather funny.  However, I ended up going with this one: http://www.cmec-hb.com/admin/upload/forklift.jpg because it was profiled nicely.

I then set it up as a background image in Blender.  Enable the ‘Background Images’ tab by clicking on the tick box.  Open up the tab and click on ‘Open’, browse to your image and select it.  If you move into a profile view (front, side, top etc) you’ll see the background image.

Modelling - levels of detail

The modelling was broken up into three levels:  Primary detail, Secondary detail and Tertiary detail.  It might be advisable to keep your modelling organised by placing them on different layers. e.g. layer1, 2 and 3.

NOTE: The objects in the illustrations below are separated for visual purposes only.  Don’t model them this way, model them according to the reference image.

primary_level secondary_level tertiary_level

Primary detail consisted of main forms, such as the body, wheels, cage, fork lift, tank, seat, wheel.  These are essentially identified from the forklift’s structure, and are responsible for it’s silhouette.  Because it’s an engineered device, it’s symmetric, so I only modelled the left half and used a mirror modifier on the objects to mirror them.  For the wheels you only need to model one quarter of its profile, and then use the mirror modifier twice to complete it.

Large forms were broken up into smaller parts, such as the panels of the body, the blocks of the fork mechanism etc.  This keeps it more believable and helps with placing secondary and tertiary detail.

Secondary detail consisted mainly of smaller functional items, such as levers, pedals, lights, electrical boxes, engine pieces etc.  This helps to make it appear functional.  For these you don’t have to stick as rigorously to the reference image, and can start looking at other images for inspiration.  You also don’t have to continually reference it in side view to see if it matches.

Tertiary detail consisted mainly of smaller parts to help pull it all together and keep the eye busy, namely, cables, an air vent, wheel nuts, shocks and wiring.

Putting them all together, and throwing in some texuring, we have our forklift


This for *ME* is generally a painful process, but it’s very rewarding once you see the texturing results.Unwrapping objects is mostly a case of placing your seams and unwrapping by selecting all the vertices, pressing ‘U’ and choosing the most appropriate unwrapping algorithm.  

The main aim of texturing was to show that the forklift had been used.  This resulted in the strategic placement of dirt and some wear, using some dirt gimp brushes,

textures_bodySide textures_front

I wanted to create the illusion that the forklift had been through puddles of muddied water, which had been kicked up to dirty the body’s side.  This would also have muddied the forks and the wheel tread.  Some dust was given to the tank at the back to indicate that it’s a fixture and had been sitting there for a while, and some dirt was applied to the air vent on the back to indicate that the engine’s air wasn’t always clean.

Additional texturing could have been added, but time had to be used decisively according to the deadline.  The image below shows that the texture was used as an alpha map on a brown colour, which then comes across over the material colour as if it was dirt.

Some images were sourced from the internet for the metal textures, and procedural cloud textures were used to break up the spec values wherever they occured.  The colour images above were also used to subtly affect bump and spec values.


The rigging required that the wheels would be driven, and could turn left and right.  A bone was used to manipulate the wheel left and right, and another one to drive it.  The driving bone was parented to the left and right bone so that the wheel would still drive properly if turned.

The equation to turn a wheel is actually somewhat simple.  The main controller is used to move the forklift around, so the location value of the main controller will give us the distance travelled, which will then drive the wheels rotation.  If main controller is moved a distance equal to the circumference of the wheel, the wheel would have rotated a full revolution (in radians: 2*pi).  We know that the circumference of a circle is 2*pi*r (where r is the radius of the circle).  If the circumference is 2*pi*r and the rotation is 2*pi, then rotation*r is the circumference, which happens to be the distance. So we have: rotation*r = distance.  Therefore rotation = distance / r.


As a result we can use a driver, which takes the location value from the main controller and just divide it by the radius of the wheel.  OR, we can create a straight line curve whose slope is the same as the ratio of distance / r and let this drive the wheel.  Below I show the former method.

With the rolling wheel bone selected, In the transform properties of the 3D View, right click on ‘Rotation X’ and click ‘Add Single Driver’.  The property will turn pink indicating that a driver has been set on it.

To navigate to the drivers, press F6 in a window to bring up the f-curve editor.  Then click on the ‘Mode’ drop down box, which will say ‘F-Curve Editor’ and select ‘Drivers’.


This will bring you to the Drivers window.  From here, on the right side of the window near the bottom is a ‘Modifiers’ tab, remove the default ‘Generator’ modifier (NOTE: This is where you can set the slope to be the same ratio as distance / radius, as mentioned above.  This is easier than setting the drivers as below, but if you’re curious you can follow on).

Click on ‘Add Variable’ in the Drivers tab. Rename the variable to distance.  Change the type from ‘Single Property’ to ‘Transform Channel’ (NOTE: This step is completed -but ignored- in the illustration below).  Select the armature object from the ‘Ob/Bone’ property (In this case forklift_rig).  Select the bone responsible for driving the wheel (In this case global_controller).  Change the default ‘X location’ property to ‘Z Location’ (In our case +Z Location is forward, this depends on your bones’ alignment).  Type the expression ‘distance / 0.3668’ in the ‘Expr:’ channel (In our case the radius is 0.3668)


Now when you move the main controller along the Location Z axis, the wheel will turn appropriately.  As a further step I created a bone for each wheel, to turn them in the same way as the wheel above.  These other three will have ‘Copy Rotation’ constraints on them, copying the rotation from the bone with the driver on it.  This way all the wheels will roll together.

copy_rotation wheel_dimensions

blog comments powered by Disqus