Train Guidelines


This section provides general information on how to create train rolling stock.

It is assumed that the 3D modelling package used is Autodesk® 3ds Max® and the package used for authoring textures is Adobe® Photoshop.

The modelling package Autodesk® 3ds Max® was used to create Train Simulator, so this product appears in the examples provided. You can, of course, use other packages such as Blender™ or amabilis 3D Crafter. The package used here for authoring textures is Adobe® Photoshop. Again, you may use one of the many other packages available.

Regardless of the packages you use, the documents below should be used as a general guide to the processes to follow to build assets for Train Simulator.

Important Note: For your chosen package, you may need additional plug-ins to export the assets into Train Simulator. Please check the availability of a suitable plug-in before you begin creating assets.


Polycount budgets

The following polycounts are in effect for rolling stock models for Train Simulator. These are triangle counts, so if your object is an EditablePoly add a MeshSelect modifier on top of it to get an accurate polycount.

Top-LOD Polycounts
 Engine 100,000
 Passenger Carriage 40,000
 Freight Wagon 20,000*
* Flexible maximum

Freight Wagons differ significantly in complexity. The modeller’s common sense and discretion are required to produce a consistent level of detail throughout the freight rolling stock. If you require 30,000 polygons for a complex tanker wagon for example, then try to keep a simple flatbed wagon under 15,000 polys to compensate. As a main guideline, try to not to exceed 20,000 triangles. Lower counts are fine as long as the quality bar is met. Over-budget freight wagons will require more aggressive LOD’ing. Freight should be included in the polycount.

Texture budgets

Engines are the stars of the game and therefore have a larger texture budget than the other rolling stock. Several 32-bit 1024x1024 pixels textures can be used, the alpha channel representing the specular map. Additionally, several 24-bit normal maps of the same size are used on top of these. Together with an environment map (defined by the game code), they form the main textures of an engine model (minus its bogies, wheels and windows).

Typically, one 32-bit 1024x1024 pixel texture will be used for the main shape of each passenger coach or wagon. The alpha channel is used for the specular map.
Additionally, another 1024x512 or 1024x1024 texture can be used for passenger coaches only, shared among a consist (for instance to texture the roofs or chassis parts).

If the vehicle has bogies, they can have a single 512x512 texture. Share this texture amongst multiple wagons or coaches if you can. For instance a 2nd Class coach most likely has the same bogies as the 1st Class one of the same type. The second bogie is often a clone of the first bogie but rotated 180 degrees around the vertical axis.

Use a single 24-bit 128x128 for the wheels. Left and right wheels are modelled as a single part, connected by the axles (if visible).

A further 256x256 texture with alpha channel can be used for any glass bits on a coach. Try re-using this texture for all coaches in a consist, if you can.

Keep in mind that it’s not always necessary to reinvent the wheel – literally. If you’ve made a good generic wheel texture that works on multiple vehicles (i.e. totally
diverse freight cars, which happen to have similar wheels) then feel free to share it amongst different vehicles. On the second and subsequent times you re-use a
texture, simply link to it in the first vehicle’s folder. This way the game will only have to load one texture from one location.

Company logos may be mapped on their own texture and shared amongst consists, for the purpose of keeping them legible. These are then mapped on an overlaying polygon and sorted using either alpha or punch through. See: UV Mapping. Preferably make company logos part of the normal texture and only use the floating poly technique when there isn’t another way to keep any small text legible. Only use approved company logos. When unsure, leave blank.

Whenever possible, try to share textures amongst models.

Try to keep the number of textures per shape to an absolute minimum. Thus don’t map part of a bogie on the main shape’s texture as this means the bogie needs to be rendered with two textures rather than one. On a similar note, it’s recommended that any “loose” parts (for example wipers and pantographs) are mapped onto the bogie’s texture.

Before You Start

Max Units Setup

3ds Max should be set up to use metres as system units.

Use Customise > Units Setup >

Also set or leave Display Units Setup to Generic Units

Because modelling in metres is a bit of a pain in 3ds Max, you are recommended to model in centimetres or millimetres. Just be sure to convert your model to metres before exporting. The most fail-safe way to do this is to set up 3ds Max to use centimetres or millimetres. Create your model. Then at export time reset 3ds Max, set units to metres and open your file. A window should pop up: choose “Rescale the File Objects to the System Unit Scale”.


Linking is usually not required for any objects unless they're part of an animated hierarchy. Wheels also need linking to their respective bogies, when bogies are present on the vehicle.

LODs and Shadow Models need linking too.


All objects should follow strict naming conventions. Each name starts with a single digit representing the LOD level, followed by a 4-digit visible distance between underscores. After this, a logically chosen object name follows and the whole name is limited to a maximum of 31 characters.

Repeating objects such as wheels, bogies, etc, should be numbered (in two digits if more than 10) from front to back. Left and right handed objects should end with _l and _r respectively.

All names should be lower case characters throughout.



$ = LOD level with 1 for the top LOD
££££ = Four-digit visible distance (pad with zeroes if necessary, 0000 for infinite)
name = logically chosen object name
? = l for left, 4 for right if applicable

Below is a table with pre-determined object names. If your object does not conform to any of these, use a logical name instead.

 Object Name
 Engine locomotive
 Tender tender
 Passenger carriage
 Freight wagon
 Door door##_?
 Folding Step step##_?
 Wheel wh##
 Bogie bo##
 Wheel on a bogie bo##wh##
 Coal coal
 External fuel gauge fuel_level_?
 Loose Freight freight
 Bulk Freight bulk
 Pantograph panto##
 Train Number primarydigits_# 
 Headlights when travelling forwards lights_fwdhead_# 
 Headlights when travelling backwards lights_revhead_#
 Taillights when travelling forwards lights_fwdtail_#
 Taillights when travelling backwards lights_revtail_#

Thus the third LOD of the second wheel set on the first bogie, with a visible distance of 128 meters is called: 3_0128_bo01wh02
Here is an example of a valid hierarchy for a coach (top LOD shown only, for clarity).

Shadow objects will require different kinds of naming convention. Therefore see the Shadow models sections.

Basic Rules

  • Always use lowercase for all filenames (max, ddsace, psd, etc.).
  • All objects should be collapsed to an Editable Mesh or Editable Poly. Leave no modifiers in the stack.
  • Rid your scene of non-relevant objects before export, or at least hide them.
  • All objects should have uniform 100% scaling on them.
  • Place pivots of movable or rotatable objects (wheels, bogies, doors) precisely at their correct physical pivots.
  • The orientation of the train models is very important. In the top viewport the front of the vehicle should face up. Place the root node object (locomotive/coach/wagon/etc.) at 0,0,0. Make sure this object is perfectly centred between the front and rear wheels or bogies.
  • Wheels need to rotate around their X-axis.
  • Bogies need to rotate around their Z-axis. Their pivot should be at ground level (Z = 0.0)
  • Reset XForm if you have made any changes to pivots or scale.
  • The driving surface of the wheels, where they touch the rails, should be precisely at ground level (Z = 0.0). The side flanges extend beyond their quoted diameters and their size should be estimated from photographs.

Recommended Workflow

  1. Gather reference material (scale drawings, photographs, facts)
  2. Accurately set up scale drawings in your viewports
  3. Model the top LOD of the shape you’re making
  4. Unwrap the model
  5. Bake soft shadow textures
  6. Texture your model
  7. Set up materials
  8. Create shadow models
  9. Create LODs
  10. Export


Basic Modelling Rules

  • Work accurately, especially when it comes to wheels (diameter/width), bogies (position) and placement of pivots, as well as the overall dimensions of the vehicle you are modelling. Use dimensional data from scale drawings and do not place these objects by eye.
  • Create Editable Mesh or Editable Poly objects only. NURBS, patches and splines are not supported geometry types.
  • Make sure all objects have correct UV coordinates on them (channel 1; channel 2 and 3 when required for multi-pass materials).
  • Optimise your mesh for tri stripping. You can help tri-stripping a lot by mapping as large an area as possible at a time. This will also greatly benefit you when creating LODs using Editable Poly, as texture coordinates will be preserved when removing or collapsing edges. Broken edges in the UV mapping will ruin tri-stripping too. In this respect, don’t ever use Face mapping.
  • Use a minimal amount of smoothing groups, but make sure all faces have at least one smoothing group assigned to them. Typically you shouldn’t need more than 4 or 5 smoothing groups for the entire model.
  • Couplers are not to be modelled, as generic items will be used which will be instanced between the trains. However, an attachment point for the coupler will need to be modelled as part of the main shape, as per reference material. All moving coupler parts will come from a generic file. The same goes for any pipes and hoses which may connect one train to another.
  • Meshes are single-sided by default, but double-sidedness can be enabled in the material settings if required (not recommended).
  • Make sure your train has the right orientation. The nose should point up in the MAX top view (+Y axis).


The game will be able to load instances of wheels and bogies to optimise memory usage within the game. For example, a bogie on a coach can have, say, 2000
polygons. Add to this the wheels at 250 polygons each and you have 5000 polygons per coach of just wheels and bogies. Have ten coaches in a trainset and that’s
50,000 polygons that all need to be loaded into memory individually! Therefore bogies and wheels are to be instanced, so only one wheel and one bogie (thus 2250 polys total) need to be loaded into memory. The game then clones these amongst the ten carriages.

These instanced wheels and bogies will be specified in the XML files within the Depot. From an art point of view, all you need to do is export your wheels and bogies separately. Do this for one wheel or one bogie at a time. Be sure to place the object at (0,0,0) in your scene with (0,0,0) rotation. Give the IGS file a logical name.

If different wagons or coaches share the same bogie, only one IGS file is needed. It doesn’t really matter where this IGS file is located in the folder structure. If for
instance, you make a trans set with a 1st Class, 2nd Class and Restaurant coach; simply place the wheel and bogie IGS files in one of these folders. Don’t duplicate the files in all folders, as this is not necessary.

As mentioned in the Basic Modelling Rules, wheels should rotate around their local X-axis, while bogies should rotate around their local Z-axis and have their pivot at ground level. See the illustrations below. They show the way wheels and bogies should be exported.

Often bogies are not symmetrical and the rear bogie is rotated 180 degrees compared to the front one. Because of the way instancing works, this means your
rear placeholder bogie also needs to have a rotation of 180 degrees. However, all wheels need to have a rotation of 0 degrees in order for them to rotate the same
way! The numbering of wheels goes from front to back, regardless of the rotation of the bogie.


General Notes on Dimensions

Certain dimensions are quite important for the game, in order for the physics to behave properly. Whenever possible use the exact dimensions from given data or as quoted on scale drawings. You need to have precise dimensions for:
  • overall length
  • bogie spacing
  • wheel spacing
  • wheel diameter
  • track width
  • buffer locations
Be accurate when placing shapes such as bogies and wheels. Do not place them by eye, but use exact coordinates! Also be extremely accurate with the wheel diameter.

Wheel Dimensions

The wheels of rolling stock need to be accurately modelled. Consult the diagram below for dimensions. Make a wheel minimum 20-sided. Increase this for large
wheels and locomotives.

Wheels need to rotate around their local X-axis, so if you’re starting off with a cylinder shape in MAX, be sure to reset the XForm.

British and German railroads have a standard width, measured from the inside of one rail's beam to the other, of 1.435 m. If you are modelling rolling stock for a different country, make sure you know this exact dimension for that country.

Buffer Locations

Buffers should be accurately placed according to the drawings and known dimensions.

For German railroads, buffers are 1.75m apart, measured from centre to centre. The height of the centre of the buffer is between 0.94 and 1.065 m from the rail
surface. The diameter of the buffer head is at least 0.37 m.

Buffer dimensions for British railroads are similar, with height usually being around 1.05 m and width 1.73 m.

UV Mapping

Train models will be pre-shaded using a soft shadow lighting solution (see Preshading). Therefore all parts that will receive unique shading will need their own unique UV Coordinates. Parts that look identical can share texture coordinates, such as in the example below.

When you encounter large areas with small logos, it’s often best to create a separate polygon and map the logo on top of that. Use a 1-bit alpha channel (“punch through”) as a mask. In the example above, this is done with the British Railways lion symbol. This symbol has its own 256x256 texture with punch-through alpha. This way we only have to texture the side of the vehicle once, saving a lot of texture space. The separate 256x256 texture will also have a much higher relative resolution, making the logo look nice and crisp and keep the text legible. Only apply this technique to important logos, such as company badges. Small warning signs that can often be found on various parts of rail vehicles may be illegible if the texture budget doesn’t allow a high enough resolution.

Remember that the number of different textures per object can have a serious performance impact. Thus keep your texture count per object to an absolute minimum. For example, don’t map parts of the bogie onto the main coach shape’s texture, as this would require two textures to be loaded for the bogie in the game. Also, try to split textures with regards to materials. Try to put textures that require an alpha channel for specular and/or opacity separate to those that don’t.



All textures should be pre-shaded. The reason for this is rather simple: pre-shading looks better! It makes 3D models look more realistic, helps enhance detail and helps preserve the shape over distance (LODs).

The neutral, global illumination alike shadows should be put onto the colour textures. In the image below you can easily appreciate the effect of the pre-shaded textures (right) compared to the non-shaded ones (left).


There are a number of ways you can achieve a global illumination alike lighting to bake into your textures. In standard 3ds Max you can use a Skylight and advanced lighting, this either being Light Tracer or Radiosity. Alternatively, you can use a MAXScript called E-Light. We recommend using E Light for exterior models (engines, coaches and wagons) for best results and to get a consistent look and ‘feel’ throughout the train assets.

E-Light is a freeware MAXScript, downloadable from (external link), which works in 3ds Max 3 and above. Simply run it from the MAXScript menu and it will pop up. The “MAX5” version will work for MAX 5 through 8. If you plan to use it often, open the script, select all the text (ctrl-A) and drag it onto the top toolbar. A button will automatically be created for your convenience.

A dome with lights will be created when you click the Create button on the Create rollout. All light and shadow settings can be altered at any given time before and after its creation.

To create a consistent lighting for all the coaches and wagons, it is recommended you use the E-Light template file (KRS_E-Light_train_template_meters.max or KRS_ELight_train_template_centimeters.max). Merge it into your scene, run the script and adjust only the radius for your purposes. To get the optimum lighting, switch a viewport to EL_Light01 and adjust the radius in the E-Light panel until the light cone encircles your object, with some room to spare. See the screenshot below:

You can render bogies with a smaller E-Light dome radius to improve their looks and bring out small details better. Be sure to move the E-Light dome to the centre of the bogie. See the image below:

Keep in mind that animated parts may have changing shadows. You will need to find a good looking “average” for these. Since the shadows are rather soft, this is usually not a problem. A typical example is the wheels, which need to be pre-shaded separately as in the example below:

Note how one of the wheel discs (at the bottom of the image, in grey) has been detached. Only one wheel disc needs to be pre-shaded as the other one will use the same mapping coordinates.

To bake shadows using E-Light it is recommended you use the template scene provided (KRS_E-Light_train_template.max) and merge your model into that. Apply a default grey MAX material (matt Standard material with a grey value of 150) to it and adjust the radius of E-Light as described earlier.

If you’re not happy with the results, you can experiment with the shadow map size and number of segments. The provided settings as displayed below should work well with most train models, but if artefacts form, increase the number of segments. If you run out of memory, decrease the map size to, say, 512. If too many small details are not casting shadows, you may need to increase the shadow map size to say, 1024. Lower the segments if you run out of memory or set a shadow map size that fits into your system’s memory.

Note: An ambient light value of RGB = (32,32,32) is in effect to prevent the unlit areas from becoming pure black. Alternatively, this can be tweaked in Photoshop using Levels.

Texture Baking

When texture baking, each material ID needs to be detached and shadows baked separately, as 3ds Max is unable to render shadows-per-ID. However, detaching parts may alter the way shadows and lighting behave when the seam is on a smooth surface. To prevent this from happening, don’t detach but add an Unwrap UV modifier on top of the model. Select all unwanted UVs (of the material IDs that you do not want to bake) and snap them to a corner of the UV layout (simply type 0 in both U and V type-ins at the bottom left) then texture bake. Do this for every material ID, removing the Unwrap UV modifier after baking each ID.

Turn off shadow casting on transparent objects to prevent any interior parts from becoming black. To do this select the object, right-click > properties > cast shadows (uncheck). Alternatively, you can hide your glass windows, as they won’t really require any pre-shading anyway.

Render to texture using Complete Map. Be sure to disable automatic mapping and shell materials in the Bake to Texture window. Apply 16 pixels edge padding to prevent seams. Use the rendered Complete Map as a multiply layer on top of your textures. Often you’ll find the mid tones come out too dark. Boost these by adjusting the levels to 1.5 and setting opacity to 80%. Check the provided example object’s PSD textures for how exactly this is done.

Below is the result of E-Light soft shadows on a MAX standard material, when rendered to texture using the settings above.

Texture Style

The aim of Train Simulator is to create a realistic and immersive game. Therefore you are required to make your textures as photo realistic as possible. The style we’re aiming for is hyper-realism, meaning (photo) realistic, but with vibrant colours.

Add a realistic amount of weathering to your models. Trains get dirty but don’t go overboard. Keep passenger coach paint schemes fairly clean, as railway companies won’t like to see their liveries battered up too much, even if your reference photography proves otherwise. Don’t smudge or damage company logos either for similar reasons.

Try to not use large areas of solid colour. Always add a subtle amount of variation throughout the model. Again, refer to the example models to get an idea of this. Baked 3D procedural materials can be used to simplify this process. Another great technique for making textures appear “photorealistically noisy” is by actually using photographs for solid colours. A colourised photograph of a smooth wall often looks more convincing than a solid colour fill in Photoshop. Beware of seams though. When using photos as a base for your textures, prevent any clue of direct lighting and hard shadows.


Texel Density

Lay out your texture sensibly. Use more relative mapping area (texel density) for the sides and roof of vehicles than for small bits underneath, but try to prevent big transitions in texel density. Prevent visible texture stretching and seams.

MipMap Implications

Map similarly coloured items together to prevent blending of colours when the texture gets mipmapped in the game.

Place long straight lines and colour demarcation (such as cheat lines on the sides of coaches) on a grid of 4, 8 or 16 pixels if you can, to prevent them from going blurry in subsequent mipmap levels. If they still tend to become blurry, use the Mip LOD Bias of the Kuju materials to push out the mips. Don’t exceed a value of +/- 2.0. Negative values will keep the image sharper longer. Typically only use -1 and only on the most important textures (numbers or textures with detailed logos) as it’s a quite “expensive” technique.

Keep enough space around objects to allow for mipmap blurring. An often seen mistake in train simulators is seams appearing down the middle of a roof when the first mip maps kick in. This happens when only half the roof is mapped (and mirrored) and placed next to a part of the texture with a different colour. If you mirror parts, make sure this doesn’t happen. Ideally prevent mirroring (as it often doesn’t look nice!) or make sure the mirror seam is practically invisible by allowing some bleed space with similar colour.


Textures need to be made as 24 or 32-bit RGB multi-layer PSD files. Textures can be non-square in size, as long as the size represents a factor of 2. Thus 128x128, 256x256, 512x256, 512x1024 and 1024x1024 pixels are all valid sizes. Don’t exceed 1024 pixels in width or height. 32x32 pixels is the smallest supported texture size.

You are allowed - but not required - to make source textures at double-size. A 1024x1024 in-game texture can, therefore, be generated at 2048x2048. If you use double-size textures it is recommended to apply mild sharpening after resizing. The following settings are recommended to prevent jaggy edges to appear (aliasing):


Material Types

  • TrainBasicObjectDiffuse - Use this material on non-shiny parts that don't require any bump mapping, alpha or specularity (such as bogies). Uses a 24-bit texture.
  • TrainSpecEnvMask – Use this material for the main 1024 texture of coaches and wagons and for wheels. Uses a 32-bit texture (colour + alpha for specular; white is shiny).
  • TrainBumpSpecEnvMask – Use this material on the engine for its two main 1024 textures. Uses a 32-bit texture (colour + alpha for specular) plus a 24-bit normal map.
  • BlendATexDiff – Use this material on windows. Uses a 32-bit texture (colour + alpha for opacity; white is opaque).
  • Tex – Use this for coach interiors only. This will make them self-illuminated at night. Uses a 24-bit texture. Always check the Backface Cull option on this material!

Specular Highlights

Most materials support specular highlights, which are defined by a glossiness and a specular value, just like standard 3ds Max materials. The glossiness value can be set in the first slot of the UV Arguments in the material, at the top of a material rollout. For instance, set it to 32.0 as below:

The specular value can be set under Specular Power in the Lighting Material roll out at the bottom of the material rollout, such as set to 3.0 below:

The other settings should be left untouched (although you can set Ambient Colour to black to be able to normally view your materials inside 3ds Max).

Shown below is a grid of random shapes with a variety of specular and glossiness values on them, using the material. For your train model, pick a combination that is appropriate.

The values used in the example pictures above (a glossiness of 32 and a specular power of 3) give a fairly good result for a glossy, but used, painted metal surface as found on many passenger trains.

Please refrain from using a glossiness of 0, no matter how small the specular power is. A specular power of 0 gives a totally matte surface, regardless of glossiness.

Material Features & Restrictions

Train Simulator's Materials were designed to be multi-functional on all kinds of games. So generally don’t modify any settings besides the texture and UV Channel (which should normally always be 1). Below are some guidelines for certain other settings you may need to modify.

  • Use the first box of the UV Arguments to set glossiness. As a guide use 64 for train “skin”. Under Lighting Material, you can set the Specular Power of the material, which is the equivalent of 3ds Max’s Specular Level. As a guide use 3.0 for train “skin”.
  • If you wish to preview your model using 3ds Max’s default renderer, then under Lighting Material set Ambient Colour to pure black or otherwise your textures will look washed out. This feature will have no influence in-game.
  • All material texture slots must have a texture assigned to them, even when not used, or the material won’t export properly. A typical example is the Environment map, which is supplied by code and doesn’t need specifying. Simply drop a clone of a bitmap that’s already being used into this slot. It will not be used in-game and simply acts to ‘validate’ the model for export.
  • Keep the Mip LOD Bias between -2.0 and 2.0, as some video cards won’t support higher or lower values. Ideally, leave this setting at its default 0.0. Positive values will push the mipmap transition further away, which will be required if the train model has a detailed design on the side of the body. Otherwise lengthwise stripes, for instance, will blur too quickly.
  • Set the Z-Buffer Mode of any textures which use a greyscale alpha channel for opacity to TEST ONLY.
  • When using punch-through alpha textures, set Transparency to TRANS. 
  • Use the 2 Sided option to make a material two-sided. Since all parts of a train are pre-shaded, it is unlikely you should use this feature.

Train Number Textures

Train numbers will be generated by code in-game (using a spreadsheet of possible number combinations), but require the artist to set them up in a specific manner.

Basically, the numbers will be a row of floating quads with changeable number textures. For the train numbers, there should be a vertical 32x64 pixel texture for each digit. Make sure the digit is neatly centred. Name these digit textures number_0 through to number_9. For more detailed numbers use 64x64 pixel textures.

The texture should be 24-bit with a punch-through alpha (1-bit; pure black and white). Since the alpha channel will be punch-through, be sure to push out the white area to around the digit’s outlines. To do this, simply make a greyscale alpha channel from your number and apply a threshold. Set the level to 1, which means that everything that isn’t pure black becomes white. This should give a fat, aliased, 1-bit alpha channel. Check the example below, showing the diffuse colour on the left and the black and white alpha channel on the right.

Simply save out the texture as a 32-bit texture. The game will recognise that the alpha channel only consists of black and white (1-bit) and treat it accordingly.

The number textures should be mapped on a quad per digit and can all be part of one and the same object, called 1_0128_primarydigits_#, where # indicates the number of digits. Since you can’t optimise a quad, number shapes don’t require LODs – hence the 128-metre LOD distance. If your train has exceptionally large sized numbers (American locomotives) that will be legible from a longer distance, increase the LOD distance to, say, 256 m or greater.

The quads used to map the numbers on should float approximately 1 to 2 cm in front of the surface it is supposed to be on. This is important to prevent both z-fighting and ‘floating’. The material applied should be a TrainBasicObjectDiffuse and called “primarydigits”. As the textures will be using a 1-bit alpha channel, set the Transparency to TRANS.

In the material setup, be sure to push out the mip LOD bias of number textures to -2, so they stay legible longer. Name the textures number_#.

Once the numbers are set up, replace their textures with placeholder textures from Source\Kuju\RailSimulator\System\Textures or the …\System\Textures folder of the specific project you work on. The placeholder textures will only be used to identify the place of a digit in a train number and are called primarynumber_#. You can carry on numbering if you have a 10-digit number or greater. Thus after primarynumber_9 comes primarynumber_10, etc. Assign primarynumber_1 to the first digit of the train number and number from there. Apply a multi-sub-object material to the number with material ID1 for the last digit, ID2 for the second digit from the right, and so on. In code, ID1 will be replaced by ones, ID2 by tens, ID3 by hundreds, etc.

Occasionally a train has two numbers or three numbers. The only way to deal with this is to practically stitch the numbers together. For example, on the Class 166, a coach with number 58122 belongs to a 166 unit with number 166201. The train number for this vehicle then becomes 58122166201 – an 11-digit number. Always put the carriage number in front of the train set number. So this means the train number has material ID 6 to 1 (from left to right) and the carriage number has 11 to 7 (from left to right).

In some cases, a number appears in two different colours on the same train. As only one texture can be swapped per number, both colours need to be placed on the same texture. In other words, you’ll need to combine say a white and a blue number X on the same texture and have the number appear twice in the alpha channel. Space them horizontally, then map only half the texture with the relevant colour to a texture digit.

In rare cases, train numbers appear on animated objects and need to be broken up. This is no problem as long as they have the same material applied to them and one of the number objects is called “1_0128_primarydigits_#” . The other object can have any name, but it’s recommended to call it “1_0128_primarydigits_#b” (for instance).

As a final note, letters are also supported by the numbering system and are treated as just another digit. So E12345 is a 6-digit number and is to be called primarydigits_6.

Light Glows

For head and taillight glows, make simpled quads and apply 64x64 or even 32x32-pixel 24-bit textures are to be used and their material set to AddATex. Set the Z-buffer mode to TEST ONLY.

Since the lights on a train can be turned on and off interactively, these objects need to conform to the naming convention specified in the Naming section above. As quads don’t require LODs, call them 1_1250_lights_fwdhead, 1_1250_lights_fwdtail1_1250_lights_revhead and 1_1250_lights_revtail. If for some reason multiple headlights are required, call them 1_1250_lights##_fwdhead, etc. Always keep the last eight characters as per naming convention for the system to work.


Keyframe an animation as you would normally. Always animate from a “neutral” to an “activated” position if you can. Thus doors from closed (first keyframe) to open (second keyframe, at the end of the animation range) and pantographs from lowered to raised. Use a halfway rotation keyframe for rotations equal or bigger than 180 degrees, to fix their direction.

Use TCB rotation on wipers, so they have a natural motion and they will stay parallel to the windshield they’re on (Euler rotations will cut through the windows).

Wheels and bogies typically do not need any animation, as they are code driven. The (main) wheels on a steam locomotive, however, do need to be animated, since a whole array of pistons and rods rely on them. Animate them for a full 360 degrees rotation of the wheel. The fail-safe way of going about this is to set their rotation type to linear, have 17(!) keyframes (0 till 16) and create a key for each frame, every time rotating the wheel 22.5 degrees further. Once you have made 16 keys set the out-of-range controller to “Relative Repeat”. The 17th frame (i.e. frame 16 when starting at frame 0) will remain empty but is required for the exporter, otherwise, a jump may appear in the in-game animation. Do likewise for coupling rods, which can be linked to their respective wheel and have a linear animation applied to them, which counteracts the rotation of the wheel.

Bogies on some modern trains, which have pistons and “loops” attached to them, also require animation. Give these a linear rotation from 5 degrees turning left (start of animation) to 5 degrees turning right (end of animation).

Loose freight and coal in tenders will need a loading animation going from empty to full. The length of this animation is irrelevant and generally, two position keyframes will do. Below is an example of such an animation. Animate from empty to full.

Any type of position and rotation animation is allowed, as the exporter simply snapshots each frame. Scaling animations, however, are not supported by the exporter (and all objects should always be made at 100% in all axes). Use the full length of the time bar for your animation, as the exporter will also snapshot frames that are not used. Alternatively, crop your animation in 3ds Max before export if not all keyframes are used. So in the example of the coal loading, the first frame of your time bar will show “empty” and the last frame on your time bar will show “full”.

Shadow Models

Stencil Shadows

All rolling stock is required to cast stencil shadows. For this purpose, shadow models need to be constructed. These are stripped down, low detail and fully closed (i.e. no open edges) shapes that will be projected against the scenery.

Always collapse your shadow models to an editable mesh as they’re more predictable than editable polys when it comes to edge management by the exporter.

Shadow models need to be linked to their respective top-LOD. Their name should have a “1_0032_shadow_” prefix. An example of a valid hierarchy with shadow models is shown below (top-LOD shown only for clarity).

Always use the MAXScript when creating shadow models. Simply select the object you want to create a shadow model of, run the script and hit the Create Shadow Model button. The script will take care of the naming, linking and removal of any keyframes for you. You then need to go in and edit the object as per the guidelines below.

As you can see in the hierarchy above, objects aren’t necessarily required to have a shadow model. Keep your shadow model as low-detail as possible. It can be a maximum of 10% of your original object’s polygon budget. Thus a 100,000 polygon engine model may have a shadow model of maximum 10,000 polys. Lower is better though (for game performance) and a lot of surface detail isn’t typically seen in the shadow of the object, so focus on the silhouette only.

A special shadow material should be assigned to the shadow models. This material uses the StencilShadow.fx shader and should be named shadow_anything. Since the exporter requires the material to have a texture assigned to it, assign any texture to it which is already used within the scene.

Mapping coordinates are of no importance to shadow models, though the file may not export correctly if it doesn’t have any, plus it won’t strip as well. Simply applying a single planar map to your shadow objects should fix this.

Smoothing groups, however, are very important. Once you’ve finalised your shadow shape, set the smoothing somewhere between 5 and 10 degrees and hit Auto Smooth. Your object will look extremely segmented, but this is required for the shadow shape to work correctly. Also, set the material ID of all polygons to 1.

It is of utmost importance these shapes are fully closed and do not have any open edges, or artefacts will appear. Be careful with butting edges and vertices, as the exporter 
might try to weld them, causing artefacts in-game. Double-sided faces are allowed but only in Editable Mesh mode. Double-sided polygons would break in Editable Poly mode. Be sure all edges are visible and the diagonal edge on the back side is crossing the one on the front side. If they’re overlapping, then again the exporter will break it.

Often on your first shadow shape export attempt, you will have a few graphical glitches. These are either flipping faces or edges stretching into infinity. Without exception these are caused by faults in the mesh, often caused by interference from the exporter. Look for open edges, butting edges and vertices which are very close together (they get welded and break the shape). Very long edges in a four-sided polygon can cause problems too. Simply break up the quad into two tris by making its invisible edge visible, and re-assign smoothing groups to fix the problem.

Be aware that shadow models cast a shadow on anything in the scene, including itself. Therefore it’s important that shadow models are not bigger than the object they represent. Keep this in mind with hollow shapes and rounded corners, as well as truss work-alike structures (don’t fill them in!).

Three LODs need to be constructed of the shadow models. LOD2 needs to have about half the polycount of LOD1. The emphasis for LOD2 should lie on removing all small parts that cast shadows, rather than optimising the shape (which you’ve already done).

LOD3 of the shadow model should be no more than a box and merely serves to cast a shadow at very far distances. It is inevitable it will fill up windows for example, but so be it.

LODs for shadow models are made the same way as LODs for other models. Using the KRS LOD Maker simply select the LOD1 of the shadow model and generate LOD2.

 Shadow Models Polycount Visible Distance
 LOD1 <10% of source shape 32
 LOD2 <5% of source shape 128
 LOD3 <100 triangles 400

Be sure to link both LOD2 and LOD3 of the shadow model to LOD1 of the shadow model, or simply use the KRS LOD Maker script!

Soft Shadows

Besides the stencil shadows, rolling stock also requires a soft shadow to be present underneath the main body of the vehicle. This will help to anchor the object to the rails and make it appear more realistic.

A soft shadow is nothing more than a fuzzy texture with a subtractive material, mapped on a single polygon which floats just above rail level. Soft shadows are provided for your convenience in the 3ds Max file softshade_shapes.max, with accompanying textures. Just merge the appropriate shape and adjust the length to best fit your vehicle. Do not scale the object (unless you do Reset XForm afterwards), but physically move the vertices.


Visible Distance & Polycount

Level-Of-Detail objects or LODs need to be constructed for all art assets to make sure the game will run smoothly.

Exterior models (engines/coaches/wagons) will require five LODs. Below is a table for the polycounts and distances per type of object.

 ObjectLODVisible Distance (m)Poly Limit (Faces)
 Passenger Coach1003240,000
 Freight Wagons & Tenders1003220,000*
* Flexible - See Polycount Budgets above

LOD 2 on all shapes will be used as the top-LOD on low-performance computers. Spend some extra time polishing these, as they will have to stand up to close-range viewing.

LOD’ing can be done in a non-linear fashion. This is especially recommended for over-budget freight vehicles. You are merely required to not exceed the polycount quoted at their respective distances.

It is recommended you create your model as Editable Poly objects and texture map them with care. Editable Poly objects allow you to speed up the creation of LODs by easily removing and collapsing edges. Mapping coordinates will usually be preserved this way. In 3ds Max you can also use the “Preserve UVs” function to your benefit.

You can use the provided MAXScript ( to aid your LOD creation. Make sure there are no big “jumps” when switching LODs.

Linking of LODs

LODs need to be linked to their respective top-LOD. Since this way they will inherit the top-LOD’s animation, you need to remove any animation keys from LOD 2 and onwards.

To make this process easier, you have been provided with a MAXScript ( that does this all for you. Always use this script when creating your LOD objects. All you need to do is run the script, select the object or objects you want to create the next LOD level of, set the visible distance and execute. Thus if you need to make the third LOD level, select all second LOD level objects, set the visible distance and execute the script.

A valid LOD hierarchy, including the shadow models, would look like this:

Note that not all objects need to have a fourth and fifth LOD. Often the main shape (locomotive/coach/wagon/tender) is sufficient to represent the model at long distance. Fewer objects are better for game performance. For the fourth and fifth LOD simply attach the wheels and bogies to the main train body, as they are so small on the screen it’s impossible to tell if they are moving anyway.



The mesh is to be exported to .IGS using the plugin for 3ds Max. Double-check your scene is correctly set up in metres before export.

Use: File > Export > Intermediate Geometry

Check “Ignore Hidden Objects” (if any) but otherwise leave everything unchecked. Make sure all non-relevant geometry is hidden.


Animations need to be exported in Intermediate Animation format.

Use: File > Export > Intermediate Animation

Use default settings, as below.

An IA file needs to be exported for every animation in the scene. An animation can contain multiple objects. Thus a steam locomotive’s driving gear animation will have wheels, pistons, rods, etc… A coal level animation will just have the coal model, while a pantograph animation will have all pantograph parts of one pantograph as each pantograph can be raised or lowered separately in the game and thus two pantographs will require two animations to be exported. To optimise the IA file size, hide every object that doesn’t have any relevant animation on it.

There is no set naming convention for animations. Simply give them a short, logical name, that makes it perfectly clear what the animation file contains. Thus the Black 5’s wheels, rods and pistons animation is called “black5_drive.IA” and the Black5 tender’s coal level animation is called “black5_coal.IA”.


Textures need to be converted to either ACE format using the Photoshop CS plugin or DDS format using nVidia's Photoshop Plugin.

Use: File > Save As > ACE Format
Use: File > Save As > DDS Format

Make sure you name normal maps name_nm to prevent them from being compressed, as compressed normal maps give weird artefacts in the viewer.

ACE Files
Always make sure “Make MIPs” is checked when saving ACE files. If you would like to view the MIPs for one reason or another or wish to save textures without MIPs, check Show Mips.

DDS Files
Always make sure "Generate MIP maps" is checked when saving DDS files. If you would like to view the MIPs for one reason or another, simply reload the DDS file, the nVidia DDS Plugin will provide you with a selection of options, simply select the appropriate option to view.  If you wish to save a texture without MIPs, check "No MIP maps".