I'm working on a track for the racing sim Assetto Corsa. My track is a section of California's Highway 1, and is around 35km (21.9mi) long.
My modeling process is to take a mesh, sized 10m along the Y axis and 1m along the X axis (with cuts made to increase the resolution along the Y axis to allow for a concave or convex road surface), array it along a curve, shrinkwrap it to a elevation model mesh (from CloudCompare), and laplacian smooth it to iron out the noise in the elevation model mesh. I can then add a displace modifier hooked to a cloud texture to add back some artificial noise on a smaller level.
Assetto Corsa uses a proprietary model format (.kn5), and the SDK/converter has a per-mesh limit of 65535 vertices. This means that I have to split my mesh up every 4000m or so to get it to import. My current solution uses a stupid amount of modifiers and vertex transfer planes to work around the problems of not having a connected mesh:
The Array and Curve modifiers duplicate the road mesh along the road's centerline curve.
TransferNonSWArea transfers in a vertex group indicating the areas where the elevation model is inaccurate, and the track should not be shrinkwrapped.
TransferStartWelder transfers in a vertex group consisting of a manually-placed mesh over the overlap of the previous and current track segments.
TransferEndWelder transfers in a vertex group consisting of a manually-placed mesh over the overlap of the current and next track segments.
TransferWeldSmoothFix transfers in a vertex group consisting of the previous track segment to indicate where the mesh should not be smooth, lest it create a smoothing artifact around the join point.
ShrinkwrapToDEM project-shrinkwraps the entire current mesh to the elevation model, except for the vertex group area imported by the TransferNonSWArea modifier.
ShrinkwrapToPrevSurface shrinkwraps the vertices of the current mesh with the vertex group imported in TransferStartWelder to the nearest vertices of the previous track segment.
LaplacianSmooth smooths the entire current mesh, except for the vertex group area imported by the TransferEndWelder modifier.
Displace adds a very small magnitude of random vertical noise.
MaskOverlapToPreviousPiece hides the vertices in the overlap area to the previous track segment to avoid texture clipping issues.
ShrinkwrapToPrevSurfacePostMask shrinkwraps the vertices of the current mesh with the vertex group imported in TransferStartWelder to the nearest vertices of the previous track segment again in order to fix a slight misalignment issue.
This whole process ensures the track segments join seamlessly, avoiding Laplacian edge smoothing artifacts present in previous join attempts.
Even with all of those modifiers, the track join point can still be felt in-sim, but can be written off as a normal feature of the road surface.
So far, I have modeled the road surface for around 35% of the track, and I already need four separate objects, all of which's modifiers are unlinked to each other, meaning if I need to change the smoothing value on the entire track, I have to change it on each modifier. In addition, having multiple track segments will make connecting the grass/terrain mesh to the track a nightmare that I would like to save for another question. As well, creating a new segment is annoying due to manually relinking the welder planes and updating other references manually.
My question today is this:
Is it possible, whether in stock Blender or with an addon or script, to split one monolithic track mesh into adequately sized pieces based on their distance along the track, in such a way that I can still apply modifiers across all of them, without having to apply all the modifiers each time and then manually select and split the mesh in Edit Mode? (I mean, Blender is extensible enough that it's probably possible, but I don't know of any addon that does this, and if none exists and one has to be written, I would appreciate any help I could get on writing it.)
I'd upload the .blend, but it's multiple gigabytes on account of the elevation data model. I'd be happy to answer any questions in the comments.
P
. $\endgroup$