← Casa completaObjeto 3Dfogon/canasto-de-ropa
Canasto de ropa
Arrastrá para girarlo// «Canasto de ropa» · gpt-6-sol (medium)
// A laundry basket: a round woven wicker basket with two handles, overflowing with colorful clothes (a red sock, a blue shirt, a yellow towel) piling out of the top.
const honey = "#c99256";
const lightHoney = "#e3b675";
const walnut = "#805331";
// Solid woven base
for (let z = 0; z <= 2; z++) {
for (let x = 7; x <= 41; x++) {
for (let y = 7; y <= 41; y++) {
if (Math.hypot(x - 24, y - 24) <= 14.8) {
set(x, y, z, z === 0 ? walnut : honey);
}
}
}
}
// Tapered round basket, with alternating raised wicker strands
for (let z = 2; z <= 25; z++) {
const radius = 14.7 + z * 0.14;
for (let x = 5; x <= 43; x++) {
for (let y = 5; y <= 43; y++) {
const dx = x - 24, dy = y - 24;
const distance = Math.hypot(dx, dy);
const segment = Math.floor((Math.atan2(dy, dx) + Math.PI) * 7);
const raised = (segment + Math.floor(z / 2)) % 2 === 0;
const outer = radius + (raised && z % 3 === 1 ? 0.45 : 0);
if (distance >= radius - 2.3 && distance <= outer) {
let color;
if (z % 4 === 0) color = "#9c673a";
else if (raised) color = rand() < 0.12 ? "#e1ad6d" : "#d5a069";
else color = rand() < 0.12 ? "#a97340" : honey;
set(x, y, z, color);
}
}
}
}
// Thick rolled lip
for (let z = 24; z <= 27; z++) {
for (let x = 5; x <= 43; x++) {
for (let y = 5; y <= 43; y++) {
const d = Math.hypot(x - 24, y - 24);
if (d >= 15.7 && d <= 18.6) {
set(x, y, z,
z === 24 ? walnut :
z === 27 ? lightHoney :
rand() < 0.16 ? "#edc487" : "#d7a064");
}
}
}
}
// Soft laundry peeking through the opening
ellipsoid(23, 23, 27, 13, 12, 5, "#f1ded0");
ellipsoid(17, 22, 29, 8, 7, 5, "#a9d9c2");
ellipsoid(29, 24, 30, 8, 7, 5, "#f2bca5");
ellipsoid(24, 17, 30, 11, 8, 5, "#f8e8d8");
// Yellow folded towel, spilling over the right edge
box(30, 12, 28, 38, 21, 30, "#bf8e35");
box(29, 11, 31, 38, 20, 33, "#e2b650");
box(30, 11, 34, 37, 19, 34, "#f1cf70");
box(30, 10, 30, 38, 11, 31, "#f0ca67");
box(31, 10, 32, 37, 10, 32, "#ffdc83");
box(33, 10, 31, 34, 10, 32, "#fff0bd");
box(36, 10, 31, 37, 10, 32, "#fff0bd");
// Blue shirt draped across the middle: sleeves, body, and collar
box(20, 11, 30, 29, 19, 36, "#74add2");
box(16, 12, 32, 20, 18, 36, "#8ec5e4");
box(29, 12, 32, 33, 18, 36, "#8ec5e4");
box(17, 11, 32, 19, 12, 33, "#5b9ac2");
box(30, 11, 32, 32, 12, 33, "#5b9ac2");
box(21, 10, 31, 28, 11, 34, "#90c9e8");
box(21, 10, 35, 23, 12, 37, "#93c9e7");
box(26, 10, 35, 28, 12, 37, "#93c9e7");
box(23, 10, 35, 26, 11, 36, "#476e96"); // neck opening
box(22, 9, 32, 22, 10, 34, "#c1e2ef");
box(27, 9, 32, 27, 10, 34, "#c1e2ef");
line(24, 10, 31, 25, 10, 33, 0, "#c1e2ef");
// Red sock with a bent foot, pale cuff and toe
box(13, 9, 29, 17, 14, 36, "#d85c57");
box(12, 8, 28, 17, 14, 31, "#df6660");
box(9, 8, 27, 14, 13, 30, "#d85c57");
box(9, 8, 27, 11, 13, 29, "#f5dfcf");
box(13, 8, 29, 15, 9, 30, "#ae4247");
box(13, 9, 36, 17, 14, 37, "#fff0df");
box(13, 8, 35, 17, 9, 36, "#f5dfcf");
line(14, 8, 32, 14, 8, 34, 0, "#f19283");
// Two chunky wicker loop handles, rising above the rim
for (const mirror of [false, true]) {
const hx = x => mirror ? 48 - x : x;
const rope = (x0, z0, x1, z1, r, color) =>
line(hx(x0), 15, z0, hx(x1), 15, z1, r, color);
rope(7, 24, 7, 30, 1.35, walnut);
rope(7, 30, 9, 33, 1.35, walnut);
rope(9, 33, 12, 33, 1.35, walnut);
rope(12, 33, 14, 30, 1.35, walnut);
rope(14, 30, 14, 24, 1.35, walnut);
// Light catching the front of the curved handle
line(hx(7), 14, 27, hx(7), 14, 30, 0, lightHoney);
line(hx(9), 14, 33, hx(12), 14, 33, 0, lightHoney);
line(hx(14), 14, 27, hx(14), 14, 30, 0, lightHoney);
}import { draw } from "./assets/voxel";
import { canastoDeRopa } from "./assets/canasto-de-ropa";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, canastoDeRopa, 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 canasto-de-ropa
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["canasto-de-ropa"] })
# Queda en client/assets/canasto-de-ropa.ts
# https://fogon.page/object/canasto-de-ropa