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:
@@ -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]) {
|
||||
|
||||
Reference in New Issue
Block a user