fogón

← Animals3D assetfogon/gato

Gato

by fogonCC015050 blocks
GatoDrag to turn it
// «Gato» · gpt-6-sol (medium)
// A chunky cartoon orange tabby cat, horizontal along y, head at the front (-y): a compact box body with darker orange stripes across the back, a big round head with two pointy triangular ears (pink inside), green eyes with black slit pupils, a small pink nose and white whiskers, white paws and a white chest. A long tail curving up at the back.

const orange = "#ee8628";
const lightOrange = "#ffad43";
const darkOrange = "#b85420";
const stripe = "#a9471b";
const white = "#fff4df";
const shadowWhite = "#e5ddcf";

part("body", [24, 24, 15]);

// Compact, rounded body.
ellipsoid(24, 27, 15, 12, 13, 9, orange);
forEach((x, y, z) => {
  if (y < 14 || y > 40 || z < 6 || z > 24) return;
  if (z >= 18 && ((y >= 21 && y <= 23) ||
                  (y >= 28 && y <= 30) ||
                  (y >= 35 && y <= 37))) {
    set(x, y, z, stripe);
  } else if (z >= 20 && rand() < 0.19) {
    set(x, y, z, lightOrange);
  } else if (z <= 10 && rand() < 0.24) {
    set(x, y, z, darkOrange);
  }
});

// Oversized head and its bold tabby markings.
ellipsoid(24, 12, 21, 12, 10, 11, orange);
forEach((x, y, z) => {
  if (y > 21 || z < 11 || z > 32) return;
  const forehead = z >= 26 && y <= 14 &&
    (Math.abs(x - 24) <= 1 ||
     (x >= 15 && x <= 17 && y >= 6) ||
     (x >= 31 && x <= 33 && y >= 6));
  const cheek = z >= 18 && z <= 23 && y <= 11 &&
    ((x >= 12 && x <= 14) || (x >= 34 && x <= 36));
  if (forehead || cheek) set(x, y, z, stripe);
  else if (z >= 27 && rand() < 0.17) set(x, y, z, lightOrange);
});

// Pointed ears, with inset pink faces.
for (const cx of [16, 32]) {
  for (let z = 29; z <= 39; z++) {
    const half = Math.max(0, 5 - Math.floor((z - 29) / 2));
    const front = 7 + Math.floor((z - 29) / 4);
    const back = 15 - Math.floor((z - 29) / 4);
    for (let x = cx - half; x <= cx + half; x++) {
      for (let y = front; y <= back; y++) {
        const pinkInside = z >= 32 && z <= 37 &&
          y === front && Math.abs(x - cx) <= half - 1;
        set(x, y, z, pinkInside ? "#f58e9a" :
          z >= 35 ? lightOrange : orange);
      }
    }
  }
}

// White bib, cheeks, and little muzzle.
ellipsoid(24, 13, 10, 6, 7, 6, shadowWhite);
ellipsoid(24, 11, 12, 5, 5, 5, white);
ellipsoid(21, 3, 16, 4, 2, 3, white);
ellipsoid(27, 3, 16, 4, 2, 3, white);

// Big green eyes with vertical slit pupils.
for (const x of [18, 30]) {
  ellipsoid(x, 3, 23, 3, 2, 3, "#387b36");
  ellipsoid(x, 1, 23, 2, 1, 3, "#81ce55");
  box(x, 0, 21, x, 0, 25, "#17251b");
  set(x - 1, 0, 25, "#ffffff");
}

ellipsoid(24, 0, 18, 2, 1, 1, "#f38b99");
line(24, 0, 17, 24, 0, 15, 0, "#68402c");
set(23, 0, 14, "#68402c");
set(25, 0, 14, "#68402c");

// Whiskers extend beyond the cheeks for a readable silhouette.
for (const z of [15, 17]) {
  line(17, 1, z, 8, 0, z + (z === 17 ? 1 : -1), 0, white);
  line(31, 1, z, 40, 0, z + (z === 17 ? 1 : -1), 0, white);
}

// Four separate short walking legs, each hinged at its shoulder or hip.
function leg(name, x, y, speed) {
  part(name, [x, y, 10]);
  ellipsoid(x, y, 5, 4, 4, 5, orange);
  box(x - 3, y - 2, 1, x + 3, y + 2, 4, darkOrange);
  ellipsoid(x, y - 2, 2, 4, 5, 2, white);
  box(x - 3, y - 5, 0, x + 3, y + 1, 1, shadowWhite);
  animate(name, { type: "swing", axis: "x", speed, amplitude: 0.3 });
}
leg("front-left", 16, 18, 5);
leg("front-right", 32, 18, -5);
leg("rear-left", 16, 35, -5);
leg("rear-right", 32, 35, 5);

// Long tail curls upward and forward behind the body.
part("tail", [24, 38, 17]);
line(24, 38, 17, 24, 42, 19, 3, orange);
line(24, 42, 19, 24, 44, 24, 3, darkOrange);
line(24, 44, 24, 24, 43, 29, 3, orange);
line(24, 43, 29, 24, 40, 32, 3, stripe);
sphere(24, 40, 32, 3, lightOrange);
animate("tail", { type: "swing", axis: "y", speed: 2, amplitude: 0.3 });