JACK'S COACHING

Build for the
world of BeamNG.

Practical coaching for maps, vehicle parts, custom cars, and textures. Start with a working project, then take it further.

JACK'S COACHINGLEARN · MAKE · IMPROVE
THE COACHING LIBRARY

All BeamNG coaching

35 LESSONS
Show all lessons
Your learning progress0 of 35 complete
PICK A ROUTEChoose one BeamNG project and build it in steps
BEGINNERGuided foundations and first projectsADVANCEDDeeper systems, polish, and release workflows
New to the terms? Here’s a quick plain-language guide.

Vanilla: the original game version, before adding mods. A donor vehicle is a working car you use as a starting point. DAE: a file containing a 3D model. JBeam: the files that tell BeamNG how a vehicle or part bends, moves, and collides.

Node: a physics point. Beam: a link between two physics points. Mesh: the visible 3D model. Flexbody: a visible model that follows the physics points as they move. A node group is a named set of physics points. A model’s origin is its local center point; moving it can change where the model appears or rotates. Transform: the model’s position, rotation, and size.

Slot: a place in the vehicle parts menu where an add-on fits. A parent slot is the opening on the car; the child part is the part fitted into it. A slot variable is a setting passed from that menu slot to the part installed there. A configuration is a saved set of vehicle parts. Electric/electrics: a named vehicle signal, such as boost or a canopy’s open/closed state. Lua: the programming language BeamNG uses for vehicle features and apps.

UV map: a flattened layout that shows where a texture image lands on a 3D model. A texture set is a group of images used together on a model. A normal map adds the look of small surface detail without adding extra geometry. Baking means calculating guide images from the model, such as where edges and creases are. BeamNG’s texture cooker converts texture images to DDS, a format the game can load efficiently.

A prop is a moving model part, such as a gauge needle. A hydro is a physics actuator that moves parts; a torsion hydro swings a part around a hinge. A slidenode is a physics point that slides along a rail to guide a moving part. A trigger is a clickable area. An interaction map connects that click to an action, such as opening a door. A glowmap changes a material when a vehicle signal changes. A stream is a feed of vehicle data sent to an app.

A template is a ready-made starting project. A ground model is the setting that controls how a surface behaves under the tires, such as grip and bumps.

⌖
TRACK 01 · 5 LESSONS

BeamNG Map Making

Start with a small drivable level, then shape and polish a complete place to drive.

01Your first playable BeamNG mapCreate a level, find the right folders, and get a vehicle drivingBEGINNER

Begin with a small test loop rather than a giant open world. BeamNG’s current level guide recommends the Starter Level template and a first milestone that loads, spawns a vehicle, and has one drivable road or test area.

  1. In BeamNG.drive, open the World Editor with F11 and create a new level from the Starter Level template. Give it a short lowercase folder name.
  2. Save the new level and confirm its folder is under your BeamNG user folder’s levels directory. Keep the level’s working files together.
  3. Place the SpawnSphere (the spot where the player starts) on safe, flat ground, and set it as the map’s default start point.
  4. Make a short road or flat driving pad. Save, reload the level, spawn a vehicle, and drive the whole test area.
  5. Check BeamNG’s error log for missing files or materials before adding more content.
First project: Build a small test site with one spawn, a short straight, a bend, a ramp, and a safe reset area. Your goal is a map that loads and drives reliably.
BeamNG: Level setup and first playable checklist ↗
02Sculpt terrain and paint believable groundShape the land, set the ground look, and check how it drivesBEGINNER

Terrain is both a shape and a surface. A hill can look right but still feel wrong to drive if its slope, ground material, or road edge is abrupt.

  1. Use the terrain brush in small passes to raise, lower, and smooth the ground. Keep a separate test slope so you can check vehicle behavior as you work.
  2. Paint a few materials with clear purpose: road shoulder, dirt, grass, and rock. Use the level’s terrain material workflow and check every texture after reloading.
  3. Choose the matching ground behavior for grip and bumps. A gravel-looking image alone will not make the surface feel like gravel when driving.
  4. Blend terrain into roads and props. Drive the joins slowly and at speed to find bumps, gaps, and invisible edges.
  5. If importing a heightmap, check its orientation and scale in the editor before doing detailed sculpting.
First project: Make a short dirt climb with a flat run-up and safe runoff. Paint the road, shoulder, and surrounding ground, then test it with two different vehicles.
BeamNG: Terrain, heightmaps, materials, and water ↗
03Design an advanced road and test coursePlan a route that is easy to read and test at different speedsADVANCED

An advanced map route should be easy to understand from the driver’s seat and feel right at different speeds. Every crest, corner, shoulder, and transition should have a reason and enough space for the intended vehicle.

  1. Write a route brief: intended vehicles, driving style, average speed, challenge level, and what the player should notice.
  2. Lay out the road centerline first. Use broad turns and gentle grade changes to establish flow before adding tight corners or dramatic crests.
  3. Check sight distance, corner entry, banking, road width, runoff, and recovery space from the driver’s view.
  4. Build a repeatable test route with clear start and end points. Drive it in a light car, a heavy vehicle, and a faster vehicle.
  5. Use decals, shoulders, barriers, and terrain transitions to communicate the road edge without creating snag points.
Advanced challenge: Make a one-minute time-trial loop with one slow technical section and one fast section. Record where test vehicles leave the road, bottom out, or encounter unclear cues; revise those spots.
BeamNG: Roads and drivable surfaces ↗
04Polish, optimize, and package a mapImprove frame rate, find missing files, and prepare your map to shareADVANCED

A finished level needs to load consistently, keep a useful frame rate, and include every referenced asset. Validate the packaged ZIP separately from your working folder.

  1. Check the map in daylight and at night. Confirm the road is readable, lights do not overwhelm visibility, and the spawn is obvious.
  2. Review vegetation and repeated props for density, draw distance, and avoidable clutter. Check the frame rate in the busiest area, not just the empty start point.
  3. Inspect the level for missing textures, broken material paths, duplicate assets, and files that are only present on your machine.
  4. Include the required /levels/your_map content and referenced assets. Leave your working files, temporary game files, and autosaves out of the ZIP you share.
  5. Test the ZIP after moving your working folder out of the way and turning off other mods. Confirm load, spawn, materials, and performance.
Release checklist: Ask another person to install the ZIP, load the map, find the spawn, and complete your test route without instructions from you.
BeamNG: Packaging and publishing a level ↗
05Build smooth roads with the Road Spline ToolShape the road, add markings, and blend its edges into the groundADVANCED

The Road Spline Tool lets you draw a road path and make its markings and ground edges follow it. Test a short section first: a road can look smooth from above but still have a bump or rough edge when driven.

  1. Open the World Editor with F11, switch to the Road Spline Tool, and make a short test spline on a flat area.
  2. Place physics points along the road path where its shape changes, such as where a bend starts or ends, or where the road rises over a hill. Avoid adding a node every few metres; too many make the path harder to smooth.
  3. Drag the side handles to set the road width. Add or adjust layers for the asphalt, edge lines, center line, and wear so each layer follows the same route.
  4. Choose the terrain material and margin, then enable terrain painting and edge blending. Inspect the seam from the driver camera and from a low side angle.
  5. Drive over the spline slowly and at speed. Check for sharp crests, floating edges, sudden grip changes, and markings that drift away from the road.
  6. Save your level, reload it, and check the road again. If you need to reuse the setup, save the spline profile and test it on a second short section.
Advanced challenge: Build a 200-metre road section with a gentle S-bend, two edge lines, a center line, and blended grass shoulders. It should read clearly at speed and have no abrupt terrain lip.
BeamNG: Road Spline Tool basic usage ↗BeamNG: Road layers, terrain painting, and edge blending ↗
⚙
TRACK 02 · 5 LESSONS

Add Parts to Vanilla Cars

Make a standalone add-on part that fits into a vehicle’s existing parts selector.

01Plan a simple add-on partChoose a car, find the right place in its parts menu, and set up your mod folderBEGINNER

A small cosmetic part is a good first vehicle mod. Start with a simple lip, roof accessory, or bumper detail that fits an existing slot. Keep your own files in a standalone mod folder and give your part names a unique prefix.

  1. Choose one vanilla vehicle and one existing part slot that matches what you want to make. Use the in-game parts selector and official part/slot documentation to learn the slot’s exact type.
  2. Make a separate working folder for your mod at Userfolder/mods/unpacked/your_unique_mod/vehicles/<vehicle_name>/. Keep all of your part files inside it. Do not edit or redistribute the original game files.
  3. In Blender, use a reference mesh only as a placement guide. Create your own mesh, align it to the vehicle, name it clearly, and export a DAE into your mod’s vehicle folder.
  4. Make a small JBeam part definition with a unique internal name and the slot type you found. Reference your own mesh and suitable existing node groups only when you understand their purpose.
  5. Reload the vehicle and look for your part in the slot. Confirm it installs, appears in the right place, and can be removed again.
First part: Make a simple roof accessory for one existing slot. Focus on correct folder paths, unique naming, and placement before attempting structural parts.
BeamNG: How parts and slots work ↗
02Build and test your first selectable partConnect your visible 3D model to the vehicle physics and test it in gameBEGINNER

The mesh is only the visible part. JBeam identifies the part, connects it to a slot, and maps the visible model to the vehicle’s structure. Start by reading a similar vanilla part to understand the pattern, then write your own small definition.

  1. Read the parent part’s slots entry and note the slot type, default part, and display name. The child part’s slotType must match.
  2. Give the new part a unique internal name, a readable display name, and your own author information.
  3. Export a low-complexity mesh to DAE. Keep the pivot and orientation consistent with the vehicle, and ensure object names match references used in your JBeam.
  4. Set up the required material definition and use texture paths inside your mod. Start with a simple material before adding a full texture set.
  5. Reload the vehicle after each change. Inspect the part selector, check for console errors, and compare alignment from front, side, and rear views.
First part: Make one selectable bumper trim. Verify the default bumper still works when your option is removed and that your part does not replace another mod’s names.
BeamNG: Slot types and component choices ↗
03Build a vehicle upgrade from separate partsOrganize parts, offer options, and make sure they behave properly in a crashADVANCED

Complex upgrades need a clear list of which parts fit into other parts. Separate mesh, JBeam, and material responsibilities so a broken option can be isolated without losing the rest of the vehicle.

  1. Write down which part-menu openings accept each part, and which part is selected by default, before editing. Prefer existing compatible slots; adding a new slot to a vanilla vehicle usually means modifying its parent and can create compatibility conflicts.
  2. Split related components into focused JBeam files and use unique prefixes for part names, nodes, groups, materials, and mesh objects.
  3. Use slot variables when a reusable part needs small placement or configuration changes. Keep each variable’s purpose documented and test every supported combination.
  4. Map flexbodies to the intended node groups, check origins and transforms, and use deform groups only when the part needs damage-triggered material changes.
  5. Test combinations with other common upgrades, then verify deformation, breakage, reset behavior, and vehicle configurations.
Advanced challenge: Create a modular front-end package with a base bumper, an optional light bar, and an optional winch. Test every valid combination and a frontal collision.
BeamNG: Slots, variables, and component trees ↗
04Debug alignment, deformation, and conflictsFix misplaced models, physics points, naming problems, and mod conflictsADVANCED

When a part appears offset, floats, or behaves strangely after a crash, diagnose one layer at a time. A model with its center point in the wrong place, a mismatch in physics-point groups, a repeated name, or the wrong parts-menu slot can all look like a modeling problem.

  1. Confirm the part is loading from your mod and that its slot type and identifiers are unique.
  2. Compare the model’s center point, position, rotation, direction, and size with the car’s other parts. Check carefully where the deforming model is centered and which physics points it follows.
  3. Check that the flexbody references the intended mesh and node group. Use node and triangle debug views to understand the structure rather than guessing.
  4. Read the console immediately after reload and fix the first relevant error before chasing later warnings.
  5. Test with only the mods you need turned on and make sure you have not copied, modified, or redistributed game files without permission.
Advanced challenge: Make a checklist and try installing, removing, resetting, crashing, and using another mod on the same car. Keep a short note for each issue and fix.
BeamNG: Vehicle modeling and origin guidance ↗
05Make one part fit several variants with slot variablesReuse one physics file for more than one vehicle versionADVANCED

A slot variable is a setting passed from the vehicle’s parts-menu slot to the add-on installed there. They are useful when a component has small differences between vehicle variants, so you can reuse one part definition instead of copying nearly identical files.

  1. Choose a harmless difference to test, such as a node offset or a small dimension. Do not begin with suspension geometry or a safety-critical component.
  2. Find the parent slot entries and identify the values the slot can pass. Read the official Slot Variables example and a current vanilla example before editing.
  3. Make a copy of your own working part in your unpacked mod. Add a uniquely named variable to the slot definition, then reference it in the child part using the documented syntax.
  4. Start with one simple setting and do not make it adjustable yet. Confirm the part loads and behaves exactly like the original test before adding a second variant or a function.
  5. Use a second slot/vehicle variant to pass a different value. Make sure names and node/group identifiers remain unique where the part requires them.
  6. Reload the vehicle after each change. Check the parts selector, console, node positions, and deformation; remove the part and verify the stock configuration still loads.
Advanced challenge: Reuse one small accessory part in two compatible parent slots with a different documented offset for each. Keep both variants in your own mod and do not alter vanilla files.
Safety rule: Slot variables are a way to reuse a design, not a shortcut around understanding its geometry. Test one value at a time and keep a known-good copy.
BeamNG: Slots and slot variables ↗BeamNG: JBeam variables and function syntax ↗
▰
TRACK 03 · 5 LESSONS

Build a Car Using a Vanilla Starting Point

Use a simple donor platform to learn vehicle structure, then move toward your own JBeam.

01Choose a starting car and plan a first build you can finishPick a starting car, decide what to reuse, and keep the project manageableBEGINNER

A complete car is a much bigger job than a body model. For a first project, choose a simple vehicle concept and reuse a compatible drivetrain or suspension as a learning scaffold, as BeamNG’s basic-car tutorial demonstrates.

  1. Write a one-sentence concept and pick a vanilla platform with a similar wheelbase, engine location, and intended use.
  2. Decide what is yours: body, chassis design, wheels, engine tuning, or configuration. Make a small scope you can finish.
  3. Read the official basic-car tutorial before changing files. Use its included template and examples where appropriate instead of trying to invent every system at once.
  4. Keep all the files for your mod together and give them names that will not clash with other mods. Treat vanilla files as references; do not ship the game’s original assets as your own.
  5. Block out the body in Blender and check proportions against wheel centers, ground clearance, and the intended driver space.
First build: Make a simple buggy concept based on a compatible platform. Start with a rolling chassis and basic body panels, then expand only after it loads and drives.
BeamNG: Basic car tutorial and starter template ↗
02Make a drivable first prototypeName the 3D models, connect them to vehicle physics, and test safelyBEGINNER

Get a simple prototype spawning before refining details. A vehicle needs both a visible 3D model (DAE) and JBeam files that define how its physics works.

  1. Keep the first chassis simple and follow the template’s coordinate conventions. Separate visible body meshes from the physical structure.
  2. Use a simple, evenly spaced layout of physics points and links to make the basic frame. Read each section of the template and change one system at a time.
  3. Reference the body mesh as a flexbody and make sure its object name, origin, and node group agree with the JBeam.
  4. Start with the template’s compatible suspension and drivetrain. Do not attempt a complex bespoke powertrain before the car can spawn and move.
  5. Load the car, inspect it in the vehicle editor/debug views, and test at low speed on a simple map. Fix structural issues before styling.
First build: Get a basic rolling chassis with a visible body, steering, and brakes. Test low-speed turning and a small bump before adding power.
BeamNG: Basic car JBeam workflow ↗
03Develop your own chassis and deformationPlan physics points and links, then test how the car bendsADVANCED

Advanced vehicle work means designing a coherent physical structure, not just making a detailed mesh. Nodes, beams, triangles, and groups determine how the car deforms and how its visible components follow.

  1. Use the reference platform to understand proven geometry, but design and name your own structure deliberately. Keep the overall node layout readable and symmetric where appropriate.
  2. Build the chassis in logical groups and connect the structure with beams that provide stable paths for loads.
  3. Map body panels and mechanical meshes to appropriate flexbody groups. Keep origins at the expected location and check the mapping in game.
  4. Tune deformation and strength gradually. Make one controlled change, then test the same low-speed and higher-energy impacts.
  5. Use BeamNG’s debug visualizations to find disconnected nodes, weak links, bad triangles, and meshes that detach or stretch.
Advanced challenge: Build a simple tube-frame chassis with front and rear structures. Compare a side impact and frontal impact, then document which structural changes improved the result.
BeamNG: JBeam sections and vehicle structure ↗
04Turn the prototype into a complete vehicle modOrganize the parts menu, set up car options, and prepare your mod to shareADVANCED

A vehicle feels complete when its options form a usable system. Organize the parts tree and configs so players can understand what each choice changes.

  1. Separate major components into parts with clear slots and defaults. Avoid one giant file that is difficult to debug.
  2. Add only a few meaningful options first: for example, road and off-road suspension, two engines, and a body trim.
  3. Set up materials and textures with consistent naming. Verify every material and texture path in game.
  4. Create a small number of tested configurations with useful names and thumbnails. Confirm each configuration loads without missing parts.
  5. Test handling, deformation, reset, part combinations, and performance. Package only your own required files and test the ZIP outside your working folder.
Advanced challenge: Publish a prototype with two clear configurations and a short test report covering handling, crashes, missing assets, and known limitations.
BeamNG: Parts, configs, and slot structure ↗
05Connect and check the engine-to-wheel systemFollow power from the engine through the gearbox to the wheelsADVANCED

For the car to move, engine power needs an unbroken route through the gearbox and other parts to the wheels. Treat the powertrain as a chain of devices and debug the connection before chasing performance numbers.

  1. Start from a working vehicle of a similar layout. In your own mod copy, list its engine, clutch, gearbox, driveshafts, differential, and driven wheels.
  2. Open the in-game Powertrain Visualization app. Confirm torque reaches the intended wheels and note the name and RPM shown for each device.
  3. Change one component at a time in your own JBeam. Keep the original device names and input/output names visible in your notes so you can trace every connection.
  4. Test at low speed first. Confirm the vehicle moves in the expected direction, reverse works, and the transmission does not produce obvious wind-up or disconnected wheels.
  5. Use the Torque Curve and Shift Point Debug apps to inspect engine output and automatic shifts. Do not tune shift points until the device chain is correct.
  6. Save a known-good version before changing ratios or torque. Recheck behavior with different gears, a reset, and a fresh game load.
Advanced challenge: Make a controlled drivetrain variant for your prototype, document its device chain, then capture the powertrain visualization and explain where torque goes in each gear.
Keep it manageable: Adapt a closely related vanilla setup and use it as a reference. A full engine or gearbox from a different layout may need supporting parts and matching connection names.
BeamNG: Powertrain Visualization and tuning debug apps ↗BeamNG: JBeam powertrain section overview ↗
▧
TRACK 04 · 5 LESSONS

Textures and Substance 3D Painter

Build a dependable BeamNG texture workflow, from UVs to in-game materials.

01Plan how textures wrap around your modelLay out texture pieces, name materials, and keep detail consistentBEGINNER

Before opening a painting app, decide what needs a texture and what can use a shared material. A tidy UV layout and clear material names save time in every later step.

  1. Apply your modeling scale and create seams in hidden or natural places before unwrapping.
  2. Unwrap the mesh, check for stretching, and pack islands with enough padding to avoid texture bleeding.
  3. Give similarly sized visible parts about the same amount of texture detail. Give important parts more texture space than tiny hidden details.
  4. Name the material and texture files with a unique project prefix. Keep source images in your mod’s own art folders.
  5. Start with base color and a neutral material check in BeamNG before adding detailed maps.
First texture: UV unwrap a simple metal toolbox. Make a color blockout and check it in game at close and driving distance.
BeamNG: Vehicle material examples and texture guidance ↗
02Try Substance 3D Painter for vehicle texturesCreate guide images from your model, paint details, and export texturesBEGINNER

Recommendation: Adobe Substance 3D Painter is a strong paid option for painting directly on a 3D model, building layer-based materials, and adding controlled wear. It is not required: a 2D image editor can handle simple liveries and hand-painted textures.

  1. Finish the UVs first and export the mesh with its named materials. Each material on the model can create a separate group of texture images, so only split them when there is a good reason.
  2. Create a Painter project from the mesh and choose a project template that matches the normal-map convention you plan to use.
  3. Create guide images from the model so Painter can place dirt and wear around edges and creases. Check the generated guide images. If there are strange marks, fix the model or texture layout instead of painting over them.
  4. Build layers from broad base materials to restrained dirt, edge wear, decals, and small details. Put dirt and worn paint where the vehicle would realistically get dirty or scratched.
  5. Use a custom export preset only after checking the output maps and channel packing against BeamNG’s material needs. Export PNG source textures and verify them in game.
First texture: Paint a simple service van door with a base color, a small logo, and subtle wear. Compare it in Painter and BeamNG so you can see the difference in lighting.
BeamNG: Material maps and examples ↗Adobe: Substance 3D Painter documentation ↗
03Set up texture groups for detailed vehicle partsPlan texture layouts, surface detail, material types, and game performanceADVANCED

Vehicle materials often have role-specific conventions. For example, BeamNG documents separate material types for body, interior, mechanical parts, lights, glass, and wraps. Follow the intended type instead of exporting one generic texture set for everything.

  1. Plan the first texture layout (UV0) for the main surface images and small raised-looking detail. For a car body, also plan the second texture layout used by paint skins, if you want skins to work.
  2. Set up separate Painter texture sets for materials that genuinely need different maps or resolution. Avoid splitting every small object into its own set.
  3. Choose image size based on how close players will get and how much of the screen the part fills. Power-of-two dimensions are common, but the best size depends on the asset and texture set.
  4. Export the main color image, surface-detail image, shine/matte setting, and any other needed images. Check which image channels Painter combines into each file. Confirm BeamNG’s expected channels before finalizing a preset.
  5. Use BeamNG’s material definitions and texture cooker conventions, then check the final in-game images and how much graphics memory they use.
Advanced challenge: Create a body texture set and a mechanical texture set for one vehicle part. Compare visual quality and memory cost at two resolutions.
BeamNG: Vehicle art material types and UV channels ↗
04Paint a reusable vehicle skinFit the paint design to the car and test it in the vehicle menuADVANCED

A reusable skin is more than a decal placed on a render. It needs a suitable vehicle wrap UV layout, a skin material definition, and a part that exposes the design in the vehicle selector.

  1. Confirm that the vehicle’s body material and UV layout support a wrap. Use the vehicle material guide to understand the intended UV channel.
  2. Build a livery in Painter or a 2D editor using the wrap layout as a guide. Keep logos and text away from seams and distorted areas.
  3. Use unique names for the skin material and JBeam part. Follow the skin system’s required slot conventions for the target vehicle.
  4. Check the exported image on the 3D car, not only the flat UV. Inspect panel transitions, mirrored areas, and text direction.
  5. Install the mod as a standalone package and test the livery on more than one vehicle configuration if the skin is intended to support them.
Advanced challenge: Create a two-color service livery with a roof number and door logo. Check both sides, hood, roof, and rear panel in game before release.
BeamNG: Vehicle skin system ↗
05Export textures that BeamNG can loadExport texture images, connect them to materials, and prepare game-ready filesADVANCED

Exporting the images is only one step; you also need to connect them to a material in the game. Keep your Painter project as the source, export the maps to your mod, and let BeamNG’s texture cooker create the game-ready DDS versions.

  1. Before painting, confirm the mesh UVs, material names, and texture resolution. Keep the project’s texture set names clear so the export files are easy to identify.
  2. In Substance 3D Painter, choose an export preset that matches the target workflow, then inspect the output template. Confirm which exported map is base color, normal, and packed data before using it.
  3. Save source maps with BeamNG’s expected suffixes, such as .color.png, .normal.png, and .data.png. Use simple filenames with no spaces.
  4. Reference the PNG paths in your own main.materials.json; do not point the material at a DDS filename. Confirm the material name matches your model’s material slot.
  5. Load the vehicle so the game can cook the textures. Check the console for conversion or path errors, then inspect the paint, normal detail, roughness, and color in several lighting conditions.
  6. For the release, include the cooked DDS files required by BeamNG and keep your editable Painter project and source PNGs in your development backup.
Advanced challenge: Export one small texture set, hook it up to a uniquely named material, confirm it cooks and displays correctly, then package the mod and check it in a clean install.
Painter tip: Presets can use different channel packing. Inspect the exported images before connecting them; never assume a map contains the channel you expect.
BeamNG: Texture naming, paths, and DDS cooking ↗BeamNG: Vehicle material examples ↗
⌘
TRACK 05 · 5 LESSONS

JBeam Deep Dive

Understand the structure behind deformation, collision, flexbodies, and reliable tuning.

01Understand how a vehicle’s physics structure holds togetherPhysics points, their links, their positions, and why braces matterBEGINNER

JBeam is a soft-body structure. Nodes are points with mass, beams connect them and resist changes in length, and triangles describe surfaces used for collision and aerodynamic effects. The visible 3D model sits over this physics structure; the model itself is not what holds the car together.

  1. Pick one simple vanilla part and trace its nodes, beams, triangles, and groups. Start with a small structural area rather than the whole vehicle.
  2. Use the vehicle coordinate system consistently: positive X is left, positive Y is backward, and positive Z is up. Mark the axes on a sketch before entering node coordinates.
  3. Check the node table header and units. Node positions are meters; node weight is mass in kilograms.
  4. Follow connections through the structure. A four-sided frame can lean sideways because its links can pivot at the corners. Add a diagonal brace to help it hold its shape.
  5. Separate groups by purpose so flexbodies and related parts can map to the nodes that should deform them.
Exercise: Build a small four-corner box structure, test it, then add one diagonal brace. Compare its stability and observe which beams take the load.
BeamNG: Introduction to soft-body JBeam ↗JBeam section reference ↗
02Make the visible model follow the vehicle physicsDeforming models, physics points, collision surfaces, and moving partsBEGINNER

A flexbody is the visible model that follows a group of physics points as they move or bend. A prop is a moving model part, such as a gauge needle. It follows a vehicle signal, but does not bend with the vehicle structure. Choosing the right representation avoids floating meshes and unnecessary physics cost.

  1. Find the node group that represents the panel or component. Confirm that the group exists and contains the expected nodes.
  2. Match the flexbody mesh name to the exported DAE object and bind it to the correct node group.
  3. Keep flexbody origins and transforms consistent with the vehicle. If the model’s center point is in the wrong place, the part can appear misplaced even when its shape is right.
  4. Add collision triangles only where the player or another vehicle needs meaningful contact. A visible model by itself does not stop other objects from passing through it.
  5. Use props for non-deforming animated parts such as needles, pedals, and steering wheel motion; give each prop valid reference nodes and an input electric.
Exercise: Make a simple hood mesh follow a small node group. Then create a gauge needle as a prop driven by an existing electric. Inspect both after a light crash.
BeamNG: Flexbodies and deform groups ↗BeamNG: Props and gauge needles ↗
03Tune beams with evidence, not guessworkMake links flex, settle, bend, or break using the debug viewsADVANCED

The settings for each physics link affect one another. Spring and damping influence elastic response; deformation and strength control when beams permanently deform or break; bounds limit how far a beam can compress or extend. Copying a value from an unrelated part rarely produces a sound structure.

  1. Write down the behavior you want and identify the smallest group of beams that could cause it.
  2. Establish a baseline and use one repeatable test. Change one property at a time, then run the same test again.
  3. Use beam stress, displacement, deformation, support-only, node-force, and stability debug views to find the actual failure path.
  4. Look for geometry issues before raising strength: precompressed beams, bad bracing, triangle clipping, incorrect groups, and overly dense collision can create instability.
  5. Record the test, changed values, and result. Check both expected deformation and failure behavior so “stronger” does not simply mean brittle or unnaturally rigid.
Advanced lab: Set up a repeatable low-speed frontal impact. Use stress and deformation views to identify the first weak path, fix one cause, and compare the resulting deformation to your baseline.
BeamNG: Beam properties and behavior ↗JBeam debug tools ↗
04Control damage and make sliding parts behave properlySet up damage, sliding contact, and sensible game performanceADVANCED

Advanced structures often need special collision or damage behavior. A deform group can change a material when a part bends. A break group can make connected parts fail together. Rails and slidenodes can add collision points that move along an edge. These features add complexity, so use them only to solve a demonstrated problem.

  1. Choose a narrow goal: for example, switch a lamp to a damaged material after its support deforms.
  2. Use the same group name on the links and visible model parts that should share this damage behavior. Test the trigger at the intended damage level.
  3. Use deformationTriggerRatio selectively. BeamNG flags this as a performance-sensitive property; avoid allowing it to leak into unrelated beams.
  4. For a part that needs sliding edge collision, study the official rails/slidenodes workflow. Keep collision nodes grouped separately and inspect their forces and stability.
  5. Check for self-collision, triangle clipping, shaking, and performance cost. Remove helper nodes or triangles that do not improve the result.
Advanced lab: Add a damaged material switch to a simple light assembly. Then use debug visualization to confirm exactly which beam activates it and that unrelated beams do not.
BeamNG: Advanced JBeam tips and collision workflows ↗
05Use collision surfaces correctly (they are not structural links)Which way a collision surface faces, what it hits, and how it affects dragADVANCED

JBeam triangles fill an area between three nodes. They can provide collision between JBeam nodes and contribute aerodynamic drag, but they are not structural braces and do not collide with the static world. Keep those jobs separate while you build.

  1. Start with a small test panel on your own prop or vehicle part. Make sure its three referenced nodes already exist and are named uniquely.
  2. Add a single triangle using the documented counter-clockwise node order. Load the vehicle and enable triangle debug view to see which side is facing forward.
  3. Test it against another JBeam object using very low speed. Remember: a coltri collides with nodes, not with other triangles or the static map.
  4. If objects phase through during hard contact, inspect which side faces the impact. Flip the triangle by swapping two node references, then test again.
  5. Only add triangles where they have a clear purpose. Compare behavior and performance before expanding a dense panel into many small triangles.
  6. If using triangles for aero, tune and test separately from collision. Their drag depends on airflow, surface area, and aerodynamic properties.
Advanced lab: Make a two-triangle panel with a shared edge, inspect both sides in debug view, and record what it collides with and what it does not collide with.
Important: Use beams for structural connection and triangles for surface collision/aero. A triangle alone does not stop the object from deforming.
BeamNG: Triangle collision and aerodynamics ↗BeamNG: JBeam debug tools ↗
⟲
TRACK 06 · 5 LESSONS

Vehicle Lua and Custom Gauges

Read vehicle signals, add small Lua-powered features, and build a boost gauge that fits the car.

01Check the car’s signals before writing codeFind boost and engine-speed signals and see how the built-in gauge reads themBEGINNER

BeamNG’s vehicle electrics are a signal bus used by JBeam, vehicle systems, props, and UI apps. The current electric list varies by vehicle. The built-in Force Induction app already shows boost in cars that have a turbo or supercharger, so use that first to confirm the signal and units.

  1. Spawn a turbocharged vehicle and add the Force Induction UI app. Compare its reading while the engine idles, while you rev it without moving, and while driving.
  2. Open the vehicle Lua console and inspect electrics with dump(electrics). Look for boost and boostMax.
  3. Check the official electrics reference for units; boost is reported in PSI. Do not assume every vehicle has the same signals or a forced-induction system.
  4. Check whether the signal is smoothed, then compare its quick changes with the slower movement shown on screen. If the gauge needle jumps around, smooth its reading instead of changing the turbo.
  5. Write down the source signal, unit, range, and what should happen when the engine is off or the vehicle has no boost signal.
Mini project: Make a one-page signal note for boost, RPM, throttle, and vehicle speed on one car. Record their units and which UI app can display them.
BeamNG: Vehicle electrics and signal units ↗
02Add a moving 3D boost needle to the dashboardDrive a 3D needle from boost without writing a UI appBEGINNER

A physical dashboard gauge is a great first “code-like” feature because the JBeam prop system can map an existing electric straight to a needle. No custom Lua is needed for this version.

  1. Model a dial and a separate needle in Blender. Place the needle pivot at its zero position and export both with clear mesh names.
  2. Choose the dashboard reference nodes for idRef, idX, and idY. They tell the game where the gauge sits and which way it faces. Place them at a right angle so the game can work out its direction.
  3. In the JBeam props table, set func to the boost electric and mesh to the needle mesh. Set min and max to the intended gauge range.
  4. Work out how far the needle must rotate to cover the numbers on the dial. For a 270-degree sweep across 0–30 PSI, start with 9 degrees per PSI; the axis and sign depend on your needle orientation.
  5. Set the offset so zero boost points at zero on the dial. Reload, check both endpoints, and verify the needle does not pass its stops.
Mini project: Add a 0–30 PSI needle to a turbo car. Test zero, mid-range, and near-maximum boost; tune orientation and offset before changing the range.
Prop row shape: ["boost", "needle_boost", "ref", "axis_x", "axis_y", {"x":0,"y":0,"z":0}, {"x":0,"y":0,"z":9}, {"x":0,"y":0,"z":0}, 0, 30, 0, 1]
Swap in your mesh and reference-node names; flip the rotation sign if your needle sweeps the opposite way.
BeamNG: Prop inputs, rotation math, and gauge examples ↗BeamNG: Built-in Force Induction gauge ↗
03Make your own digital boost displaySet up a BeamNG app that reads the car’s signals and refreshes its displayADVANCED

The digital display is a BeamNG app. Lua is separate code that runs inside the vehicle when you need to calculate or control something. BeamNG’s UI app guide uses AngularJS and a stream listener. Keep the display in the UI layer; add vehicle Lua only if you need a new signal or behavior.

  1. Create an app folder in Userfolder/ui/modules/apps/ with app.js, app.json, and a 250×120 app.png preview.
  2. Register an app directive, request the electrics stream with StreamsManager, and update the view from streamsUpdate.
  3. Read the boost values from the vehicle data feed. Check a built-in app from your game version to see the exact data names and format.
  4. Format PSI clearly, clamp the bar or needle to its designed range, and show a sensible idle or unavailable state when boost data is missing.
  5. Stop requesting vehicle data when the player closes the app. Add styling for readable contrast and test several window sizes.
App lifecycle: StreamsManager.add(streamsList) → listen for streamsUpdate → StreamsManager.remove(streamsList) on destroy.
Advanced project: Make a compact digital boost app with a numeric PSI readout, a colored range bar, and an overboost warning. Check behavior on a naturally aspirated car too.
BeamNG: Creating UI apps and listening to streams ↗BeamNG: Vehicle Lua, game Lua, and UI VMs ↗
04Create a new vehicle signal with JBeam or LuaSimple signal formulas, smoother readings, Lua files, and vehicle actionsADVANCED

Start with a JBeam custom electric for simple formulas. Move to a vehicle Lua extension when the behavior needs state, several update steps, a custom input, or logic that cannot fit in a formula.

  1. Confirm that the needed source electric exists on the target vehicle. Use a unique output name so your mod does not overwrite another value.
  2. For a simple derived signal, define a JBeam electrics.customValues entry. Example: ["jack_boost_bar", "electrics.boost * 0.0689476", 0] converts PSI to bar.
  3. If the value needs a gradual response, define a smoother for that custom electric and tune it by observing the display under a repeatable load.
  4. For stateful behavior, add a vehicle Lua extension under the vehicle’s lua/vehicle/ folder and expose only the callbacks or functions your mod needs.
  5. Keep vehicle-only APIs in the vehicle Lua VM. Use the UI VM for display code and the game Lua VM for global game or editor behavior; connect them through supported streams or hooks.
  6. Reload the vehicle after changes, inspect the output electric, and test reset, engine-off, missing-signal, and unsupported-vehicle cases.
Advanced project: Add a smoothed boost-in-bar value and display it beside PSI in your digital gauge. Then prototype a shift-light electric driven by RPM.
BeamNG: Custom electrics and smoothers ↗Vehicle Lua extensions and custom controls ↗
05Make a shift light that warns at high RPMUse Lua to switch a dashboard light on and off from a vehicle signalADVANCED

This project links a simple controller signal to a visible light. First decide what the signal means: for a beginner-friendly shift light, use a threshold you can test reliably, such as engine RPM relative to a chosen target. Keep the controller logic separate from the material that displays it.

  1. Copy a small, relevant controller example into your own vehicle mod and read its update/reset functions. Do not edit the game’s installed controller files.
  2. In the controller, calculate a clear 0 or 1 state from a value that exists on the vehicle. Give the electric a unique name and make sure the state is written every update.
  3. Add a small indicator material to your own model and define a glowmap that reads that electric. Start with only off and on materials, then confirm the material name matches the model exactly.
  4. Load the vehicle and inspect the electric using the vehicle debug apps. Temporarily use a low threshold so you can see the signal switch, then set the intended threshold.
  5. Check the lamp in daylight and darkness. If the signal changes but the lamp does not, debug the material name and glowmap separately from the Lua logic.
  6. Test after reset and with the engine off. Make sure the code resets the light to a known state and does not leave the lamp stuck on.
Advanced project: Build one shift light that turns on at your selected RPM, stays off when the engine is stopped, and resets correctly. Write down the signal name, source value, and threshold.
Build safely: BeamNG’s controller code and glowmap formats are version-sensitive. Copy a current vanilla example, keep a backup, and change one small piece at a time.
BeamNG: Vehicle controller basics ↗BeamNG: Glowmaps and electrics signals ↗
↔
TRACK 07 · 5 LESSONS

Step-by-Step Interactive Builds

Build practical moving parts: a fridge slide and a trigger-operated canopy door.

Download the editable starter kitTemplates are meant to be adapted to your vehicle. The included guide marks every name, node ID, position, and value to change.

Edit with: Visual Studio Code plus BeamNG’s JBeam extension. Use Blender for the DAE meshes, not the JBeam text. Then reload the vehicle and check the console and vehicle debug views in BeamNG.

BeamNG’s recommended JBeam editor setup ↗
01Build a manual fridge slide with railsBuild fixed rails, line up the sliding tray, and stop it at each endBEGINNER

This first build is a tray that can be pulled in and out by hand. Rails define the path and slidenodes constrain selected tray nodes to that path. They guide motion; they do not act as a motor.

  1. Block out a fixed cabinet frame and a separate moving tray. Keep the refrigerator as a separate mass or visual part so its weight can be tested.
  2. Place two straight, parallel rails on the fixed frame. Each rail needs at least two support nodes; extend the rails only as far as the intended travel.
  3. Add matching slide nodes to the tray structure. Position each node exactly on its rail at spawn and use multiple separated sliders so the tray cannot yaw easily.
  4. Define the rails and slidenodes in JBeam. Use capped rails so the tray stops at each end; start with a short travel and conservative forces.
  5. Connect the tray’s visible mesh to its own flexbody node group. Add only the collision nodes and triangles needed for the tray to meet the cabinet without snagging.
  6. Reload and inspect the Rails and Slidenodes debug view. Use the node grabber to move the tray slowly from one end of the rails to the other and watch for twist, shake, clipping, or detachment.
Build target: A tray that slides smoothly, stays level, cannot leave the rails, and still works after a gentle crash.
BeamNG: Rail and slidenode definitions ↗BeamNG: Rail and slidenode debug view ↗
02Make the fridge tray stay locked until you release the handleStop the tray wobbling or sticking, then add a working handleADVANCED

Once the basic tray works, add collision and a deliberate lock. Keep the latch separate from the rail constraint: the rails guide the tray, while the latch prevents unwanted travel when closed.

  1. Test the tray both with the refrigerator inside and with the tray empty. Add structural beams between slide nodes and the tray frame to control roll and yaw without rigidly attaching it to the cabinet.
  2. Add a few physics points along the front and sides so the tray can bump into nearby parts. Check for self-collision and use noncollidable triangles only where the anti-clip surface is needed.
  3. Make a latch with a clear locked and released state. Copy a suitable latch example from the original game files, or a small vehicle Lua controller if your latch needs its own state.
  4. Place a triggers2 box at the handle and connect its primary action to a *.interaction.json action that releases or re-engages the latch.
  5. Expose that action with actionsEnabled only when the slide part is installed. Keep the trigger volume small and place it where a player naturally reaches.
  6. Test the clickable handle, how far the tray slides, whether the lock holds, and what happens after resetting the car. Use the rail, force, and collision views to find what is making the tray shake or stick.
Advanced challenge: Make the tray stay locked during driving, click the handle to release it, pull it out by hand, then lock it again at the open stop. Check it on rough terrain.
Design note: A clickable trigger is a button, not a drag surface. Use it for the latch; let the physical slide and its rails handle the actual travel.
BeamNG: Collision stability and slidenode tips ↗BeamNG: Trigger actions and interaction maps ↗
03Make a hinged canopy door move safelyLine up the hinges, control the opening, and attach the moving door modelBEGINNER

A canopy door needs a straight hinge line and a powered part that opens and closes it. A torsion hydro swings a panel around its hinge when told to open or close it. A regular hydro pushes or pulls in a straight line. Prototype the movement before adding a trigger.

  1. Build the fixed canopy frame and separate moving door as their own node groups. Keep the visible panel mesh as a flexbody on the door group.
  2. Place a pair of hinge-axis nodes along the intended pivot line. Keep both hinges aligned so the door does not bind as it swings.
  3. Design the actuator lever points away from the hinge axis. Add a torsion hydro using the two lever ends and two axis nodes, with its travel limits set to the intended open angle.
  4. Use a test vehicle signal or temporary control to open and close the powered hinge. Tune the direction and rate; if it moves the wrong way, reverse the input factor.
  5. Add physical stops so the panel cannot travel through the frame. Check that the actuator does not push the panel through the vehicle body.
  6. Test slowly, then at normal simulation speed. Check the hinge nodes, beam stress, actuator limits, and panel deformation.
Build target: A single canopy panel that swings from closed to a safe open position, stays attached, and clears nearby roof parts.
BeamNG: Torsion hydros for openable panels ↗BeamNG: Hydro input, limits, and rates ↗
04Open and close the canopy from a clickable triggerAdd a clickable handle that tells the canopy door to open or closeADVANCED

Use the current triggers2 workflow: the trigger finds the handle, the interaction map defines the action, and the action changes an electric that drives the torsion hydro. This keeps the hitbox, action, and physical movement easy to debug separately.

  1. Create a unique electric name for the canopy state, such as jack_canopy. Set the torsion hydro’s inputSource to that electric and tune its open and closed behavior first.
  2. Add a triggers2 clickable area around the outside handle. Use the correct physics points to position it, then check that the game highlights it when you point at the handle.
  3. Create a vehicle *.interaction.json file. This file gives the clickable area its on-screen action. Set "fileversion": 2 and give the action its own unique ID. Use onDown to switch the canopy signal between 0 (closed) and 1 (open).
  4. Link the trigger’s action0 to that interaction action with triggerEventLinks2, and list the action in actionsEnabled.
  5. Optionally add an interior trigger linked to the same action so the canopy can be operated from both sides.
  6. Check the action title, trigger position, hydro direction, end stops, reset state, and damage behavior. Test with the canopy both open and closed during a light impact.
Toggle idea: electrics.values.jack_canopy = 1 - (electrics.values.jack_canopy or 0)
Use a unique signal name. The torsion hydro reads it through inputSource; set limits and auto-center behavior to suit your mechanism.
Advanced challenge: Make a highlighted exterior handle open the canopy, add a matching interior close trigger, and ensure the panel cannot open while a conflicting part is installed.
BeamNG: triggers2 and action links ↗BeamNG: Interaction map format and actionsEnabled ↗
05Add a safe canopy status lightUse the canopy’s signal to show when the door is openADVANCED

Your canopy already has an electric that changes when the trigger opens or closes it. Reuse that signal for a small status lamp so the interactive action and visual feedback stay connected.

  1. Make a backup of the working canopy starter before changing it. Confirm the existing canopy electric changes to 0 when closed and 1 when open.
  2. Add a small indicator mesh or material slot to your own canopy model. Give the material a unique name and keep the lamp away from the hinge and moving panel.
  3. Add a glowmap entry for that material. Use the canopy electric as its input, with the off material for 0 and the on material for 1.
  4. Load the vehicle and test the trigger. Open the canopy and check the lamp; close it and check that the lamp turns off.
  5. If the lamp shows the wrong state, first check the vehicle signal value and then check the glowmap input and material names. Change one item at a time.
  6. Test reset, vehicle reload, and both trigger locations. Ensure the lamp does not suggest the canopy is closed when it is still open.
Build target: The exterior indicator illuminates only while the canopy is open, updates from the same trigger action, and returns to the closed state after reset.
Keep the mechanism simple: The lamp reports the existing canopy state; it should not control or replace the actuator.
BeamNG: Glowmaps driven by electrics ↗BeamNG: triggers2 and action links ↗
J+

Build small, test often. These lessons cover BeamNG maps, vehicle parts, JBeam structure, vehicle signals, UI apps, and interactive builds. Use vanilla content as a learning reference, keep your work in a standalone mod folder, and test each change in game.