fogón

← Animals3D assetfogon/tigre

Tigre

by fogonCC014259 blocks
TigreDrag to turn it
// «Tigre» · gpt-6-sol (medium)
// A chunky cartoon tiger, horizontal along y, head at the front (-y): a bright orange body with bold black vertical stripes, white belly, chin and inner legs, a big round head with white cheeks, black stripes on the forehead, small round ears, a pink nose and amber eyes. A long orange tail ringed in black.

const orange = "#f58b1e";
const lightOrange = "#ffa52c";
const darkOrange = "#d96a16";
const black = "#202024";
const deepBlack = "#121417";
const white = "#fff5dc";
const cream = "#eee6cf";

// Rounded, solid torso.
ellipsoid(24, 27, 19, 11, 14, 9, orange);
forEach((x, y, z, color) => {
  if (color !== orange) return;
  if (z >= 23) set(x, y, z, rand() < 0.08 ? orange : lightOrange);
  else if (z <= 15) set(x, y, z, rand() < 0.12 ? orange : darkOrange);
  else if (rand() < 0.045) set(x, y, z, lightOrange);
});

// Four bold stripes wrap over the back and down both flanks.
for (const band of [19, 25, 31, 37]) {
  for (let x = 13; x <= 35; x++) {
    const yy = band + Math.round(Math.abs(x - 24) * 0.13);
    for (let dy = 0; dy <= 1; dy++) {
      let top = -1;
      for (let z = 29; z >= 16; z--) {
        if (get(x, yy + dy, z)) { top = z; break; }
      }
      if (top >= 21) {
        set(x, yy + dy, top, black);
        if (get(x, yy + dy, top - 1)) set(x, yy + dy, top - 1, deepBlack);
      }
    }
  }
  for (let z = 13; z <= 25; z++) {
    const yy = band + Math.round((z - 19) * 0.22);
    for (let dy = 0; dy <= 1; dy++) {
      for (const side of [-1, 1]) {
        let edge;
        for (let x = side < 0 ? 13 : 35;
             side < 0 ? x <= 24 : x >= 24;
             x -= side) {
          if (get(x, yy + dy, z)) { edge = x; break; }
        }
        if (edge !== undefined) {
          set(edge, yy + dy, z, black);
          if (get(edge - side, yy + dy, z))
            set(edge - side, yy + dy, z, black);
        }
      }
    }
  }
}

// Soft white underside, left visible between the legs.
ellipsoid(24, 25, 12, 8, 11, 4, cream);
ellipsoid(24, 18, 13, 7, 5, 4, white);

// Oversized toy-like head.
ellipsoid(24, 13, 24, 11, 9, 11, orange);
forEach((x, y, z, color) => {
  if (color !== orange || y > 23 || z < 15) return;
  if (z >= 28) set(x, y, z, rand() < 0.09 ? orange : lightOrange);
  else if (z <= 19 && rand() < 0.35) set(x, y, z, darkOrange);
});

// Rounded ears with dark rims and pink inner patches.
for (const ex of [15, 33]) {
  sphere(ex, 10, 33, 4, black);
  sphere(ex, 9, 34, 3, orange);
  ellipsoid(ex, 6, 34, 2, 1, 2, "#e98e83");
  set(ex, 5, 35, "#f6b0a0");
}

// Forehead stripes: visible from above and from the front.
for (let y = 6; y <= 18; y++) {
  for (const side of [-1, 0, 1]) {
    const centerX = side === 0 ? 24 :
      24 + side * (6 - Math.round((y - 6) * 0.16));
    for (let dx = -1; dx <= 1; dx++) {
      const x = centerX + dx;
      let top = -1;
      for (let z = 35; z >= 26; z--) {
        if (get(x, y, z)) { top = z; break; }
      }
      if (top >= 29) {
        set(x, y, top, dx === 0 ? deepBlack : black);
        if (get(x, y, top - 1)) set(x, y, top - 1, black);
      }
    }
  }
}
for (let z = 28; z <= 33; z++) {
  for (const cx of [18, 24, 30]) {
    const x = cx + (cx < 24 ? Math.round((z - 28) * 0.23) :
                    cx > 24 ? -Math.round((z - 28) * 0.23) : 0);
    for (let dx = 0; dx <= 1; dx++) {
      for (let y = 3; y <= 12; y++) {
        if (get(x + dx, y, z)) {
          set(x + dx, y, z, black);
          break;
        }
      }
    }
  }
}

// Side-of-face tiger marks, away from the eyes.
for (const side of [-1, 1]) {
  for (let i = 0; i < 3; i++) {
    for (let z = 19 + i * 3; z <= 21 + i * 3; z++) {
      const x = 24 + side * (9 - Math.round((z - 19) * 0.16));
      for (let y = 5; y <= 13; y++) {
        if (get(x, y, z)) { set(x, y, z, black); break; }
      }
    }
  }
}

// Bright cheeks, chin and small smiling muzzle.
ellipsoid(19, 5, 20, 5, 3, 4, white);
ellipsoid(29, 5, 20, 5, 3, 4, white);
ellipsoid(24, 5, 16, 6, 3, 3, cream);
ellipsoid(21, 3, 18, 3, 2, 2, white);
ellipsoid(27, 3, 18, 3, 2, 2, white);

// Amber rings make the simple black dot eyes stand out.
for (const ex of [19, 29]) {
  ellipsoid(ex, 4, 26, 3, 2, 3, darkOrange);
  ellipsoid(ex, 3, 26, 2, 1, 2, "#ffc04b");
  ellipsoid(ex, 2, 26, 1, 1, 2, deepBlack);
  set(ex - 1, 1, 27, "#ffffff");
}
ellipsoid(24, 2, 20, 3, 2, 2, "#ed8692");
set(24, 0, 20, "#f5a5a8");
line(24, 2, 18, 24, 2, 16, 0, black);
set(23, 2, 16, black);
set(25, 2, 16, black);
for (const side of [-1, 1]) {
  set(24 + side * 5, 2, 19, black);
  set(24 + side * 6, 3, 20, black);
}

// Curved, ringed tail: the pivot is where it leaves the rump.
part("tail", [24, 40, 21]);
const tailPoints = [
  [24, 40, 21], [26, 42, 21], [29, 44, 22],
  [32, 44, 24], [35, 44, 26], [37, 43, 29],
  [38, 42, 31]
];
let step = 0;
for (let s = 0; s < tailPoints.length - 1; s++) {
  const a = tailPoints[s], b = tailPoints[s + 1];
  for (let t = 0; t < 3; t++, step++) {
    const f = t / 3;
    const x = Math.round(a[0] + (b[0] - a[0]) * f);
    const y = Math.round(a[1] + (b[1] - a[1]) * f);
    const z = Math.round(a[2] + (b[2] - a[2]) * f);
    sphere(x, y, z, step % 5 < 2 ? black : orange,);
  }
}
sphere(38, 42, 31, 2, black);
animate("tail", { type: "swing", axis: "y", speed: 2, amplitude: 0.3 });

// Independent short, sturdy walking legs.
function leg(name, x, y, speed) {
  part(name, [x, y, 14]);
  ellipsoid(x, y, 9, 4, 4, 7, darkOrange);
  box(x - 3, y - 3, 3, x + 3, y + 3, 12, orange);
  ellipsoid(x, y - 2, 3, 4, 4, 3, orange);
  box(x - 3, y - 4, 0, x + 3, y + 1, 2, orange);
  // Pale inner leg and the light front of the paw.
  box(x + (x < 24 ? 2 : -3), y - 2, 4,
      x + (x < 24 ? 3 : -2), y + 2, 9, cream);
  box(x - 2, y - 4, 1, x + 2, y - 4, 3, white);
  for (const toe of [-2, 0, 2]) {
    set(x + toe, y - 5, 1, "#a95023");
  }
  // A short black mark at the top of each leg.
  box(x - 3, y - 2, 12, x + 3, y, 14, black);
  animate(name, { type: "swing", axis: "x", speed, amplitude: 0.3 });
}
leg("frontLeft", 16, 17, 5);
leg("frontRight", 32, 17, -5);
leg("rearLeft", 16, 35, -5);
leg("rearRight", 32, 35, 5);
part("body", [24, 27, 19]);