← CiudadObjeto 3Dfogon/vuelta-al-mundo
Vuelta al mundo
Arrastrá para girarlo// «Vuelta al mundo» · gpt-6-sol (medium)
// A ferris wheel: a large white steel wheel standing upright in the x-z plane on two A-frame legs, with spokes radiating from a central hub and eight colorful cabins (red, yellow, blue, green) hanging around the rim, and a small ticket booth at its foot.
// Plaza
box(3, 5, 0, 45, 36, 0, "#bfc4c2");
for (let i = 0; i < 330; i++) {
const x = 3 + Math.floor(rand() * 43);
const y = 5 + Math.floor(rand() * 32);
set(x, y, 0, rand() < 0.5 ? "#cbd0cc" : "#adb4b1");
}
box(3, 17, 0, 45, 18, 0, "#e4dcc7");
box(18, 6, 0, 45, 10, 0, "#727a7b");
for (let x = 20; x < 44; x += 6) box(x, 8, 0, x + 2, 8, 0, "#f0d66b");
// Ticket booth: warm brick, cream trim, striped canopy.
box(6, 7, 1, 16, 16, 8, "#b85e4e");
box(6, 7, 8, 16, 16, 9, "#f2dfba");
for (let z = 2; z <= 7; z += 2) {
box(6, 6, z, 16, 6, z, "#cd7660");
}
for (let x = 7; x <= 16; x += 3) {
for (let z = 2; z <= 7; z += 2) {
set(x + ((z / 2) % 2), 6, z, "#9f493f");
}
}
box(8, 6, 3, 14, 6, 6, "#263e4c");
box(9, 5, 4, 13, 5, 5, "#73c6cf");
box(8, 5, 2, 14, 6, 3, "#e8d4a8");
box(7, 5, 7, 15, 5, 8, "#173d40");
for (let x = 8; x <= 14; x += 2) set(x, 4, 8, "#f4d377");
box(5, 5, 9, 17, 17, 9, "#f7e6c5");
for (let x = 5; x <= 17; x++) {
box(x, 4, 8, x, 6, 8, x % 4 < 2 ? "#df6556" : "#ffdc91");
}
box(5, 5, 10, 17, 17, 10, "#e9d1ac");
box(7, 8, 11, 15, 15, 11, "#f8e9c9");
// Four splayed steel legs, with feet and cross braces.
for (const y of [18, 31]) {
line(13, y, 1, 24, y, 24, 1, "#aebbc0");
line(35, y, 1, 24, y, 24, 1, "#aebbc0");
line(14, y - 1, 2, 24, y - 1, 24, 0, "#f5f6ec");
line(34, y - 1, 2, 24, y - 1, 24, 0, "#f5f6ec");
line(16, y, 7, 32, y, 7, 0, "#718991");
box(11, y - 2, 1, 15, y + 2, 2, "#718991");
box(33, y - 2, 1, 37, y + 2, 2, "#718991");
cylinder(24, y - 1, 24, 2, 3, "#596c75", "y");
}
line(24, 18, 24, 24, 32, 24, 1, "#84979d");
// The complete rotating wheel, including its eight cabins.
part("wheel", [24, 24, 24]);
// Twin white rims with pale-blue inner edges.
for (let a = 0; a < Math.PI * 2; a += 0.012) {
for (const y of [22, 27]) {
for (const r of [16.5, 17.2]) {
const x = Math.round(24 + Math.sin(a) * r);
const z = Math.round(24 + Math.cos(a) * r);
set(x, y, z, r < 17 ? "#a8c8d0" : "#f5f6ee");
}
}
}
for (let i = 0; i < 16; i++) {
const a = i * Math.PI / 8;
const dx = Math.sin(a), dz = Math.cos(a);
const heavy = i % 2 === 0;
for (const y of [22, 27]) {
line(
24 + dx * 2, y, 24 + dz * 2,
24 + dx * 17, y, 24 + dz * 17,
heavy ? 1 : 0,
heavy ? "#e8eee9" : "#b5c9cd"
);
}
}
for (let i = 0; i < 8; i++) {
const a = i * Math.PI / 4;
const x = 24 + Math.sin(a) * 17;
const z = 24 + Math.cos(a) * 17;
line(x, 22, z, x, 27, z, 0, "#e8eee9");
}
cylinder(24, 20, 24, 3, 9, "#f5f1dd", "y");
cylinder(24, 19, 24, 2, 2, "#dcab53", "y");
cylinder(24, 28, 24, 2, 2, "#dcab53", "y");
set(24, 18, 24, "#2d6970");
const cabins = [
["#dc594d", "#ad3e3b", "#fa8a6b"],
["#efd15b", "#bf9b39", "#ffeb9d"],
["#428fc1", "#31648f", "#76c4df"],
["#67b58b", "#34846a", "#a0d8a0"]
];
for (let i = 0; i < 8; i++) {
const a = i * Math.PI / 4;
const cx = Math.round(24 + Math.sin(a) * 18);
const cz = Math.round(24 + Math.cos(a) * 18);
const [paint, shade, highlight] = cabins[i % 4];
// Chunky enclosed gondola, always upright in the model.
box(cx - 3, 20, cz - 2, cx + 3, 27, cz + 1, paint);
box(cx - 3, 20, cz - 2, cx + 3, 27, cz - 2, shade);
box(cx - 3, 19, cz + 2, cx + 3, 28, cz + 2, highlight);
box(cx - 2, 20, cz + 3, cx + 2, 27, cz + 3, paint);
// Broad front window, mullions, and a contrasting lower apron.
box(cx - 2, 19, cz - 1, cx + 2, 19, cz + 1, "#244f62");
box(cx - 2, 18, cz, cx + 2, 18, cz + 1, "#8bd1da");
box(cx, 18, cz - 1, cx, 18, cz + 1, "#eaf1df");
box(cx - 3, 19, cz - 2, cx + 3, 19, cz - 2, shade);
set(cx, 18, cz - 2, "#f8df83");
// Side windows and bright corner pillars.
box(cx - 3, 22, cz - 1, cx - 3, 25, cz + 1, "#39748c");
box(cx + 3, 22, cz - 1, cx + 3, 25, cz + 1, "#39748c");
for (const x of [cx - 3, cx + 3]) {
box(x, 19, cz, x, 19, cz + 1, highlight);
}
// Silver hanger at the rim attachment.
line(cx, 23, cz + 3, cx, 23, cz + 4, 0, "#e9eee9");
}
animate("wheel", { type: "spin", axis: "y", speed: 0.5 });import { draw } from "./assets/voxel";
import { vueltaAlMundo } from "./assets/vuelta-al-mundo";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, vueltaAlMundo, 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 vuelta-al-mundo
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["vuelta-al-mundo"] })
# Queda en client/assets/vuelta-al-mundo.ts
# https://fogon.page/object/vuelta-al-mundo