fix: Align planar UV projection with GLTF spec to fix upside-down textures
Build and Deploy / build-and-push (push) Successful in 1m14s
Build and Deploy / build-and-push (push) Successful in 1m14s
This commit is contained in:
@@ -33,7 +33,7 @@ export function reprojectUVs(geometry: THREE.BufferGeometry, mappingType: 'plana
|
||||
if (mappingType === 'planar') {
|
||||
// Front planar projection
|
||||
u = nx;
|
||||
v = ny;
|
||||
v = 1.0 - ny;
|
||||
} else if (mappingType === 'cylinder') {
|
||||
// Cylindrical projection
|
||||
const centeredX = x - center.x;
|
||||
@@ -41,7 +41,7 @@ export function reprojectUVs(geometry: THREE.BufferGeometry, mappingType: 'plana
|
||||
// atan2 returns -PI to PI. We want 0 to 1 around the cylinder.
|
||||
let angle = Math.atan2(centeredZ, centeredX);
|
||||
u = (angle + Math.PI) / (2 * Math.PI);
|
||||
v = ny;
|
||||
v = 1.0 - ny;
|
||||
} else if (mappingType === 'sphere') {
|
||||
// Spherical projection
|
||||
const centeredX = x - center.x;
|
||||
@@ -53,7 +53,7 @@ export function reprojectUVs(geometry: THREE.BufferGeometry, mappingType: 'plana
|
||||
let theta = Math.atan2(centeredZ, centeredX); // -PI to PI
|
||||
|
||||
u = (theta + Math.PI) / (2 * Math.PI);
|
||||
v = 1.0 - (phi / Math.PI);
|
||||
v = phi / Math.PI; // 0 at top, 1 at bottom
|
||||
} else if (mappingType === 'box') {
|
||||
// Simple box projection (pick dominant axis based on normal)
|
||||
// This requires normals
|
||||
@@ -65,11 +65,11 @@ export function reprojectUVs(geometry: THREE.BufferGeometry, mappingType: 'plana
|
||||
}
|
||||
const ax = Math.abs(normX), ay = Math.abs(normY), az = Math.abs(normZ);
|
||||
if (ax > ay && ax > az) {
|
||||
u = nz; v = ny;
|
||||
u = nz; v = 1.0 - ny;
|
||||
} else if (ay > ax && ay > az) {
|
||||
u = nx; v = nz;
|
||||
u = nx; v = 1.0 - nz;
|
||||
} else {
|
||||
u = nx; v = ny;
|
||||
u = nx; v = 1.0 - ny;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,7 +128,7 @@ export function bakeTextureToNewUVs(
|
||||
vOldUV = uv2;
|
||||
|
||||
float finalX = mix(uv.x * 2.0 - 1.0, 1.0 - uv.x * 2.0, uFlipX);
|
||||
float finalY = mix(uv.y * 2.0 - 1.0, 1.0 - uv.y * 2.0, uFlipY);
|
||||
float finalY = mix(1.0 - uv.y * 2.0, uv.y * 2.0 - 1.0, uFlipY);
|
||||
|
||||
gl_Position = vec4(finalX, finalY, 0.0, 1.0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user