fogón

← Basics3D assetfogon/cepillo-de-carpintero

Cepillo de carpintero

by fogonCC09442 blocks
Cepillo de carpinteroDrag to turn it
// «Cepillo de carpintero» · gpt-6-sol (medium)
// Hand plane («Cepillo de carpintero»). Be faithful to the reference: keep thin parts thin (1–2 blocks: strings, necks, handles, legs, rods), keep its exact proportions and silhouette, and every visible detail (books on shelves, sound holes, tuning pegs, valves). Don't make it chunkier than the reference.

// Carpenter's hand plane: a low steel sole, raised frog, wooden front knob
// and thin, open rear tote.
const teal = ["#294348", "#345158", "#3e5c62", "#4b686d"];
const steel = ["#59666a", "#78888c", "#a6b3b4", "#d1d8d5", "#eef0e8"];
const wood = ["#76401e", "#985125", "#b96c2e", "#d78a3b", "#e5a755"];

function block(x, y, z, c) { set(x, y, z, c); }
function worn(c, alt, chance = 0.09) { return rand() < chance ? alt : c; }

// Chamfered, nearly full-length sole. Its pale lower edge remains visible.
for (let x = 3; x <= 45; x++) {
  const end = Math.min(x - 3, 45 - x);
  const inset = end < 2 ? 3 - end : end < 4 ? 1 : 0;
  for (let y = 15 + inset; y <= 32 - inset; y++) {
    for (let z = 0; z <= 7; z++) {
      let c;
      if (z === 0) c = "#515b5c";
      else if (z === 1) c = (y === 15 + inset || y === 32 - inset) ? "#b4bcb7" : "#747f7e";
      else if (z === 2) c = (y === 15 + inset || y === 32 - inset) ? "#354448" : "#536368";
      else if (z === 7) c = worn("#38565c", "#4b676a");
      else c = worn(z < 4 ? "#263b40" : "#304b51", "#3e5b60");
      block(x, y, z, c);
    }
  }
}

// Faceted rim, with a flat, slightly recessed upper deck.
box(6, 18, 8, 42, 29, 8, "#29454b");
for (let x = 6; x <= 42; x++) {
  block(x, 16, 8, worn("#45636a", "#577178"));
  block(x, 17, 8, worn("#527178", "#637e82"));
  block(x, 30, 8, worn("#354f55", "#45636a"));
  block(x, 31, 8, "#294147");
}
for (let x = 8; x <= 40; x += 5) {
  box(x, 16, 9, x + 1, 17, 9, "#58747a");
  box(x, 30, 9, x + 1, 31, 9, "#38575d");
}
box(5, 19, 8, 6, 28, 9, "#3d5d63");
box(43, 18, 8, 44, 29, 9, "#3b5c61");

// Dark mouth in the sole underneath the blade.
box(19, 18, 8, 32, 29, 8, "#1e3439");
box(21, 17, 9, 30, 18, 9, "#536e74");
box(21, 29, 9, 31, 30, 9, "#587177");

// The small, rounded wooden front knob, with a narrow stem.
cylinder(12, 23, 8, 2, 4, "#84471f");
cylinder(12, 23, 11, 3, 3, "#aa6029");
ellipsoid(12, 23, 16, 4.5, 4, 4, "#ac6028");
forEach((x, y, z, c) => {
  if (x >= 8 && x <= 17 && y >= 19 && y <= 27 && z >= 12 && z <= 20 && c === "#ac6028") {
    if (z >= 18) block(x, y, z, worn(wood[3], wood[4], 0.23));
    else if (y <= 21 || x <= 10) block(x, y, z, worn(wood[2], wood[3], 0.22));
    else if (z <= 14) block(x, y, z, worn(wood[1], wood[2], 0.15));
    else block(x, y, z, worn(wood[2], wood[1], 0.14));
  }
});
box(10, 20, 10, 14, 20, 11, "#78421e");
block(11, 20, 17, "#e4a04a");
block(12, 20, 19, "#d88c3c");
block(15, 22, 17, "#80401c");

// Dark backing and the rising, stepped iron of the plane.
for (let x = 19; x <= 33; x++) {
  const top = Math.floor(13 + (x - 19) * 1.48);
  for (let y = 19; y <= 29; y++) {
    for (let z = Math.max(9, top - 9); z <= top; z++) {
      let c = y <= 20 ? "#74868a" : y >= 28 ? "#536569" : "#8e9b9b";
      if (z >= top - 1) c = y <= 22 ? "#e5eae3" : "#b9c5c2";
      else if (z <= top - 7) c = "#4d6165";
      block(x, y, z, worn(c, "#a5b3b1", 0.06));
    }
  }
}
// Bright transverse stair edges give the iron its recognizable tilted profile.
for (let x = 20; x <= 32; x += 2) {
  const top = Math.floor(13 + (x - 19) * 1.48);
  box(x, 18, top - 1, x, 27, top, "#d6ddda");
  box(x, 19, top + 1, x + 1, 25, top + 1, "#edf0e9");
  box(x, 27, top - 4, x, 29, top - 2, "#a5b2b0");
}
for (let x = 20; x <= 31; x++) {
  const top = Math.floor(13 + (x - 19) * 1.48);
  block(x, 18, top - 3, "#a8b7b6");
  block(x, 19, top - 5, "#657b80");
}
// Slim darker clamp on the face, and its little brass fastener.
box(27, 17, 17, 30, 18, 27, "#40575a");
box(27, 17, 19, 28, 17, 25, "#778987");
box(25, 17, 21, 27, 17, 23, "#bd842f");
box(25, 16, 22, 26, 16, 23, "#e3b14b");
block(26, 16, 24, "#f0c66b");
box(31, 19, 29, 33, 26, 30, "#77888a");
box(31, 20, 31, 32, 25, 31, "#e5e9e3");

// Rear wooden tote: a slender upright outline with a long, open hand hole.
// The right post curves forward into a broad foot on the plane's deck.
box(35, 23, 8, 42, 27, 10, wood[1]);
box(36, 23, 10, 42, 26, 12, wood[2]);
box(36, 23, 12, 38, 26, 29, wood[1]); // forward post
box(41, 23, 13, 42, 26, 28, wood[1]); // rear post
box(38, 23, 29, 41, 26, 32, wood[2]); // curved top
box(36, 24, 28, 40, 26, 31, wood[2]);
box(37, 24, 31, 40, 25, 33, wood[3]);
box(35, 24, 12, 37, 26, 17, wood[2]);
box(39, 23, 11, 42, 26, 14, wood[2]);

// Carved facets on the exposed face; the interior stays truly empty.
for (let z = 15; z <= 27; z++) {
  block(36, 22, z, z % 4 === 0 ? wood[3] : wood[2]);
  block(37, 22, z, wood[0]);
  block(41, 22, z, z % 5 === 0 ? wood[3] : wood[2]);
  block(42, 23, z, wood[0]);
}
box(38, 22, 29, 40, 22, 30, wood[3]);
box(38, 22, 32, 39, 23, 32, wood[4]);
box(35, 22, 11, 38, 22, 13, wood[3]);
box(38, 22, 10, 41, 22, 11, wood[3]);
block(41, 22, 12, "#e5a052");
block(39, 22, 30, "#edaa54");

// Dark openings and hardware accents visible through the handles.
box(38, 25, 17, 40, 25, 26, "#392d20");
box(38, 25, 18, 40, 25, 25, null);
block(39, 23, 33, "#37484a");
block(40, 23, 32, "#23383b");
block(8, 16, 7, "#182d32");
block(18, 16, 7, "#1a3035");
block(39, 16, 7, "#23393d");