← Antiguo y prehistoriaObjeto 3Dfogon/anquilosaurio
Anquilosaurio
Arrastrá para girarlo// «Anquilosaurio» · gpt-6-sol (medium)
// A low wide armored cartoon ankylosaurus on four stubby legs, body horizontal along y and almost as wide as it is long. The back is covered in a shell of bumpy brown armor plates with rows of short cream spikes along the sides; a small flat head at the front (-y); at the back a long tail ending in a big round bony club. Earthy brown and khaki.
// Low, wide body with a darker armored back.
ellipsoid(24, 23, 16, 15, 13, 9, "#77734e");
ellipsoid(24, 23, 13, 14, 12, 5, "#9a9166");
ellipsoid(24, 23, 20, 16, 12, 7, "#594a34");
ellipsoid(24, 23, 21, 15, 12, 7, "#796244");
// Subtle earthy variation on the large surfaces.
forEach((x, y, z, color) => {
if (color === "#796244" && rand() < 0.055)
set(x, y, z, rand() < 0.5 ? "#8b704b" : "#69563c");
if (color === "#9a9166" && rand() < 0.035)
set(x, y, z, "#aaa076");
});
// Rounded armor plates, each with a dark rim and a lighter raised center.
for (let row = 0; row < 4; row++) {
const yy = 15 + row * 5;
for (let col = 0; col < 4; col++) {
const xx = 15 + col * 6 + (row % 2);
const slope = 1 - (xx - 24) ** 2 / 225 - (yy - 23) ** 2 / 144;
const zz = Math.round(21 + 7 * Math.sqrt(Math.max(0, slope)));
ellipsoid(xx, yy, zz, 3, 3, 2, "#483b2e");
ellipsoid(xx, yy, zz + 1, 3, 2, 2,
(row + col) % 3 === 0 ? "#a18459" : "#94764e");
ellipsoid(xx - 1, yy - 1, zz + 2, 1, 1, 1, "#b49a6b");
}
}
// Short cream spikes projecting from both sides of the shell.
for (const yy of [15, 20, 25, 30]) {
for (const side of [-1, 1]) {
const rootX = 24 + side * 14;
const zz = yy === 15 || yy === 30 ? 20 : 22;
ellipsoid(rootX, yy, zz, 2, 2, 2, "#ad936b");
for (let t = 0; t < 5; t++) {
const x = rootX + side * (t + 1);
const half = t < 2 ? 2 : t < 4 ? 1 : 0;
box(x, yy - half, zz - half, x, yy + half, zz + half,
t < 2 ? "#d6c39a" : "#f0dfb8");
}
}
}
// Small, broad, friendly head and flat muzzle.
ellipsoid(24, 11, 17, 9, 7, 5, "#807a54");
ellipsoid(24, 8, 15, 9, 5, 3, "#a79b70");
ellipsoid(24, 6, 14, 8, 3, 2, "#b2a77b");
box(19, 3, 12, 29, 3, 12, "#65593f");
for (const eyeX of [19, 29]) {
ellipsoid(eyeX, 6, 20, 2, 2, 2, "#d3c198");
ellipsoid(eyeX, 4, 20, 1, 1, 2, "#26251f");
set(eyeX, 3, 21, "#fff7dc");
}
set(21, 3, 15, "#594c3b");
set(27, 3, 15, "#594c3b");
// Four independently swinging, chunky legs.
function leg(name, x, y, speed) {
part(name, [x, y, 13]);
ellipsoid(x, y, 11, 5, 5, 5, "#706a49");
ellipsoid(x, y - 1, 6, 4, 4, 6, "#827a54");
ellipsoid(x, y - 3, 2, 5, 5, 2, "#a09469");
for (const dx of [-3, 0, 3]) {
box(x + dx, y - 8, 0, x + dx + 1, y - 6, 1, "#ded0a9");
}
animate(name, { type: "swing", axis: "x", speed, amplitude: 0.3 });
}
leg("front-left", 13, 17, 4);
leg("front-right", 35, 17, -4);
leg("rear-left", 13, 30, -4);
leg("rear-right", 35, 30, 4);
// Tapered tail and oversized knobby bony club.
part("tail", [24, 34, 16]);
ellipsoid(24, 36, 16, 5, 5, 4, "#6f6548");
ellipsoid(24, 39, 15, 3, 5, 3, "#877655");
ellipsoid(24, 43, 15, 5, 4, 4, "#675841");
ellipsoid(24, 42, 16, 5, 3, 4, "#a18b62");
ellipsoid(21, 43, 16, 2, 2, 2, "#b49c70");
ellipsoid(27, 43, 16, 2, 2, 2, "#8d7653");
ellipsoid(24, 46, 15, 2, 1, 2, "#8c7754");
animate("tail", { type: "swing", axis: "z", speed: 2.5, amplitude: 0.4 });
part("body");import { draw } from "./assets/voxel";
import { anquilosaurio } from "./assets/anquilosaurio";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, anquilosaurio, 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 anquilosaurio
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["anquilosaurio"] })
# Queda en client/assets/anquilosaurio.ts
# https://fogon.page/object/anquilosaurio