← AnimalesObjeto 3Dfogon/tatu
Tatú
Arrastrá para girarlo// «Tatú» · gpt-6-sol (medium)
// A cartoon armadillo (tatú), horizontal along y, head at the front (-y): a domed body covered by banded armor plates in tan and greyish brown, a small pointed head with little ears and black eyes, short legs with claws and a ringed armored tail.
const fur = "#987258";
const furLight = "#b58a67";
const furDark = "#765743";
const shellLight = "#c9aa77";
const shellMid = "#b49367";
const shellDark = "#786b5d";
const seam = "#645b52";
const cream = "#ead5ae";
const black = "#211d1b";
// Solid, rounded body and soft belly.
ellipsoid(24, 25, 16, 13, 14, 12, fur);
for (let x = 11; x <= 37; x++)
for (let y = 11; y <= 39; y++)
for (let z = 4; z <= 28; z++) {
if (!get(x, y, z)) continue;
if (z < 14) {
set(x, y, z, rand() < 0.12 ? furDark : fur);
} else if (y >= 15 && y <= 38) {
// Broad armor bands run across the back, separated by dark grooves.
const groove = (y - 15) % 5;
const edge = Math.abs(x - 24) > 10;
let color = groove === 0 ? seam
: groove === 1 ? shellDark
: z >= 23 ? shellLight : shellMid;
if (edge && groove !== 0) color = shellDark;
if (groove >= 2 && !edge && rand() < 0.055) color = shellLight;
set(x, y, z, color);
} else {
set(x, y, z, z > 20 ? furLight : fur);
}
}
// Little raised scutes on the centers of the armor plates.
for (let y = 18; y <= 34; y += 5)
for (let x = 17; x <= 31; x += 4) {
let top = -1;
for (let z = 28; z >= 14; z--) {
if (get(x, y, z)) { top = z; break; }
}
if (top >= 20) {
set(x, y, top, "#ddbd88");
if (get(x + 1, y, top)) set(x + 1, y, top, shellLight);
}
}
// Big, friendly pointed head and pale tapered muzzle.
ellipsoid(24, 13, 19, 8, 8, 7, furLight);
ellipsoid(24, 8, 17, 5, 6, 4, "#c49a73");
ellipsoid(24, 5, 15, 3.5, 4, 2.8, "#d2ab82");
box(22, 2, 15, 26, 3, 16, furDark);
box(23, 2, 16, 25, 2, 17, black);
set(24, 2, 17, "#71615a");
line(23, 3, 13, 25, 3, 13, 0, furDark);
// Upright ears with darker, forward-facing interiors.
for (const x of [18, 30]) {
ellipsoid(x, 14, 25, 2.3, 2.7, 4, furDark);
ellipsoid(x, 12, 26, 1.4, 1, 2.4, "#bd8a7b");
set(x, 12, 29, furLight);
}
// Simple black dot eyes, placed on both sides of the face.
for (const x of [18, 30]) {
box(x, 8, 20, x + 1, 9, 21, black);
set(x, 7, 21, black);
set(x, 7, 22, "#fff6df");
}
// Long, tapering tail with distinct armored rings.
for (let y = 37; y <= 46; y++) {
const t = (y - 37) / 9;
const radius = 3.6 - 2.5 * t;
const cz = 11 - 4 * t;
const ring = (y - 37) % 3 === 0;
for (let x = Math.floor(24 - radius); x <= Math.ceil(24 + radius); x++)
for (let z = Math.floor(cz - radius); z <= Math.ceil(cz + radius); z++) {
if (((x - 24) / radius) ** 2 + ((z - cz) / radius) ** 2 <= 1) {
set(x, y, z, ring ? shellDark : z >= cz ? shellLight : shellMid);
}
}
}
// Four independent, short walking legs.
function leg(name, x, y, speed) {
part(name, [x, y, 13]);
ellipsoid(x, y, 10, 3.3, 3.3, 5, furDark);
ellipsoid(x, y - 0.5, 12, 3.5, 3.2, 2.8, shellMid);
box(x - 2, y - 2, 3, x + 2, y + 2, 9, fur);
ellipsoid(x, y - 1, 2, 3, 3.3, 2.2, furLight);
for (const dx of [-2, 0, 2]) {
box(x + dx, y - 4, 0, x + dx, y - 3, 1, cream);
}
animate(name, { type: "swing", axis: "x", speed, amplitude: 0.25 });
part("body", [24, 24, 16]);
}
leg("front-left", 15, 17, 6);
leg("front-right", 33, 17, -6);
leg("rear-left", 15, 33, -6);
leg("rear-right", 33, 33, 6);import { draw } from "./assets/voxel";
import { tatu } from "./assets/tatu";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, tatu, 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 tatu
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["tatu"] })
# Queda en client/assets/tatu.ts
# https://fogon.page/object/tatu