I am trying to create a traffic simulator but I am having trouble finding a good way to steer my vehicles around corners. The world is basically a 2D tile map where the corners/vertices of each tile can have different height, so basically a tessellated plane with heightmap. The vehicles driving the map are full 3D. Roads can just be laid out on flat tiles or straight slopes. See the picture below for reference (A orthogonal top view would look like this), the red and green lines represent the lanes and the path vehicles should follow.

Pathfinding is already solved but I am wondering what a good solution would be to move the vehicles and interact with them.
- A simple approach would be to just rotate them at the corner, as for the reference above, by putting the origin in the bottom right of the corner tile and rotate the whole model clockwise. The problem is that I want to have different types of roads, and perhaps tracks that span multiple tiles which makes this difficult. Also, when the map raises in height, instead of a smooth curve there will be a corner, the tiles just consist of 2 triangles. I don't want the vehicles front part to clip trough the next tile which could be a maximum 45 degree slope.
- Curves sound like a good solution. but I cannot get any good results with my attempts. In theory I would place the origin at the rear wheels and place that on the curve. Then I could calcluate it\s rotation by looking up the position on the curve where the front wheels would be.
The issue I have with curves is finding the right type of curve.
- Catmull Rom seems the way to go since it spaces out it's points evenly, allowing me to move at the proper speed over the curve. But I just can't get the curve over the roads properly.
- Bezier curves cannot be combined/merged properly afaik and it is not guaranteed that 0.1 to 0.2 has the same distance as 0.4 to 0.5 on the curve. Which brings me to same hacky solutions as the simple approach.
Another problem is the curves need to have both smooth transitions like the corners but when the road changes in height it needs to be a corner. Each tile consists just of 2 triangles.
And finally what is a good way to move and rotate a model over a curve. Do I need to hardcode where the wheels are and place it on the curve based on those values?
Eventually I want different types of roads and perhaps trains on rails that span multiple tiles so a solution that can handle that would be preferable. I also need changing lanes but this has proven too difficult to solve to even start thinking about that. A lot of games seem to have found a solution to my problem from Transport Tycoon to Cities Skylines I just cannot find the right information on the topic and it feels like I am reinventing the wheel here. I hope someone can point me in the right direction.

