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.rotation.y = Math.PI / 2;
|
||||||
fender.position.set(wx, -0.62, wz);
|
fender.position.set(wx, -0.62, wz);
|
||||||
}
|
}
|
||||||
// Grille + headlamps seated INTO the bumper face (not floating
|
// Front mask: full-width fascia tying bumper, grille and
|
||||||
// above it): both overlap the bumper top edge.
|
// lamps into one nose. Overlaps bumper and hood sides so
|
||||||
const grille = add(new T.Mesh(new T.BoxGeometry(0.9, 0.16, 0.06), trimMat));
|
// nothing floats; every face interpenetrates, none coplanar.
|
||||||
grille.position.set(0, -0.2, -2.21);
|
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({
|
const lampMat = new T.MeshStandardMaterial({
|
||||||
color: new T.Color(0.1, 0.1, 0.12),
|
color: new T.Color(0.1, 0.1, 0.12),
|
||||||
emissive: new T.Color(0.75, 0.82, 1.0),
|
emissive: new T.Color(0.75, 0.82, 1.0),
|
||||||
emissiveIntensity: 2.0,
|
emissiveIntensity: 2.0,
|
||||||
roughness: 0.3,
|
roughness: 0.3,
|
||||||
});
|
});
|
||||||
|
const bezelGeo = new T.TorusGeometry(0.11, 0.025, 8, 20);
|
||||||
for (const side of [-1, 1]) {
|
for (const side of [-1, 1]) {
|
||||||
const lamp = add(new T.Mesh(new T.CircleGeometry(0.09, 16), lampMat));
|
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;
|
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(
|
const tail = add(new T.Mesh(
|
||||||
new T.BoxGeometry(1.2, 0.09, 0.05),
|
new T.BoxGeometry(1.2, 0.09, 0.05),
|
||||||
new T.MeshStandardMaterial({
|
new T.MeshStandardMaterial({
|
||||||
@@ -632,7 +652,16 @@ export const ride = {
|
|||||||
emissiveIntensity: 1.5,
|
emissiveIntensity: 1.5,
|
||||||
roughness: 0.4,
|
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
|
// Mirrors on stalks at the cabin front corners, stalks rooted
|
||||||
// in the cabin wall (not floating beside it).
|
// in the cabin wall (not floating beside it).
|
||||||
for (const side of [-1, 1]) {
|
for (const side of [-1, 1]) {
|
||||||
|
|||||||
Reference in New Issue
Block a user