fogón

← Animals3D assetfogon/gorila

Gorila

by fogonCC019500 blocks
GorilaDrag to turn it
// «Gorila» · gpt-6-sol (medium)
// A big chunky cartoon gorilla standing on its knuckles facing front (-y): a massive black body with a silver-grey back, very long thick arms, short legs, a dark grey leathery face and chest, a big brow, small eyes and a wide flat nose.

// Big, knuckle-walking silverback gorilla.
const fur = "#222326";
const furLight = "#303135";
const furDark = "#17181b";
const silver = "#929795";
const silverLight = "#b4b8b3";
const silverDark = "#737a79";
const skin = "#626567";
const skinLight = "#797b7a";
const skinDark = "#414346";

// Short, sturdy legs and broad feet.
for (const x of [18, 30]) {
  ellipsoid(x, 25, 8, 5, 5, 8, fur);
  ellipsoid(x, 19, 3, 5, 7, 3, furDark);
  for (const dx of [-3, 0, 3]) {
    ellipsoid(x + dx, 13, 2, 2, 3, 2, "#38393b");
  }
}

// Barrel-shaped body, with the silver saddle high on its back.
ellipsoid(24, 25, 22, 12, 11, 15, fur);
ellipsoid(24, 29, 28, 10, 7, 10, silverDark);
ellipsoid(24, 29, 29, 9, 6, 9, silver);
ellipsoid(24, 29, 34, 7, 5, 4, silverLight);

// A little irregular fur texture, only on exposed blocks.
forEach((x, y, z, color) => {
  if (
    (color === fur || color === silver || color === silverDark) &&
    (!get(x, y - 1, z) || !get(x, y, z + 1) ||
      !get(x + 1, y, z) || !get(x - 1, y, z))
  ) {
    const n = rand();
    if (color === fur && n < 0.13) set(x, y, z, n < 0.04 ? furDark : furLight);
    if (color === silver && n < 0.13)
      set(x, y, z, n < 0.035 ? silverDark : silverLight);
    if (color === silverDark && n < 0.09) set(x, y, z, silver);
  }
});

// Broad leathery chest, divided into two soft pectoral shapes.
ellipsoid(24, 15, 19, 8, 2, 7, skinDark);
ellipsoid(20, 15, 25, 5, 3, 7, skin);
ellipsoid(28, 15, 25, 5, 3, 7, skin);
ellipsoid(20, 13, 27, 4, 1, 4, skinLight);
ellipsoid(28, 13, 27, 4, 1, 4, skinLight);
line(24, 12, 28, 24, 13, 22, 0, skinDark);

// Oversized head and projecting, friendly gorilla face.
ellipsoid(24, 19, 35, 10, 9, 9, fur);
for (const x of [14, 34]) {
  ellipsoid(x, 17, 35, 3, 2, 4, fur);
  ellipsoid(x, 14, 35, 2, 1, 3, skin);
  ellipsoid(x, 13, 35, 1, 1, 2, skinDark);
}
ellipsoid(24, 10, 35, 8, 3, 7, skinDark);
ellipsoid(24, 8, 35, 7, 2, 6, skin);
ellipsoid(24, 7, 32, 6, 3, 3, skinLight);

// Heavy brow over small, bright dot eyes.
box(17, 7, 40, 31, 9, 41, fur);
ellipsoid(20, 7, 40, 4, 2, 2, furDark);
ellipsoid(28, 7, 40, 4, 2, 2, furDark);
for (const x of [21, 27]) {
  ellipsoid(x, 5, 38, 1, 1, 2, "#111214");
  set(x, 4, 39, "#ffffff");
}

// Wide flat nose, nostrils, and a small curved smile.
ellipsoid(24, 5, 34, 5, 2, 2, skinDark);
box(20, 4, 34, 28, 5, 35, skinLight);
for (const x of [21, 27]) ellipsoid(x, 3, 34, 1, 1, 1, "#252627");
line(20, 5, 29, 24, 4, 28, 0, skinDark);
line(24, 4, 28, 28, 5, 29, 0, skinDark);

// Each huge arm is hinged at its shoulder and rests on its knuckles.
for (const side of [-1, 1]) {
  const sx = 24 + side * 14;
  const name = side < 0 ? "leftArm" : "rightArm";
  part(name, [sx, 23, 32]);

  ellipsoid(sx, 23, 30, 5, 6, 6, fur);
  line(sx, 22, 30, sx + side, 19, 17, 4, fur);
  ellipsoid(sx + side, 19, 18, 5, 5, 8, furLight);
  line(sx + side, 19, 17, sx + side, 13, 5, 4, fur);
  ellipsoid(sx + side, 12, 4, 5, 5, 4, furDark);
  ellipsoid(sx + side, 9, 3, 5, 3, 3, skin);

  for (const dx of [-3, 0, 3]) {
    ellipsoid(sx + side + dx, 7, 2, 2, 2, 2, skinLight);
    set(sx + side + dx, 5, 2, skinDark);
  }

  animate(name, {
    type: "swing",
    axis: "x",
    speed: side < 0 ? 3 : -3,
    amplitude: 0.3
  });
}
part("body");