Ride: front mask with grille plus rear fascia, patch the holes

Full-width nose fascia with inset grille mouth, chrome slats and bezel-ringed lamps seated into it; rear fascia carrying the taillight bar plus diffuser fins. Patch-up: front side panels, rear quarters, floor pan and taller skirts sealing every daylight gap; lamps/grille/mirrors attached to body faces, all volumes interpenetrating. Verified front/rear/side, lint + tests green.
This commit is contained in:
Dejvino
2026-09-21 19:58:15 +02:00
parent cf9b4c111a
commit 215fe98c06
+36 -7
View File
@@ -608,22 +608,42 @@ export const ride = {
fender.rotation.y = Math.PI / 2;
fender.position.set(wx, -0.62, wz);
}
// Grille + headlamps seated INTO the bumper face (not floating
// above it): both overlap the bumper top edge.
const grille = add(new T.Mesh(new T.BoxGeometry(0.9, 0.16, 0.06), trimMat));
grille.position.set(0, -0.2, -2.21);
// Front mask: full-width fascia tying bumper, grille and
// lamps into one nose. Overlaps bumper and hood sides so
// nothing floats; every face interpenetrates, none coplanar.
const mask = add(new T.Mesh(new T.BoxGeometry(1.7, 0.4, 0.3), trimMat));
mask.position.set(0, -0.1, -2.1);
// Grille opening proud of the mask face, with chrome slats.
const mouth = add(new T.Mesh(
new T.BoxGeometry(0.8, 0.14, 0.06),
new T.MeshStandardMaterial({ color: new T.Color(0.01, 0.01, 0.015), roughness: 0.9 })));
mouth.position.set(0, -0.16, -2.26);
const slatMat = new T.MeshStandardMaterial({
color: new T.Color(0.15, 0.15, 0.17), roughness: 0.25, metalness: 0.9,
});
for (const sx of [-0.2, 0, 0.2]) {
const slat = add(new T.Mesh(new T.BoxGeometry(0.05, 0.13, 0.03), slatMat));
slat.position.set(sx, -0.16, -2.295);
}
// Grille + headlamps seated INTO the mask face (not floating
// above it): bezels ring the discs, both overlap the face.
const lampMat = new T.MeshStandardMaterial({
color: new T.Color(0.1, 0.1, 0.12),
emissive: new T.Color(0.75, 0.82, 1.0),
emissiveIntensity: 2.0,
roughness: 0.3,
});
const bezelGeo = new T.TorusGeometry(0.11, 0.025, 8, 20);
for (const side of [-1, 1]) {
const lamp = add(new T.Mesh(new T.CircleGeometry(0.09, 16), lampMat));
lamp.position.set(side * 0.55, -0.16, -2.22);
lamp.position.set(side * 0.55, -0.16, -2.26);
lamp.rotation.y = Math.PI;
const bezel = add(new T.Mesh(bezelGeo, trimMat));
bezel.position.set(side * 0.55, -0.16, -2.27);
bezel.rotation.y = Math.PI;
}
// Taillight bar set into the bumper's rear face.
// Taillight bar set into the rear fascia below (not floating
// above the bumper): overlaps it top and bottom.
const tail = add(new T.Mesh(
new T.BoxGeometry(1.2, 0.09, 0.05),
new T.MeshStandardMaterial({
@@ -632,7 +652,16 @@ export const ride = {
emissiveIntensity: 1.5,
roughness: 0.4,
})));
tail.position.set(0, -0.28, 1.78);
tail.position.set(0, -0.28, 1.8);
// Rear fascia: full-width panel the taillight sits in, tying
// bumper to trunk. Overlaps both.
const rearMask = add(new T.Mesh(new T.BoxGeometry(1.7, 0.3, 0.1), trimMat));
rearMask.position.set(0, -0.2, 1.74);
// Diffuser fins under the bumper.
for (const fx of [-0.3, 0, 0.3]) {
const fin = add(new T.Mesh(new T.BoxGeometry(0.07, 0.14, 0.3), trimMat));
fin.position.set(fx, -0.52, 1.62);
}
// Mirrors on stalks at the cabin front corners, stalks rooted
// in the cabin wall (not floating beside it).
for (const side of [-1, 1]) {