← AnimalesObjeto 3Dfogon/paloma
Paloma
Arrastrá para girarlo// «Paloma» · gpt-6-sol (medium)
// A plump cartoon pigeon standing facing front (-y): a grey body with darker wing bars, an iridescent green and purple neck, a small dark beak with a white bump, orange eyes and pink feet.
// A plump pigeon, facing -y.
const grey = "#929ba5";
const lightGrey = "#b4bdc4";
const wingGrey = "#78838f";
const darkGrey = "#48515e";
// Short pink legs, each swinging from its own hip.
for (const [name, x, speed] of [
["leftLeg", 19, 5],
["rightLeg", 29, -5],
]) {
part(name, [x, 25, 10]);
ellipsoid(x, 25, 7, 2.5, 2.5, 4, "#d98396");
box(x - 2, 23, 2, x + 2, 27, 7, "#dc8b9b");
ellipsoid(x, 21, 2, 3, 5, 2, "#e596a3");
for (const dx of [-2, 0, 2]) {
ellipsoid(x + dx, 16, 1, 1.5, 4, 1.5, "#f0a4ad");
set(x + dx, 13, 1, "#f4b4b9");
}
animate(name, { type: "swing", axis: "x", speed, amplitude: 0.3 });
}
part("body", [24, 25, 18]);
// Tail feathers peek out behind the round body.
for (const [x, color] of [
[19, "#727e89"], [22, "#929da6"], [25, "#a1aab2"],
[28, "#89949e"], [31, "#687581"],
]) {
ellipsoid(x, 38, 18, 2.5, 7, 3, color);
}
// Big, solid pear-shaped body and pale breast.
ellipsoid(24, 26, 18, 14, 13, 15, grey);
forEach((x, y, z, color) => {
if (color !== grey) return;
if (z > 27) set(x, y, z, "#a7b0b8");
else if (z < 11) set(x, y, z, "#7e8994");
else if (rand() < 0.045) set(x, y, z, "#9fa9b1");
});
ellipsoid(24, 14, 18, 10, 3, 11, lightGrey);
ellipsoid(24, 12, 17, 7, 1.5, 8, "#c3c9ca");
// Chunky folded wings, with two bold bars on each outside face.
for (const [x, side] of [[12, -1], [36, 1]]) {
ellipsoid(x, 27, 21, 4, 9, 10, wingGrey);
ellipsoid(x + side, 25, 24, 2, 7, 6, "#929da7");
for (const [z, shade] of [[24, darkGrey], [19, "#535d69"]]) {
line(x + side * 3, 20, z + 2,
x + side * 3, 33, z - 2, 1.2, shade);
}
ellipsoid(x + side * 2, 33, 16, 2, 3, 2, "#66727e");
}
// An iridescent neck: purple at the sides, green across the front.
ellipsoid(24, 17, 27, 8, 8, 8, "#65497f");
ellipsoid(24, 14, 26, 7, 5, 6, "#318b78");
ellipsoid(24, 10, 25, 5, 1.5, 3, "#53ad80");
for (const x of [18, 30]) {
ellipsoid(x, 13, 28, 2, 2, 3, "#85619b");
}
ellipsoid(24, 13, 29, 5, 2, 1.5, "#497e92");
// The whole head, including its face and beak, bobs at the neck joint.
part("head", [24, 18, 29]);
ellipsoid(24, 17, 34, 10, 9, 9, "#a3adb6");
ellipsoid(24, 15, 38, 8, 7, 4, "#b8c1c7");
ellipsoid(24, 9, 32, 7, 2, 5, "#aeb7bf");
// Oversized orange eyes with simple black dot pupils.
for (const x of [19, 29]) {
sphere(x, 9, 35, 2.5, "#db743f");
sphere(x, 7, 35, 1.65, "#f5a34d");
sphere(x, 5.5, 35, 1.15, "#202936");
set(x - 1, 5, 36, "#ffffff");
}
// White cere above a small, tapered charcoal beak.
ellipsoid(24, 8, 31, 3, 2, 2, "#f2eee6");
ellipsoid(22, 8, 31, 1.5, 2, 1.5, "#ffffff");
ellipsoid(26, 8, 31, 1.5, 2, 1.5, "#ffffff");
box(22, 5, 28, 26, 8, 30, "#404550");
box(23, 3, 28, 25, 5, 29, "#303540");
set(24, 3, 27, "#262c36");
animate("head", { type: "swing", axis: "x", speed: 6, amplitude: 0.25 });
part("body", [24, 25, 18]);import { draw } from "./assets/voxel";
import { paloma } from "./assets/paloma";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, paloma, x, y, { size: 64, angle: 0, t: performance.now() / 1000 });
// size: lo que mide en px su lado más largo
// angle: giro sobre el piso, en radianes
// t: segundos; si se mueve, se anima solo con eso# En una terminal, en la carpeta del juego
fogon assets add paloma
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["paloma"] })
# Queda en client/assets/paloma.ts
# https://fogon.page/object/paloma