Adjust junction mesh generation to account for transition UV distance at road mouth segments

This commit is contained in:
2026-05-13 18:32:10 +02:00
parent 808bdf5896
commit d1523600b8

View File

@@ -294,6 +294,19 @@ export function buildSplineCorridorJunctionEdgeMeshData(options: {
return rowOffset;
}
function getTransitionUvDistance(
firstNormal: { x: number; z: number },
secondNormal: { x: number; z: number }
): number {
return Math.max(
0.01,
Math.hypot(
(firstNormal.x - secondNormal.x) * options.edge.width,
(firstNormal.z - secondNormal.z) * options.edge.width
)
);
}
for (let pointIndex = 0; pointIndex < footprint.points.length; pointIndex += 1) {
if (isRoadMouthSegment(footprint.points, pointIndex)) {
continue;
@@ -325,10 +338,17 @@ export function buildSplineCorridorJunctionEdgeMeshData(options: {
if (isRoadMouthSegment(footprint.points, previousSegmentIndex)) {
if (currentPoint.connectionOutwardAxis !== undefined) {
const transitionUvDistance = getTransitionUvDistance(
currentPoint.connectionOutwardAxis,
segmentOutwardNormal
);
const seamRow = pushProfileRow({
point: currentPoint,
outwardNormal: currentPoint.connectionOutwardAxis,
perimeterDistance: perimeterDistances[pointIndex]!
perimeterDistance: Math.max(
0,
perimeterDistances[pointIndex]! - transitionUvDistance
)
});
addProfileStrip({
@@ -349,10 +369,14 @@ export function buildSplineCorridorJunctionEdgeMeshData(options: {
if (isRoadMouthSegment(footprint.points, nextSegmentIndex)) {
if (nextPoint.connectionOutwardAxis !== undefined) {
const transitionUvDistance = getTransitionUvDistance(
segmentOutwardNormal,
nextPoint.connectionOutwardAxis
);
const seamRow = pushProfileRow({
point: nextPoint,
outwardNormal: nextPoint.connectionOutwardAxis,
perimeterDistance: perimeterDistances[pointIndex + 1]!
perimeterDistance: perimeterDistances[pointIndex + 1]! + transitionUvDistance
});
addProfileStrip({