Train Cab Guidelines


This section provides general information on how to create cabs and interiors for rolling stock in Train Simulator.

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 polycount limits are in effect for 3D cabs and interiors for rolling stock in Train Simulator. These are triangle counts, so if your object is an EditablePoly, add a MeshSelect modifier on top to get an accurate polycount. If you use the LOD_Viewer MAXScript (, this will be done for you.

Top-LOD Polycounts:
  • 3D Driving Cab: 40,000
  • 3D Passenger Interior: 20,000
For more information on polycounts and LOD see LODs below.

Texture budgets

Players spend most of their time inside the 3D cabs of the in-game engines and therefore an appropriate amount of detail should be assigned to them. To achieve this you’re allowed the following texture budgets:
  • two 32-bit 1024x1024 pixel textures; alpha to be used as a specular mask
  • two 24-bit 1024x1024 pixel textures; to be used as normal maps
  • one 32-bit 1024x1024 pixel texture; alpha to be used for self-illumination (lights)
  • two 24-bit 1024x1024 pixel textures
  • one 32-bit 1024x1024 pixel texture; alpha to be used for opacity (windows)
Try minimising the number of different texture maps assigned to a single object. Thus, don’t assign more than one texture to a single cab control.

3D Passenger interiors will be populated by 3D characters and texture usage needs to be optimised accordingly. Since there are a lot of repetitive objects within most carriage interiors, this shouldn’t be a big problem. You are allowed the following budgets:
  • One 32-bit 1024x1024 pixel texture; alpha to be used as a specular mask
  • One 24-bit 1024x1024 pixel texture; to be used as normal map
  • Two 24-bit 1024x1024 textures
  • One 32-bit 512x512 texture; alpha to be used as an opacity mask (windows)
Parts of the exterior model which may be visible from the interior model can be “borrowed” from the exterior model. This does affect the poly budget but does not affect the texture budget (as these textures are loaded anyway when switching to exterior view). Do however try to plan your exterior model in such a way that only one texture needs to be used for these parts, if at all possible.

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, especially when modelling interiors, 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”.


All scene objects need to be linked logically, where applicable. But since the cabs as a whole are directly linked to their exterior models, there is no need to link controls, etc. to the main cab shape object. It is therefore quite likely your scene won't require any linking at all.


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 doors or wipers should be numbered (in two digits) 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

Since interior LODs are never supposed to disappear, ££££ should always read 0000, which gives the object an infinite LOD distance. The LODs are purely controlled by the graphics quality settings within the game.

Below is a table with pre-determined object names. If your object does not conform to any of these, use a logical name instead, closely resembling the shape you're modelling.

 Object Name
 3D cab cab
 3D coach interior interior
 Wiper wiper
 Speedometer needle speed
 Door door##_?
 Train number train_number

Thus the second LOD of the speedometer needle is called: 2_0000_speed

Here is an example of a valid hierarchy for a 3D cab. As you can see there’s hardly any linking going on.

Basic Rules

  • Always use lowercase for all filenames (maxddsacepsd, 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 the root node object (cab or interior) at 0, 0, 0. Make sure this object's position is accurate with regard to its location on the actual train, as demonstrated in the picture below.
  • Place pivots of movable or rotatable objects, such as levers, precisely at their correct physical pivots. Typically their animation needs to be set to linear.
  • Always use a linear rotation on dials and gauges.
  • Reset XForm if you have made any change to pivots or scale.

Recommended Workflow

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


Basic Modelling Rules

  • 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.
  • Work accurately, especially when it comes to pivots of dials and gauges or similar.
  • Meshes are single-sided by default, but double-sidedness can be enabled in the material settings if required (not recommended).
  • With cabs and interiors, it's important to put the detail there where it will be appreciated. For example, with locomotives cabs, put more detail right in front of the driver's seat and around the dials, i.e. places where the player will be looking more often. Roofs, floors and rear walls of a cab, for instance, don't need as much detail. Passenger interior models may have one fixed camera position. Thus put more detail close to the passenger. Don't save on chamfers and bevels as they will be appreciated close-up. But keep things simpler in the distance. So rather than cloning a high-detail seat, also make a low detail variant for the back of the cab - much like static LODding. Keep this in mind when texturing too, assigning more texture space to dials and areas in the driver's or passenger's view. However, do make sure the low-detail areas still look decent and are not visibly "neglected".

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.

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 a power lever on multiple textures but try to keep it all on the same texture page. Also, try to split textures with regard to materials. So map all metal bits that need reflections on one texture sheet. 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).

Light Tracer

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 Light Tracer for interior models (driver cabs and passenger cabins) for best results and to get a consistent look and ‘feel’ throughout the train assets.

So for interior shadow baking use Light Tracer, as E-Light doesn’t do any light bouncing. Apply a default grey MAX material to your model. Assign a similar material but with 0% opacity to any windows and transparencies. Next, create a Skylight. Set the colour to white and the multiplier to 1. Set up Light Tracer as follows:

Light Tracer isn’t fast, but it’s easy to set up and gives decent results. Using the guidelines and recommended settings should give you pretty good results straight away, without the hassle of endless test renders. Use a black ambient light in your environment settings.

Be sure you’re working in centimetres, as results with meters won’t look as good. If your pre-shaded textures look too noisy, shadow-bake again using a slightly different Rays/Sample setting. Combine both pre-baked images (set the top layer to 50% opacity) as it will smoothen out the grain. This will be faster than cranking up the Rays/Sample to extreme values. Of course, if you plan to render overnight you could do it that way too.

If you have objects intersecting through your walls and ceiling, you may get white edges on them from light ‘leaking in’. To prevent unwanted light from leaking in, it’s advisable to create a shell around your cab, which you start by extruding the edges from your window sills. This should take no longer than 5 or 10 minutes and will save you a lot of time fixing unwanted highlights later. Below is a picture showing how this was done on the HST. This shell (shown in green) is only required for the shadow baking and should be hidden or deleted before export.

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.

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).

Render to texture using Complete Map. Be sure to disable automatic mapping and shell materials in the Bake to Texture window. Apply at least 16 pixels edge padding to prevent seams, or simply drag the padding spinner all the way up. Use the rendered Complete Map as a multiply layer on top of your textures. Always render out your pre-shadow texture before you start doing the colours of the texture, as these will need to be a bit brighter than usual to compensate for the darkness the multiply layer adds. Alternatively, tweak levels or the opacity of the multiply layers.

Below is the result of Light Tracer soft shadows on a MAX standard material, when rendered to texture using the settings described 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. Use reference photographs to aid your texturing, but be sure to edit out any unwanted highlights and shadows before applying them, as we're aiming for a neutral diffuse lighting throughout.

Add a realistic amount of weathering to your models. Trains get dirty but don’t go overboard. Keep passenger coach interiors fairly clean though, as railway companies won’t like to see their coaches in a badly maintained shape, 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 area closer to the viewer and directly in the viewer's view. Thus for a driver's cab, assign more texture space to the dashboard and dials than to the roof and floor. However, try to prevent big transitions in texel density as the player will be able to have a 360-degree look-around and everything should look consistent. Prevent visible texture stretching and seams.

MipMap Implications

Make sure dials are fully legible, even when the texture is scaled down to 50%. For low-performance computers, we will use the second mipmap level as the highest.

If textures switch mipmaps too early, increase the MIP LOD Bias in the materials to a value up to -2. This will force the mipmap transition later. In practice, you wouldn’t want to see any mipping going on in the cab, as everything is relatively close to the viewer. But since we require the second mipmap level for low-spec computers, we still need to save out the ACE textures with mipmaps. So in general, set all materials for the cab to a MIP level of -2.0.


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 the ceiling of the cab). Uses a 24-bit texture.
  • TrainSpecEnvMask – Use this material on shiny or worn surfaces that don’t require bump mapping. Uses a 32-bit texture (colour + alpha for specular; white is shiny).
  • TrainBumpSpecEnvMask – Use this material on rough surfaces that require bump mapping. It can of course also be used on smooth surfaces to simulate screws and panels. 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 and dial needles only. This will make them self-illuminated at night. Uses a 24-bit texture. Always check the Backface Cull option on this material!
  • AddATex - Use this material for lights and dial faces. Always set the z-buffer mode to TEST ONLY.
  • TexDiff - Use this material for animated textures, such as fire in a firebox.

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 Restrictions

  • 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.

Train Number Textures

Usually, train numbers appear not only on the outside of a train but on one or more panels inside the cab as well.

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.

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.

Special Effects


Lights which are always on can simply be given an AddATex material to make them glow. However, most cabs have lights, such as warning lights, which can have an on and off state. In this case, model the light as if it was off, giving it a normal TrainBasicObjectDiffuse texture. Next, detach a clone (to object) of the light’s polygons and place them just in front of the “off” light. Change the material ID and assign an AddATex material to it. Be sure to select “TEST ONLY” for the Z-buffer Mode. In some cases you can use the same texture again, in other cases, you’ll need to make a separate glow texture (which can be included on the same 24-bit texture map). Give the object the name of the light; start the name with “light” so you can easily recognise it. Add the suffix _lit to it, so the code can identify the object as a light that is on. Thus if you have a wheel slip indicator, call the object 1_0000_light_wheelslip_lit. Similarly, an AWS light would be called 1_0000_light_aws_lit.


Steam engines have a firebox and when it opens it should show an animated fire. For this purpose, we need a multi-frame fire animation. Each frame has its own texture page. It can be quite small usually, say, 64x64 pixels at 24-bit, and can be added to the set texture budgets. Call the files fire_# (without padding, starting at 1). A 16-frame fire animation, therefore, runs from fire_1 to fire_16.

Create a TexDiff material for the fire and call it “fire”. TexDiff is the only material that supports multi-frame animation. As fire is illuminated, set the Lighting Model to FULL BRIGHT as illustrated in the picture below.

Assign the first frame of the texture (frame_00.ace) to the bitmap slot. Don’t forget to set the LOD Bias to -2.0 to prevent mipmaps from kicking in. Put this material in a Multi/Sub-object material. If you have 16 frames, you need 16 material IDs. For each material ID change the bitmap to the next frame in the animation.

Now go back to your first material (ID1) that uses fire_1. Under UV Special Effects, check the box next to “Texture is animated” and enter the number of frames (16 in this case) as well as a speed, say 12 frames per second.

Lastly, create your actual fire geometry. Call it “1_0000_anim_fire”. This is usually a simple plane behind the opening in the firebox. Assign material ID1 to the plane and assign the fire material to it. Then to ensure all sixteen material IDs are exported correctly, the other fifteen IDs need to be assigned to the fire geometry as well. Simply create fifteen small polygons, out of sight, and give them material IDs 2 through 16.

Since the TexDiff material isn’t an additive material, your fire might look quite dull. You can enhance this by adding a single polygon in front of it and applying an AddATex material to it. Set the Z-buffer mode to TEST ONLY. Assign to it a small bitmap with a black background and a dull orange coloured blob in the middle, as the example below. This will make the fire appear to glow.


When animating, start with any “neutral” or “normal” position (speedo needle at 0, switch at “off”, door closed). So, for example, the needle of a speedometer will have one rotation keyframe for 0 mph/km/h and one rotation keyframe for its top speed. Also, add a keyframe half-way to ensure the rotation goes the right way around. Be sure to use a linear rotation on dials and levers with position indicators!

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). Animate half a swipe only; this will be ping-ponged in code.

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. Be sure to use the full length of the animation (typically frame 0 to 16), as the exporter will also snapshot frames that don’t have animation keys. Alternatively, crop your animation in 3ds Max before export if not all keyframes are used. So in the example of the speedo, the first frame on your time bar will have 0 mph/km/h and the last frame on your time bar will have max. speed.

Shadow Models

All rolling stock is required to cast shadows. This also applies to cabs and interiors. For this purpose, shadow models need to be constructed. These are stripped down, ow 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.

It is not necessary to build a full shadow model of every part of the cab. All that’s required is to be able to see the light falling through the windows. For this purpose, the shadow model of the exterior model is used as a basis. When the cab or interior view is enabled, this shadow model will be activated and its corresponding shadow model of the exterior model will be disabled. See the schematic below.

The main shadow model for a driver’s cabs must be called 1_0000_shadow_locomotive, while the main shadow model for the passenger coach models must be called 1_0000_shadow_coach.

Shadow models need to be linked to their respective top-LOD. Their name should always have a “1_0000_shadow_” prefix. An example of a valid hierarchy with shadow models is shown below.

Normally only the 1_0000_shadow_locomotive or 1_0000_shadow_coach model will be required. In certain cases, however, you need more shadow models, such as the shadow model for the glare panels in the example above.

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. Lower is better 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. 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 as the exporter might try to weld them, causing artefacts as well. 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.

Include a LOD2 of the shadow model as well, and link it to the LOD1 shadow model. Try optimising the shadow model LOD2 to about 50-75% of the polycount of the LOD1 shadow model. See LODs for Train Cabins for more info about LODs.


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. On high-performance machines, the first LOD will be displayed, while on low-performance machines, the second LOD will be displayed.

Interior models (cabs/passenger interiors) will require three LODs, of which one is consisting of only boxes for the interactive mouse control. Below is a table for the polycounts and distances per type of object.

 ObjectLODVisible Distance (m)Poly Limit (Faces)
 30000Boxes only
 Passenger Interior1000020,000
 30000Boxes only

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.

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 second LOD level, select all first LOD level objects and execute the script. The third LOD level needs to be built using boxes only but still requires linking to its top-LOD parent.



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 pair of windscreen wipers will be exported as a single animation, as they typically work at the same time (i.e. react to the same command from the player). A power lever is just that and should be exported on it own, as should individual dials, switches, etc. To optimise the IA file size, hide every object that doesn’t have any relevant animation on it.

Typically give animations the same name as the object you're animating. Thus if you're animating the AWS Reset of the HST cab and it's called 1_0000_aws_reset in the cab model, then name your IA file hst_cab_aws_reset.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".