fogón

← Animals3D assetfogon/zorro

Zorro

by fogonCC09529 blocks
ZorroDrag to turn it
// «Zorro» · gpt-6-sol (medium)
// A cartoon red fox, horizontal along y, head at the front (-y): a slim orange body with a white chest and belly, black socks on its four thin legs, a pointy face with a white muzzle, black nose, amber eyes and large pointy ears with black tips. A big bushy orange tail with a white tip.

const orange = "#ed7428";
const sunlit = "#fa9238";
const shadow = "#c95a25";
const cream = "#fff0d7";
const white = "#fff9eb";
const black = "#29252c";

// Rounded body, with a lighter back and a pale underside.
ellipsoid(24, 26, 20, 8, 11, 8, orange);
ellipsoid(24, 26, 15, 6, 9, 3, cream);
ellipsoid(24, 17, 20, 5, 4, 8, cream);

// Big, rounded head.
ellipsoid(24, 14, 27, 9, 8, 9, orange);

// Give the exposed orange fur a little top light and gentle variation.
forEach((x, y, z, color) => {
  if (color !== orange) return;
  if (!get(x, y, z + 1) && z >= 23 && rand() < 0.72) {
    set(x, y, z, sunlit);
  } else if (z < 20 && rand() < 0.13) {
    set(x, y, z, shadow);
  } else if (rand() < 0.045) {
    set(x, y, z, sunlit);
  }
});

// Tall triangular ears, pink inside and black at their points.
for (const cx of [18, 30]) {
  for (let z = 33; z <= 43; z++) {
    const t = z - 33;
    const halfWidth = t < 4 ? 3 : t < 8 ? 2 : t < 10 ? 1 : 0;
    const front = t < 7 ? 10 : 11;
    const back = t < 7 ? 15 : 14;
    box(cx - halfWidth, front, z, cx + halfWidth, back, z,
      z >= 40 ? black : t < 3 ? shadow : orange);
    if (z >= 35 && z <= 39) {
      box(cx - Math.min(halfWidth, 1), front - 1, z,
          cx + Math.min(halfWidth, 1), front - 1, z, "#edaa94");
    }
  }
}

// White cheeks and pointed muzzle.
ellipsoid(20, 9, 23, 3, 3, 3, white);
ellipsoid(28, 9, 23, 3, 3, 3, white);
ellipsoid(24, 8, 23, 4, 4, 2, white);
box(23, 6, 26, 25, 10, 27, sunlit);
box(23, 4, 23, 25, 5, 24, black);
set(24, 3, 24, "#393139");

// Amber eyes with little black pupils and white glints.
for (const cx of [20, 28]) {
  box(cx - 1, 7, 29, cx, 7, 30, "#e9a13a");
  box(cx - 1, 6, 29, cx, 6, 30, "#33252a");
  set(cx - 1, 5, 30, white);
}

// Four independently swinging legs.
function leg(name, cx, cy, speed) {
  part(name, [cx, cy, 17]);
  ellipsoid(cx, cy, 12, 3, 3, 5, orange);
  box(cx - 2, cy - 2, 5, cx + 2, cy + 2, 12, shadow);
  box(cx - 2, cy - 2, 2, cx + 2, cy + 2, 7, black);
  box(cx - 2, cy - 3, 0, cx + 2, cy + 2, 3, black);
  box(cx - 2, cy - 3, 3, cx + 2, cy - 3, 4, "#42353a");
  animate(name, { type: "swing", axis: "x", speed, amplitude: 0.3 });
}
leg("front-left", 18, 19, 5);
leg("front-right", 30, 19, -5);
leg("rear-left", 18, 31, -5);
leg("rear-right", 30, 31, 5);

// A high, oversized brush tail with a bold white tip.
part("tail", [24, 34, 24]);
ellipsoid(24, 36, 25, 4, 5, 4, shadow);
ellipsoid(24, 40, 29, 7, 7, 7, orange);
ellipsoid(24, 43, 30, 6, 5, 6, orange);

for (let x = 17; x <= 31; x++) {
  for (let y = 42; y <= 47; y++) {
    for (let z = 22; z <= 37; z++) {
      if (!get(x, y, z)) continue;
      const edge = y === 42 ? ((x + z) % 3 === 0) : y >= 44 || (x + z) % 4 !== 0;
      if (edge) set(x, y, z, z >= 32 ? white : cream);
    }
  }
}
animate("tail", { type: "swing", axis: "z", speed: 3, amplitude: 0.3 });