← Animals3D assetfogon/orca
Orca
Drag to turn it// «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 });import { draw } from "./assets/voxel";
import { orca } from "./assets/orca";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, orca, x, y, { size: 64, angle: 0, t: performance.now() / 1000 });
// size: its longest side, in px
// angle: turn on the floor, in radians
// t: seconds; if it moves, that animates it# In a terminal, in the game's folder
fogon assets add orca
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["orca"] })
# It lands in client/assets/orca.ts
# https://fogon.page/object/orca