Quick answer: Set the SplineMeshComponent’s Forward Axis to whichever axis the mesh is modeled along (X by default). Then feed correct local-space start/end positions and tangents per segment.

A road mesh laid along a spline pinches, twists, or stretches the wrong way. The forward axis or the tangents don’t match the mesh.

Forward Axis Must Match the Mesh

SplineMeshComponent deforms the mesh along its Forward Axis (default X). If your road segment was modeled running along Y, the deformation happens along the wrong axis — set Forward Axis to Y.

Per-Segment Start/End

for (int32 i = 0; i < Spline->GetNumberOfSplinePoints() - 1; i++)
{
    FVector StartPos, StartTan, EndPos, EndTan;
    Spline->GetLocalLocationAndTangentAtSplinePoint(i, StartPos, StartTan);
    Spline->GetLocalLocationAndTangentAtSplinePoint(i + 1, EndPos, EndTan);
    SplineMesh->SetStartAndEnd(StartPos, StartTan, EndPos, EndTan);
}

Use the local location/tangent functions — the SplineMeshComponent works in the spline’s local space. Feeding world-space values is the classic cause of wild deformation.

Tangent Length Matters

The tangent isn’t just a direction — its length controls the curve’s “pull”. Zero-length or wildly long tangents pinch or balloon the segment. Use the spline’s own tangents; don’t normalize them.

Roll and Up Vector

For banked roads, set the start/end roll (SetStartRoll / SetEndRoll) from the spline’s rotation, or the mesh won’t bank into turns.

Verifying

The road follows the spline smoothly — no pinching at points, correct orientation through curves, banking into turns.

“Forward axis matches the mesh; start/end use local tangents at full length. Get those right and deformation is clean.”

Model spline meshes along +X, one segment long — it makes Forward Axis = X ‘just work’ and keeps every spline tool consistent.