← CiudadObjeto 3Dfogon/hidrante
Hidrante
Arrastrá para girarlo// «Hidrante» · gpt-6-sol (medium)
// A chunky red fire hydrant standing on the sidewalk: a short thick cylinder with a domed cap on top, a wider flange ring near the bottom, and two side outlet nozzles with chained caps pointing left and right, plus a bigger front outlet facing -y. Bright red with darker red shading and silver bolts.
// A little stretch of Buenos Aires sidewalk and its bright red hydrant.
box(3, 3, 0, 44, 43, 2, "#555b60");
// Asphalt, concrete curb, and large paving slabs.
box(3, 3, 2, 44, 9, 2, "#62686b");
box(3, 10, 2, 44, 43, 3, "#a8aaa5");
box(3, 10, 4, 44, 11, 4, "#d6d2c6");
for (const [x0, x1] of [[4, 22], [24, 43]]) {
for (const [y0, y1] of [[13, 25], [27, 42]]) {
box(x0, y0, 4, x1, y1, 4, "#d4d1c7");
}
}
for (let i = 0; i < 170; i++) {
const x = 4 + Math.floor(rand() * 40);
const y = 12 + Math.floor(rand() * 31);
if (get(x, y, 4) === "#d4d1c7")
set(x, y, 4, rand() < 0.5 ? "#c7c7bf" : "#e0ddd2");
}
// A few painted curb sections and road markings.
for (let x = 4; x <= 44; x += 8)
box(x, 10, 3, Math.min(x + 3, 44), 10, 4, "#e9bc48");
box(7, 5, 2, 15, 5, 2, "#e4d5a3");
box(33, 5, 2, 40, 5, 2, "#e4d5a3");
// Heavy bolted foot and flared lower body.
cylinder(24, 24, 5, 12, 3, "#9f2525");
cylinder(24, 24, 8, 12, 2, "#e03a33");
cylinder(24, 24, 10, 10, 3, "#bb2928");
cylinder(24, 24, 12, 9, 20, "#d73530");
cylinder(24, 24, 29, 10, 3, "#ad2525");
// Rounded cap, with a crisp bright rim and top button.
cylinder(24, 24, 32, 9, 2, "#ed473c");
ellipsoid(24, 24, 33, 9, 9, 6, "#db3832");
cylinder(24, 24, 38, 3, 2, "#b92b28");
cylinder(24, 24, 40, 2, 2, "#ef5143");
// Subtle highlights and irregular paint on exposed red faces.
forEach((x, y, z, color) => {
if (color === "#d73530" && get(x, y - 1, z) === undefined) {
if (rand() < 0.16) set(x, y, z, "#e14338");
else if (rand() < 0.07) set(x, y, z, "#c42c2a");
}
if (color === "#db3832" && get(x, y, z + 1) === undefined && rand() < 0.38)
set(x, y, z, "#f05243");
});
// Side outlets: stout pipes, collars, and distinct capped ends.
cylinder(9, 24, 23, 4, 9, "#ad2928", "x");
cylinder(31, 24, 23, 4, 10, "#ad2928", "x");
cylinder(11, 24, 23, 6, 2, "#ee493d", "x");
cylinder(36, 24, 23, 6, 2, "#ee493d", "x");
cylinder(7, 24, 23, 6, 4, "#bc2a29", "x");
cylinder(39, 24, 23, 6, 4, "#bc2a29", "x");
cylinder(6, 24, 23, 5, 2, "#e33c34", "x");
cylinder(42, 24, 23, 5, 2, "#e33c34", "x");
// Raised fastening knobs on the two outer cap faces.
for (const x of [5, 43]) {
for (const [dy, dz] of [[-4, 0], [4, 0], [0, -4], [0, 4]])
box(x, 24 + dy, 23 + dz, x, 24 + dy + 1, 23 + dz + 1, "#c5c9c5");
box(x, 23, 22, x, 25, 24, "#982321");
}
// The larger outlet projects toward the viewer.
cylinder(24, 13, 23, 5, 7, "#ad2928", "y");
cylinder(24, 11, 23, 7, 3, "#ef483a", "y");
cylinder(24, 8, 23, 7, 3, "#b92a28", "y");
cylinder(24, 7, 23, 6, 2, "#eb4438", "y");
cylinder(24, 6, 23, 4, 2, "#9e2525", "y");
cylinder(24, 5, 23, 2, 2, "#d13a32", "y");
for (const [dx, dz] of [[-5, 0], [5, 0], [0, -5], [0, 5]])
box(24 + dx, 6, 23 + dz, 24 + dx + 1, 7, 23 + dz + 1, "#d4d5cd");
// Silver bolt heads around the foot and upper collar.
for (let i = 0; i < 8; i++) {
const a = i * Math.PI / 4;
const x = Math.round(24 + 10 * Math.cos(a));
const y = Math.round(24 + 10 * Math.sin(a));
box(x, y, 9, x + 1, y + 1, 10, "#c9ccc8");
}
for (const x of [18, 29]) {
box(x, 16, 30, x + 1, 17, 31, "#bec2be");
}
// Two little drooping chains tether the side caps to the body.
// Alternating bright links and dark gaps keep them legible at game scale.
for (const side of [-1, 1]) {
const p = (d, y, z) => [24 + side * d, y, z];
const path = [
p(18, 21, 20), p(16, 18, 17), p(14, 16, 15),
p(11, 15, 14), p(9, 15, 14), p(7, 15, 16),
p(6, 15, 20), p(6, 16, 23)
];
for (let i = 0; i < path.length - 1; i++) {
line(...path[i], ...path[i + 1], 0, "#626b6b");
const [x, y, z] = path[i];
set(x, y - 1, z, "#d1d2ca");
}
const [x, y, z] = path[path.length - 1];
set(x, y - 1, z, "#d1d2ca");
}import { draw } from "./assets/voxel";
import { hidrante } from "./assets/hidrante";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, hidrante, x, y, { size: 64, angle: 0, t: performance.now() / 1000 });
// size: lo que mide en px su lado más largo
// angle: giro sobre el piso, en radianes
// t: segundos; si se mueve, se anima solo con eso# En una terminal, en la carpeta del juego
fogon assets add hidrante
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["hidrante"] })
# Queda en client/assets/hidrante.ts
# https://fogon.page/object/hidrante