fogón

← Animals3D assetfogon/tucan

Tucán

by fogonCC08459 blocks
TucánDrag to turn it
// «Tucán» · gpt-6-sol (medium)
// A cartoon toucan perched on a short branch, facing front (-y): a black body, white throat, a red patch under the tail, blue skin around the eyes and a huge colorful beak in bright orange and yellow with a black tip and a red line.

// Branch and its short support
cylinder(24, 26, 0, 3, 6, "#79502e");
line(7, 25, 5, 41, 25, 5, 2, "#80512e");
line(9, 25, 7, 39, 25, 7, 1, "#a66b38");
line(32, 25, 5, 37, 31, 7, 1, "#79502e");
for (let x = 9; x <= 39; x += 3) {
  set(x, 23, 7, "#b77a43");
  if (rand() > 0.5) set(x + 1, 27, 5, "#603b26");
}

// Tail, with the red patch showing beneath it
ellipsoid(24, 34, 15, 5, 6, 4, "#d33836");
ellipsoid(24, 37, 19, 5, 6, 2, "#191c24");
line(21, 37, 19, 20, 41, 18, 1, "#252935");
line(27, 37, 19, 28, 41, 18, 1, "#252935");

// Rounded body and big head
ellipsoid(24, 25, 18, 9, 8, 11, "#181b22");
ellipsoid(24, 24, 20, 7, 7, 8, "#23262e");
ellipsoid(24, 22, 32, 8, 7, 7, "#171a21");
ellipsoid(24, 17, 26, 5, 2, 8, "#f1eee0");
ellipsoid(24, 15, 29, 4, 1, 5, "#ffffff");

// Subtle speckles on the broad black surfaces
forEach((x, y, z, color) => {
  if ((color === "#181b22" || color === "#171a21") && rand() < 0.045) {
    set(x, y, z, rand() < 0.5 ? "#222630" : "#11151b");
  }
});

// Short orange legs gripping the branch
for (const x of [20, 28]) {
  box(x - 1, 23, 7, x + 1, 26, 11, "#dc8236");
  box(x - 2, 20, 6, x + 2, 25, 7, "#f5a648");
  for (const dx of [-2, 0, 2]) {
    line(x + dx, 22, 6, x + dx, 19, 5, 0, "#f4a044");
  }
}

// Bright blue eye surrounds, set to either side of the beak
for (const x of [17, 31]) {
  ellipsoid(x, 16, 34, 3, 2, 3, "#168dc3");
  ellipsoid(x, 14, 34, 2, 1, 2, "#45bde1");
  ellipsoid(x, 13, 34, 1, 1, 1, "#101820");
  set(x - 1, 12, 35, "#ffffff");
}

// Oversized, tapered beak pointing toward the viewer
for (let y = 3; y <= 18; y++) {
  const t = (y - 3) / 15;
  const width = 2.5 + 4 * t + 1.2 * Math.sin(Math.PI * t);
  const height = 2.4 + 2.2 * t;
  const centerZ = 32.5 + 0.5 * t;
  for (let x = Math.ceil(24 - width); x <= Math.floor(24 + width); x++) {
    for (let z = Math.ceil(centerZ - height); z <= Math.floor(centerZ + height); z++) {
      const u = (x - 24) / width;
      const v = (z - centerZ) / height;
      if (u * u + v * v > 1) continue;

      let color;
      if (y <= 6) color = z >= centerZ ? "#252832" : "#11151d";
      else if (z === 31 && y <= 16) color = "#e94738";
      else if (z <= 30) color = "#ffd344";
      else if (z <= 32) color = "#f4aa2f";
      else color = z >= centerZ + height - 1 ? "#ffcf49" : "#fa842b";
      set(x, y, z, color);
    }
  }
}
// Red line carried around the visible sides
for (let y = 7; y <= 16; y++) {
  const t = (y - 3) / 15;
  const edge = Math.floor(2.5 + 4 * t + 1.2 * Math.sin(Math.PI * t));
  set(24 - edge, y, 32, "#dc4235");
  set(24 + edge, y, 32, "#dc4235");
}

// Independently flapping wings
part("leftWing", [16, 25, 23]);
ellipsoid(13, 25, 19, 4, 6, 7, "#20242c");
ellipsoid(12, 24, 17, 3, 5, 5, "#30343d");
line(12, 22, 15, 11, 26, 13, 1, "#161a22");
animate("leftWing", { type: "swing", axis: "y", speed: 4, amplitude: 0.35 });

part("rightWing", [32, 25, 23]);
ellipsoid(35, 25, 19, 4, 6, 7, "#20242c");
ellipsoid(36, 24, 17, 3, 5, 5, "#30343d");
line(36, 22, 15, 37, 26, 13, 1, "#161a22");
animate("rightWing", { type: "swing", axis: "y", speed: -4, amplitude: 0.35 });