This document describes groundmodels.json, the file format used to define physical surface behavior in BeamNG.
Ground models describe how tires, wheels, props, and other physics objects interact with surfaces such as asphalt, gravel, sand, mud, snow, grass, or water-like materials.
They affect:
The common/global ground model file is:
/art/groundmodels.json
Levels can add or override ground models with JSON files inside:
levels/<levelName>/groundModels/*.json
During level load, the engine:
/art/groundmodels.json
groundModels/*.json
Level files can override common ground models by using the same name.
A ground model file is a JSON object where each key is the ground model name.
Example:
{
"asphalt_special": {
"roughnessCoefficient": 0,
"staticFrictionCoefficient": 1.0,
"slidingFrictionCoefficient": 0.9,
"hydrodynamicFriction": 0.01,
"stribeckVelocity": 6,
"strength": 1,
"collisiontype": "ASPHALT",
"fluidDensity": 200,
"flowConsistencyIndex": 10000,
"flowBehaviorIndex": 0.5,
"dragAnisotropy": 0,
"skidMarks": true,
"defaultDepth": 0,
"shearStrength": 0
}
}
Ground model names are converted to uppercase when loaded.
Example:
"asphalt_special": {}
becomes:
ASPHALT_SPECIAL
Names longer than 31 characters are truncated.
A ground model can define aliases:
{
"asphalt_special": {
"aliases": ["road_special", "tarmac_extra"],
"staticFrictionCoefficient": 1.0,
"slidingFrictionCoefficient": 0.9
}
}
This registers multiple names for the same ground model data:
ASPHALT_SPECIAL
ROAD_SPECIAL
TARMAC_EXTRA
Aliases are useful when different systems, terrain materials, or older content use different names for the same surface behavior.
| Field | Type | Default | Description |
|---|---|---|---|
aliases |
array[string] | [] |
Additional names for this ground model. |
roughnessCoefficient |
number | 0 |
Surface roughness used by physics interaction. |
defaultDepth |
number | 0 |
Default surface depth, used for deformable/soft terrain behavior. |
staticFrictionCoefficient |
number | 1 |
Static friction coefficient. Affects grip before sliding. |
slidingFrictionCoefficient |
number | 0.7 |
Sliding/dynamic friction coefficient. Affects grip while sliding. |
hydrodynamicFriction |
number | 0.01 |
Resistance from fluid-like/deformable ground behavior. |
stribeckVelocity |
number | 6 |
Velocity parameter for friction transition behavior. |
strength |
number | 1 |
Surface strength/resistance. |
collisiontype |
string | 0 |
Particle/collision material name. Resolved through the particle material table. |
fluidDensity |
number | 200 |
Density used for fluid-like ground interaction. |
flowConsistencyIndex |
number | 10000 |
Flow consistency parameter for non-Newtonian/deformable surfaces. |
flowBehaviorIndex |
number | 0.5 |
Flow behavior parameter for non-Newtonian/deformable surfaces. |
dragAnisotropy |
number | 0 |
Directional drag anisotropy. |
skidMarks |
bool | false |
Whether this surface can create skid marks. |
shearStrength |
number | 0 |
Shear strength of the surface. |
The loader detects some old misspelled fields and logs errors.
Use:
"hydrodynamicFriction"
not:
"hydrodnamicFriction"
Use:
"flowBehaviorIndex"
not:
"flowBehaviourIndex"
The old names may still be read for compatibility, but they should be fixed.
Unknown attributes are ignored and logged as errors.
Example:
Unknown ground model attribute: myCustomValue - IGNORED
Only supported fields should be used.
Controls grip when the tire/contact patch is not sliding.
Higher values generally mean more grip.
Example:
"staticFrictionCoefficient": 1.0
Controls grip while sliding.
Example:
"slidingFrictionCoefficient": 0.8
Usually this is lower than static friction.
roughnessCoefficient controls physical roughness of the surface.
Example:
"roughnessCoefficient": 0.05
Rougher surfaces can make driving feel bumpier or less smooth, depending on vehicle and tire interaction.
defaultDepth is used for ground models that represent soft or deformable surfaces.
Example:
"defaultDepth": 0.15
This is useful for:
These fields control more advanced fluid-like or deformable ground behavior:
"fluidDensity": 800,
"flowConsistencyIndex": 12000,
"flowBehaviorIndex": 0.6,
"hydrodynamicFriction": 0.05
They are useful for surfaces such as:
collisiontype links the ground model to a particle/collision material name.
Example:
"collisiontype": "DIRT"
The value is resolved through the particle materials table.
This can affect effects such as:
skidMarks controls whether skid marks are allowed on this ground model.
Example:
"skidMarks": true
Typical usage:
| Surface | skidMarks |
|---|---|
| Asphalt | true |
| Concrete | true |
| Dirt | depends |
| Grass | usually false |
| Water | false |
Levels can override or add ground models by placing JSON files in:
levels/<levelName>/groundModels/
Example:
levels/example/groundModels/wet_surfaces.json
{
"wet_asphalt": {
"aliases": ["rain_asphalt"],
"staticFrictionCoefficient": 0.75,
"slidingFrictionCoefficient": 0.55,
"roughnessCoefficient": 0.01,
"hydrodynamicFriction": 0.03,
"collisiontype": "ASPHALT",
"skidMarks": true
}
}
Level files are merged after the common file, so they can replace common definitions if they use the same name.
Terrain materials can reference a ground model using:
groundmodelName
Example terrain material field:
"groundmodelName": "grass"
When a vehicle drives over terrain using that material, the corresponding ground model controls the physical surface behavior.
Materials can also define ground/collision behavior through their physical material settings, depending on object type and collision setup.
For terrain specifically, TerrainMaterial.groundmodelName is the important link.
Ground models are loaded during mission start.
They can also reload when one of the loaded ground model JSON files changes. When that happens, the environment system reloads ground models and collision may be reloaded so the new values take effect.
{
"asphalt_special": {
"aliases": ["road_special", "tarmac_extra"],
"roughnessCoefficient": 0,
"staticFrictionCoefficient": 1.0,
"slidingFrictionCoefficient": 0.9,
"hydrodynamicFriction": 0.01,
"stribeckVelocity": 6,
"strength": 1,
"collisiontype": "ASPHALT",
"fluidDensity": 200,
"flowConsistencyIndex": 10000,
"flowBehaviorIndex": 0.5,
"dragAnisotropy": 0,
"skidMarks": true,
"defaultDepth": 0,
"shearStrength": 0
},
"mud_deeper": {
"aliases": ["deep_mud"],
"roughnessCoefficient": 0.15,
"defaultDepth": 0.25,
"staticFrictionCoefficient": 0.55,
"slidingFrictionCoefficient": 0.35,
"hydrodynamicFriction": 0.08,
"stribeckVelocity": 4,
"strength": 0.4,
"collisiontype": "MUD",
"fluidDensity": 900,
"flowConsistencyIndex": 15000,
"flowBehaviorIndex": 0.6,
"dragAnisotropy": 0,
"skidMarks": false,
"shearStrength": 0.2
}
}
skidMarks only where marks make sense.defaultDepth and fluid/deformable parameters for soft terrain.Possible causes:
groundmodelNameThe JSON contains an unsupported field. Remove or rename it.
Replace old typo fields:
hydrodnamicFriction → hydrodynamicFriction
flowBehaviourIndex → flowBehaviorIndex
Lower:
"staticFrictionCoefficient"
"slidingFrictionCoefficient"
Reduce:
"defaultDepth"
"hydrodynamicFriction"
"fluidDensity"
"flowConsistencyIndex"
Check:
"skidMarks": true
and verify that the material/ground interaction supports skid marks.
groundmodels.json defines physical surface behavior.
It controls how vehicles and physics objects interact with surfaces through friction, roughness, depth, drag, particle collision type, and skid mark settings.
The common file is loaded first:
/art/groundmodels.json
Level-specific overrides are loaded from:
levels/<levelName>/groundModels/*.json
Ground models are linked to terrain through TerrainMaterial.groundmodelName.
Was this article helpful?