Size and density aren't even really needed. You just need one factor: Weight.
Size isn't important because we're on a resolution of 'per tile' here. If a lamp post or a brick wall impact against a vehicle's armor tile, it's still dealing damage to that specific tile. Size is actually irrelevant.
Density isn't important because size isn't important. Density is a factor of weight and size, and without size density means nothing.
Weight, durability, and ability to move are all you really care about. As soon as a vehicle impacts an item, it's weight * speed = damage, dealing to the vehicle and the obstacle. If the obstacle is obliterated, the the vehicle continues moving. If the obstacle is intact, see if it can be pushed aside. If it can, then apply a thrust to send it flying away. If it's stationary, then apply damage again at a reduced rate, since it can't cope with the impact, maybe 1/2 or 1/3 of the original damage to the item and the vehicle. If the item is obliterated, the vehicle continues with the lowered speed and the damage. If the obstacle is still intact, then the vehicle stops.
So a few examples?
The vehicle is roughly shaped as a common car, with Hard Plating on the front, making it durable enough to survive every impact.
Hitting a 20 pound bush at 20mph - the 20 speed * 20 weight = 40 damage - 20 is dealt to the bush and 20 is dealt to the vehicle. This is enough to destroy the bush, so the vehicle continues with a small dent.
Hitting a 30 pound shopping cart at 20mph - 20 speed * 30 weight = 60 damage - 30 to vehicle 30 to cart. The cart is very weak, and the impact totally destroys it, so the vehicle continues with a slightly larger dent.
Hitting a 150 pound motorcycle at 20mph - 3,000 damage, 1,500 to vehicle 1,500 to bike. The bike survives the impact, and because it's mobile it's sent flying away, so the vehicle continues with a rather large dent.
Hitting a 100 pound boulder at 20mph - 1,000 damage to vehicle and 1,000 to boulder. The boulder survives the initial impact, but because it's rooted to the ground it does damage again, dealing an extra 500 damage to the vehicle and the boulder, which destroys the boulder and lets the vehicle continue traveling with as much damage as if it had hit the bike.
Hitting a 500 pound brick wall at 20mph - 5,000 damage to both. The wall survives the initial impact, so an additional 2,500 damage is dealt, but the wall STILL survives, leaving the car stopped forcefully and probably crippled.
These are all, of course, fake numbers and estimations of ideas, but terrain tiles already have their hardness coded in, which is why it's easier to break a window than to break a countertop. Tiles cannot be 'damaged' they're either destroyed or not, so the 'damage' could be 'durability threshold' and if the total impact isn't enough to break it, then it's intact and undamaged.
Vehicles would also need to be given damage reduction values based on the type of tile - a tire takes full damage, a steel frame takes -5 damage, a board takes -10, adding steel armor stacks an additional -20, hard plating stacks an additional -50... So if 100 damage is dealt to a board covered in hard plating, then it's 100 (damage) - 10 (board) - 50 (armor) for a total of 40 damage actually dealt. This was a reasonably fortified vehicle would be able to mow through small trees and zombies, while a civilian car would have trouble handling shrubs.
Right now, all armor takes full damage from every source, and zombies end up ripping through 3 inches of steel plate with their bare hands. Adding damage reduction would fix SO MANY vehicle issues.