← Fantasy3D assetfogon/centauro
Centauro
Drag to turn it// «Centauro» · gpt-6-sol (medium)
// A cartoon centaur: the lower body of a chestnut-brown horse, horizontal along y with four legs and a dark tail at the back (+y), and at the front (-y) the upright torso of a muscular man with long dark hair, a leather chest strap and a bow held in one hand.
// Storybook centaur archer: front faces -y.
const chestnut = "#8b472c", coatLight = "#ad6540", coatDark = "#653821";
const skin = "#dca477", skinLight = "#efbd8a", skinShade = "#b97857";
const hair = "#30262c", hairLight = "#514049";
const leather = "#493126", brass = "#dcad52";
part("body");
// Solid, rounded horse body.
ellipsoid(24, 25, 19, 10, 15, 7, chestnut);
ellipsoid(24, 16, 20, 9, 7, 7, coatLight);
ellipsoid(24, 34, 20, 9, 6, 6, chestnut);
ellipsoid(24, 25, 15, 8, 12, 3, coatDark);
// Subtle highlights and freckles on the visible coat.
forEach((x, y, z, color) => {
if (color !== chestnut && color !== coatLight) return;
if (z > 20 && !get(x, y, z + 1) && rand() < 0.28)
set(x, y, z, rand() < 0.7 ? coatLight : "#bd7850");
else if (y < 25 && !get(x, y - 1, z) && rand() < 0.075)
set(x, y, z, "#bd7850");
});
// A small decorated blanket over the horse's back.
box(17, 24, 25, 31, 31, 26, "#354e50");
box(17, 25, 26, 31, 30, 26, "#517c78");
line(17, 24, 26, 31, 24, 26, 0, brass);
line(17, 31, 26, 31, 31, 26, 0, brass);
for (let x = 19; x <= 29; x += 3) set(x, 24, 26, "#9de0cb");
// The human waist rises naturally out of the horse's shoulders.
ellipsoid(24, 15, 27, 6, 5, 4, skinShade);
ellipsoid(24, 14, 31, 6, 4, 7, skin);
ellipsoid(21, 11, 34, 3, 2, 3, skinLight);
ellipsoid(27, 11, 34, 3, 2, 3, skinLight);
ellipsoid(24, 12, 29, 3, 2, 2, skinLight);
box(19, 13, 26, 29, 18, 27, leather);
line(19, 12, 27, 29, 12, 27, 0, brass);
// Diagonal leather chest strap and its chunky gold buckle.
line(19, 10, 36, 28, 10, 27, 1, leather);
line(20, 9, 36, 29, 9, 27, 0, "#986744");
box(23, 8, 31, 26, 9, 33, brass);
box(24, 7, 32, 25, 7, 32, leather);
// Neck, face, broad friendly features.
cylinder(24, 14, 36, 2.7, 4, skinShade);
ellipsoid(24, 13, 41, 5, 4, 4, skin);
ellipsoid(24, 9, 39, 2, 2, 2, skinLight);
ellipsoid(21, 9, 39, 2, 1, 1, "#ed9d82");
ellipsoid(27, 9, 39, 2, 1, 1, "#ed9d82");
// Long dark hair, swept back from the face.
ellipsoid(24, 14, 44, 5, 4, 1.5, hair);
ellipsoid(20, 17, 38, 2, 3, 7, hair);
ellipsoid(28, 17, 38, 2, 3, 7, hair);
line(19, 15, 42, 18, 18, 31, 1.5, hair);
line(29, 15, 42, 31, 18, 30, 1.5, hair);
line(21, 18, 43, 20, 19, 33, 0, hairLight);
line(28, 18, 44, 29, 19, 34, 0, hairLight);
box(19, 11, 43, 21, 13, 44, hair);
box(27, 11, 43, 29, 13, 44, hair);
// Big eyes, brows, nose and a smile, all on the -y side.
box(20, 8, 41, 22, 8, 42, "#fff2d8");
box(26, 8, 41, 28, 8, 42, "#fff2d8");
set(21, 7, 41, "#3a6b65");
set(27, 7, 41, "#3a6b65");
set(21, 6, 41, "#17262c");
set(27, 6, 41, "#17262c");
line(20, 8, 43, 22, 8, 43, 0, hair);
line(26, 8, 43, 28, 8, 43, 0, hair);
set(24, 7, 39, skinShade);
line(22, 8, 37, 26, 8, 37, 0, "#784747");
set(21, 8, 38, "#e7917f");
set(27, 8, 38, "#e7917f");
// One relaxed arm; the other reaches out to hold the bow.
sphere(18, 14, 35, 3, skin);
line(18, 13, 34, 16, 10, 30, 2.2, skin);
line(16, 10, 30, 19, 8, 27, 1.8, skinLight);
sphere(19, 8, 27, 2, skinLight);
sphere(30, 14, 35, 3, skin);
line(30, 13, 34, 35, 11, 32, 2.2, skin);
line(35, 11, 32, 40, 9, 33, 1.8, skinLight);
// Carved bow, taut string, amber fittings and a bright enchanted arrow.
line(39, 9, 24, 42, 9, 27, 1, leather);
line(42, 9, 27, 44, 9, 32, 1, "#825236");
line(44, 9, 32, 42, 9, 38, 1, "#825236");
line(42, 9, 38, 39, 9, 42, 1, leather);
line(39, 8, 24, 39, 8, 42, 0, "#b6b1a2");
box(38, 8, 23, 40, 10, 25, brass);
box(38, 8, 41, 40, 10, 43, brass);
sphere(44, 8, 32, 1.5, "#9a4ce1");
set(44, 7, 32, "#e9a3ff");
line(24, 7, 33, 44, 7, 33, 0, "#f3d39a");
sphere(43, 7, 33, 1, "#5af3e3");
set(44, 7, 33, "#d9fffa");
sphere(40, 9, 33, 2, skinLight);
// Four independent walking legs, each pivoting at its hip.
function horseLeg(name, x, y, phase) {
part(name, [x, y, 18]);
ellipsoid(x, y, 15, 3, 3.5, 5, chestnut);
line(x, y, 14, x, y + (y > 25 ? 1 : -1), 8, 2.1, chestnut);
sphere(x, y + (y > 25 ? 1 : -1), 8, 2.3, coatLight);
line(x, y + (y > 25 ? 1 : -1), 7, x, y, 3, 1.6, coatDark);
ellipsoid(x, y - 1, 1.5, 2.7, 3.2, 1.5, "#342b2a");
box(x - 2, y - 3, 0, x + 2, y + 1, 1, "#423332");
line(x - 2, y - 3, 1, x + 2, y - 3, 1, 0, "#806951");
animate(name, { type: "swing", axis: "x", speed: phase, amplitude: 0.3 });
}
horseLeg("front-left", 17, 15, 5);
horseLeg("front-right", 31, 15, -5);
horseLeg("rear-left", 17, 35, -5);
horseLeg("rear-right", 31, 35, 5);
// Dark, full tail with separate slow sideways motion.
part("tail", [24, 39, 22]);
line(24, 39, 22, 24, 42, 21, 2, hair);
line(24, 42, 21, 24, 43, 16, 2.2, hair);
ellipsoid(24, 43, 14, 2.5, 2, 5, hair);
line(23, 44, 18, 22, 44, 11, 0, hairLight);
line(25, 44, 18, 26, 44, 12, 0, hairLight);
animate("tail", { type: "swing", axis: "y", speed: 1.3, amplitude: 0.3 });import { draw } from "./assets/voxel";
import { centauro } from "./assets/centauro";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, centauro, 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 centauro
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["centauro"] })
# It lands in client/assets/centauro.ts
# https://fogon.page/object/centauro