fogón

← AnimalesObjeto 3Dfogon/orca

Orca

de fogonCC012900 bloques
OrcaArrastrá para girarlo
// «Orca» · gpt-6-sol (medium)
// A cartoon orca, horizontal along y, head at the front (-y): a big glossy black body with a white belly and a white oval patch behind each eye, a tall black dorsal fin, two paddle flippers and a horizontal tail fluke.

const black = "#101820";
const dark = "#0a1119";
const shine = "#25313b";
const white = "#f7f8f2";
const shade = "#dce6e5";

// Rounded body and oversized head.
ellipsoid(24, 22, 16, 11, 17, 11, black);
ellipsoid(24, 13, 17, 10, 10, 10, black);
ellipsoid(24, 36, 15, 5, 7, 5, black);

// White underside reaches the floor.
ellipsoid(24, 18, 7, 8, 12, 7, white);
forEach((x, y, z, color) => {
  if (color !== black) return;
  const bellyLine = 12.3 + 2.7 * Math.exp(-Math.pow((y - 12) / 9, 2))
                    - 0.09 * Math.abs(x - 24);
  if (z <= bellyLine && y < 34) {
    set(x, y, z, z < 5 ? shade : white);
  } else if (rand() < 0.045) {
    set(x, y, z, z >= 22 ? shine : dark);
  }
});

// Broad paddle flippers, swept back from the shoulders.
for (const side of [-1, 1]) {
  line(24 + side * 8, 21, 11, 24 + side * 15, 28, 7, 2, black);
  ellipsoid(24 + side * 16, 29, 7, 4, 7, 2.5, black);
  ellipsoid(24 + side * 16, 29, 9, 2.5, 4.5, 1, shine);
}

// Tall, swept dorsal fin with a thick root.
ellipsoid(24, 27, 27, 4, 6, 3, dark);
for (let z = 28; z <= 43; z++) {
  const t = (z - 28) / 15;
  const cy = 26 + 3.5 * t;
  const halfX = Math.max(0, Math.round(3.5 * (1 - t)));
  const halfY = Math.max(0, Math.round(4.5 * (1 - t)));
  box(24 - halfX, Math.round(cy) - halfY, z,
      24 + halfX, Math.round(cy) + halfY, z,
      z > 38 ? black : dark);
}

// Bold oval eye patches on both sides, behind the tiny eyes.
for (const side of [-1, 1]) {
  ellipsoid(24 + side * 10, 19, 21, 1.5, 5, 3.3, white);
  ellipsoid(24 + side * 10.7, 18, 22, 0.8, 3.4, 1.7, "#ffffff");

  // Small, readable toy-like eyes with a single glossy highlight.
  ellipsoid(24 + side * 9, 9, 19, 1.4, 1.5, 1.5, white);
  set(24 + side * 10, 9, 19, dark);
  set(24 + side * 10, 8, 20, "#ffffff");
}

// A soft gloss across the top of the forehead.
ellipsoid(20, 12, 26, 2, 4, 0.7, shine);

// The fluke alone pivots up and down at the tail joint.
part("tail", [24, 39, 15]);
line(24, 39, 15, 24, 43, 15, 2, black);
for (const side of [-1, 1]) {
  ellipsoid(24 + side * 7, 43, 15, 8, 2.5, 1.5, black);
  line(24 + side * 8, 43, 15, 24 + side * 16, 45, 15, 1, dark);
  line(24 + side * 3, 43, 16, 24 + side * 10, 44, 16, 0, shine);
}
animate("tail", { type: "swing", axis: "x", speed: 3, amplitude: 0.35 });