fogón

← Basics3D assetfogon/guitarra-criolla

Guitarra criolla

by fogonCC06310 blocks
Guitarra criollaDrag to turn it
// «Guitarra criolla» · gpt-6-sol (medium)
// Acoustic guitar («Guitarra criolla»). 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.

const wood = ["#c58b49", "#cf9855", "#d8a45f", "#bd7f3e"];
const sideWood = ["#754022", "#824a27", "#90542b"];
const edge = "#e3ba78";

// Rounded lower bout, narrow waist, and smaller upper bout.
const halfWidth = [
  7, 11, 13, 14, 15, 16, 16, 16,
  15, 15, 14, 13, 12, 11, 10, 10,
  11, 12, 13, 12, 11, 9, 7, 4
];

for (let z = 0; z < halfWidth.length; z++) {
  const w = halfWidth[z];
  for (let x = 24 - w; x <= 24 + w; x++) {
    const d = Math.min(x - (24 - w), 24 + w - x);

    for (let y = 19; y <= 25; y++) {
      const shade = Math.min(2, Math.floor((y - 19) / 3));
      set(x, y, z, sideWood[shade]);
    }

    let color = wood[Math.floor(rand() * wood.length)];
    if (z < 4) color = rand() < 0.65 ? "#c28b4a" : color;
    set(x, 18, z, color);

    // Inlaid pale binding and darker inner purfling follow the outline.
    if (d === 0) set(x, 17, z, edge);
    else if (d === 1) set(x, 17, z, "#ad6a32");
    else if (d === 2 && z > 2) set(x, 17, z, "#e9bb74");
    else if (d === 3 && z > 4 && z < 23) set(x, 17, z, "#9e612f");
  }

  // Pale binding visible along the back edge.
  set(24 - w, 25, z, "#b77d41");
  set(24 + w, 25, z, "#a96b34");
}

// Subtle wood grain on the soundboard.
for (let i = 0; i < 48; i++) {
  const z = 2 + Math.floor(rand() * 20);
  const x = 24 + Math.floor((rand() - 0.5) * 19);
  if (Math.abs(x - 24) < halfWidth[z] - 4 && get(x, 18, z))
    set(x, 17, z, rand() < 0.5 ? "#dca866" : "#bc8040");
}

// Round sound hole with a fine, contrasting rosette.
for (let z = 11; z <= 19; z++) {
  for (let x = 19; x <= 29; x++) {
    const r = Math.hypot(x - 24, z - 15);
    if (r <= 2.65) set(x, 16, z, "#301b15");
    else if (r <= 3.35) set(x, 16, z, "#694024");
    else if (r <= 4.05) set(x, 16, z, "#e4bb78");
    else if (r <= 4.45) set(x, 16, z, "#704423");
  }
}

// Slender neck: dark wooden back and a narrower gray-brown fingerboard.
box(21, 19, 20, 27, 22, 38, "#693c26");
box(21, 18, 21, 27, 18, 37, "#9a886c");
box(21, 17, 21, 27, 17, 37, "#807866");
for (let z = 22; z <= 36; z++) {
  set(21, 17, z, "#685a49");
  set(27, 17, z, "#675948");
}

// Frets, closer together toward the body.
for (const z of [22, 24, 26, 29, 32, 35, 37]) {
  box(21, 16, z, 27, 16, z, "#c1b7a0");
  set(21, 16, z, "#e0d1ac");
}
box(21, 16, 38, 27, 16, 38, "#eee0bf"); // nut

// Open-slotted classical-guitar headstock.
box(20, 19, 39, 28, 21, 44, "#784026");
box(20, 18, 39, 21, 18, 44, "#a45d30");
box(27, 18, 39, 28, 18, 44, "#94502a");
box(22, 18, 44, 26, 20, 45, "#a96637");
box(22, 17, 45, 26, 17, 45, "#d59a58");
box(23, 17, 40, 25, 17, 43, "#38251c");
box(23, 18, 41, 25, 18, 43, "#38251c");
set(24, 17, 44, "#b97641");

// Three ivory tuning keys on either side, with little metal posts.
for (const z of [39, 42, 44]) {
  box(18, 18, z, 20, 18, z, "#c9c5aa");
  box(28, 18, z, 30, 18, z, "#c9c5aa");
  box(17, 17, z, 18, 18, z, "#e1ddc2");
  box(30, 17, z, 31, 18, z, "#e1ddc2");
  set(20, 16, z, "#a9a18a");
  set(28, 16, z, "#a9a18a");
}

// Dark tie bridge and its light saddle.
box(19, 16, 6, 29, 17, 8, "#61391f");
box(20, 15, 7, 28, 15, 8, "#754222");
box(20, 14, 9, 28, 14, 9, "#e9d8aa");
for (const x of [20, 22, 23, 25, 26, 28])
  set(x, 14, 7, "#dbc793");

// Six thin strings, spaced wider over the soundboard.
const bodyStrings = [20, 22, 23, 25, 26, 28];
const neckStrings = [21, 22, 23, 25, 26, 27];
for (let i = 0; i < 6; i++) {
  const c = i < 3 ? "#c6b99b" : "#e5d6ae";
  line(bodyStrings[i], 14, 9, bodyStrings[i], 14, 20, 0, c);
  line(bodyStrings[i], 14, 20, neckStrings[i], 15, 38, 0, c);
  line(neckStrings[i], 15, 39, i < 3 ? 20 : 28, 16, [39, 42, 44][i % 3], 0, c);
}