← Animals3D assetfogon/puma
Puma
Drag to turn it// «Puma» · gpt-6-sol (medium)
// A sleek cartoon puma, horizontal along y, head at the front (-y): a long tawny tan body with a lighter cream belly and muzzle, four strong legs, a round head with small rounded ears with dark backs, a pink nose, black marks beside the muzzle and green eyes. A long tail with a dark tip.
const tan = "#c9863e";
const lightTan = "#dfa052";
const darkTan = "#aa682f";
const cream = "#f5dfae";
const creamShade = "#e7c991";
const brown = "#563926";
const black = "#282522";
// Long, rounded body and broad haunches.
ellipsoid(24, 25, 19, 10, 13, 8, tan);
ellipsoid(24, 32, 18, 9, 7, 8, tan);
ellipsoid(24, 12, 26, 8, 7, 8, tan);
// Gentle fur shading, concentrated on visible upper surfaces.
forEach((x, y, z, color) => {
if (color !== tan) return;
if (z >= 26 && rand() < 0.72) set(x, y, z, lightTan);
else if (z < 16 && rand() < 0.32) set(x, y, z, darkTan);
else if (rand() < 0.035) set(x, y, z, lightTan);
});
// Cream underside, chest, and cheeks.
ellipsoid(24, 24, 13, 8, 10, 4, creamShade);
ellipsoid(24, 14, 18, 6, 5, 6, cream);
ellipsoid(20, 5, 23, 4, 3, 3, cream);
ellipsoid(28, 5, 23, 4, 3, 3, cream);
ellipsoid(24, 5, 21, 3, 2, 2, creamShade);
// Small round ears: dark backs and warm inner fronts.
for (const x of [18, 30]) {
ellipsoid(x, 11, 34, 3, 3, 4, brown);
ellipsoid(x, 9, 35, 2, 2, 3, lightTan);
ellipsoid(x, 7, 35, 1, 1, 2, brown);
}
// Green eyes with bold dark pupils and tiny highlights.
for (const x of [20, 28]) {
ellipsoid(x, 5, 29, 2, 1, 2, brown);
ellipsoid(x, 4, 29, 2, 1, 1, "#70ad57");
set(x, 3, 29, black);
set(x - 1, 3, 30, "#ffffff");
}
// Nose, mouth, and the puma's dark muzzle markings.
ellipsoid(24, 3, 25, 2, 2, 1, "#dc8190");
set(24, 2, 24, "#b96576");
line(24, 3, 23, 24, 3, 21, 0, brown);
line(24, 3, 21, 22, 4, 20, 0, brown);
line(24, 3, 21, 26, 4, 20, 0, brown);
for (const x of [17, 31]) {
ellipsoid(x, 6, 23, 1, 1, 2, brown);
set(x, 5, 24, black);
}
// Long tail, curling upward to a conspicuous dark tip.
line(24, 36, 21, 24, 40, 18, 2, tan);
line(24, 40, 18, 26, 43, 19, 2, tan);
line(26, 43, 19, 27, 45, 22, 2, brown);
sphere(27, 45, 22, 2, brown);
// Four independently swinging, sturdy toy-like legs.
const legs = [
{ name: "frontLeft", x: 17, y: 18, speed: 5 },
{ name: "frontRight", x: 31, y: 18, speed: -5 },
{ name: "rearLeft", x: 17, y: 32, speed: -5 },
{ name: "rearRight", x: 31, y: 32, speed: 5 }
];
for (const leg of legs) {
part(leg.name, [leg.x, leg.y, 16]);
ellipsoid(leg.x, leg.y, 10, 3, 3, 8, darkTan);
ellipsoid(leg.x, leg.y - 1, 9, 3, 3, 7, tan);
ellipsoid(leg.x, leg.y - 2, 2, 3, 4, 2, lightTan);
for (const dx of [-1, 1]) {
set(leg.x + dx, leg.y - 5, 1, creamShade);
}
animate(leg.name, {
type: "swing", axis: "x", speed: leg.speed, amplitude: 0.3
});
}
part("body");import { draw } from "./assets/voxel";
import { puma } from "./assets/puma";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, puma, 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 puma
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["puma"] })
# It lands in client/assets/puma.ts
# https://fogon.page/object/puma