fogón

← Basics3D assetfogon/banjo

Banjo

by fogonCC05962 blocks
BanjoDrag to turn it
// «Banjo» · gpt-6-sol (medium)
// Banjo («Banjo»). 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.

// Banjo, upright with its skin facing -y.
const walnut = "#684127", darkWood = "#49301f", warmWood = "#865431";
const steel = "#aeb3ab", bright = "#e4e4d8", shadowSteel = "#787f7c";

function disk(cx, cz, r, y0, y1, color) {
  for (let x = Math.ceil(cx-r); x <= Math.floor(cx+r); x++)
    for (let z = Math.ceil(cz-r); z <= Math.floor(cz+r); z++)
      if ((x-cx)**2 + (z-cz)**2 <= r*r)
        box(x,y0,z,x,y1,z,color);
}

// Thin wooden pot and layered metal rim.
disk(24, 13, 12.2, 21, 26, walnut);
disk(24, 13, 12.4, 20, 21, darkWood);
disk(24, 13, 12.3, 19, 19, shadowSteel);
disk(24, 13, 12.1, 18, 18, steel);
disk(24, 13, 11.4, 17, 17, "#c6c8bd");
disk(24, 13, 10.5, 16, 16, "#dddccd");

// Continue the bottom edge of the pot to the floor at z=0.
box(23,21,0,25,25,0,walnut);
box(23,20,0,25,20,0,darkWood);
box(23,18,0,25,19,0,shadowSteel);
box(23,17,0,25,17,0,steel);

// Pale drum skin, with restrained variation across its broad surface.
for (let x=14; x<=34; x++) for (let z=3; z<=23; z++) {
  if ((x-24)**2+(z-13)**2 <= 10.3**2) {
    let c = z > 16 ? "#e8e7d9" : z < 7 ? "#d2d2c7" : "#e0dfd1";
    if (rand() < 0.065) c = "#d6d6ca";
    if (x < 19 && rand() < 0.23) c = "#d2d0c1";
    set(x,16,z,c);
  }
}

// Riveted rim: small, separate fittings around the circumference.
for (let i=0; i<20; i++) {
  const a=i*Math.PI*2/20;
  const x=Math.round(24+11.6*Math.cos(a));
  const z=Math.round(13+11.6*Math.sin(a));
  set(x,16,z,i%3===0 ? "#f0eee1" : "#a8ada5");
  set(x,18,z,bright);
  if (i%2===0) set(x,20,z,"#c0bcb0");
}
for (let i=0; i<12; i++) {
  const a=i*Math.PI*2/12+0.12;
  const x=Math.round(24+12*Math.cos(a));
  const z=Math.round(13+12*Math.sin(a));
  set(x,22,z,"#b7b9ad");
  set(x,23,z,"#dedbc9");
}

// Heel and long, narrow wooden neck.
box(22,21,23,26,25,27,darkWood);
box(23,20,25,26,24,40,walnut);
box(22,22,27,22,25,39,darkWood);
box(23,19,28,25,19,40,"#805638");
box(26,19,26,26,19,41,"#b3aea0");
box(23,18,29,25,18,40,"#766044");
for (let z=29; z<=39; z+=3) {
  box(23,17,z,26,17,z,z%2 ? "#c4bfaa" : "#e4dfc9");
}
box(22,19,25,26,20,26,"#a8a28c");

// Peghead, narrower at its waist, with a dark flat crown.
box(22,21,40,26,24,43,darkWood);
box(21,21,43,27,24,45,walnut);
box(22,21,46,26,24,46,"#704329");
box(22,20,44,26,20,45,"#965c32");
box(23,19,40,25,19,44,"#a27a51");
box(24,18,42,24,18,44,"#553921");

// Four projecting tuning pegs, thin shafts and pale squared knobs.
for (const [z,left] of [[43,true],[39,true],[42,false],[38,false]]) {
  if (left) {
    box(19,22,z,22,22,z,shadowSteel);
    box(17,21,z-1,19,23,z+1,"#d3d1bf");
    set(18,20,z,bright);
  } else {
    box(27,22,z,30,22,z,shadowSteel);
    box(30,21,z-1,31,23,z+1,"#c8c9bd");
    set(31,20,z,bright);
  }
}
for (let z=32; z<=39; z+=3) {
  box(27,21,z,29,21,z,steel);
  set(29,20,z,bright);
}

// Four individual strings, continued onto the skin.
for (const x of [23,24,25,26]) {
  const top = x===23 || x===26 ? 43 : 45;
  line(x,17,9,x,17,top,0,x%2 ? "#eae8dc" : "#bfc2b9");
}
box(21,15,8,27,15,8,"#8d6945");
box(22,14,9,26,14,9,"#e4d6ad");
box(23,15,4,25,16,7,"#49433a");
box(22,15,3,26,16,4,"#aaa99e");
box(23,14,3,25,14,3,bright);