fogón

← Whole house3D assetfogon/canasto-de-ropa

Canasto de ropa

by fogonCC014118 blocks
Canasto de ropaDrag to turn it
// «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);
}