Well it is a 2D engine. You want it to work as a 3D engine.
When you move a Sprite with an X and Y vector, then whats under that sprite is depth, or Z.
Density, Friction, and Plasticity is about interaction with objects in the XY plane, not Z.
But. You can do this. You need to detect what it is overlapping. If they are different sprites, give them an instance variable 'Friction'. How more the value in it, how more the slow down. Value should range from 1 to 5 or so.
If they are different sprites, you need a Family to group them in 1 'is overlapping' event.
If they are instances of a sprite, you best write the value of that instance variable 'on start up' depending on the animation frame.
If it is a tilemap, it will be easier to use a lookup table(in the form of an array) with X-index = Tile index, and the slow down value on the Y-index (x,1).
For sprites.
(Tank) is overlapping (ground)
_____ (Tank) Set linear damping ... to Sprite.Friction
For a tilemap.
Pick the Tank somehow
_____ (Tank) Set linear damping ... to ... Array.at( (Tilemap.TileAt(Tank.X, Tank.y)) , 1) .. assuming that X=index = tile index, and y=1 is that slow down value. The array is a lookup table, you use it to translate a value (stored on X) to a paired up value (stored on Y).
An excellent scheme, will definitely use when work will begin on different ground types.