← AnimalesObjeto 3Dfogon/tigre
Tigre
Arrastrá para girarlo// «Tigre» · gpt-6-sol (medium)
// A chunky cartoon tiger, horizontal along y, head at the front (-y): a bright orange body with bold black vertical stripes, white belly, chin and inner legs, a big round head with white cheeks, black stripes on the forehead, small round ears, a pink nose and amber eyes. A long orange tail ringed in black.
const orange = "#f58b1e";
const lightOrange = "#ffa52c";
const darkOrange = "#d96a16";
const black = "#202024";
const deepBlack = "#121417";
const white = "#fff5dc";
const cream = "#eee6cf";
// Rounded, solid torso.
ellipsoid(24, 27, 19, 11, 14, 9, orange);
forEach((x, y, z, color) => {
if (color !== orange) return;
if (z >= 23) set(x, y, z, rand() < 0.08 ? orange : lightOrange);
else if (z <= 15) set(x, y, z, rand() < 0.12 ? orange : darkOrange);
else if (rand() < 0.045) set(x, y, z, lightOrange);
});
// Four bold stripes wrap over the back and down both flanks.
for (const band of [19, 25, 31, 37]) {
for (let x = 13; x <= 35; x++) {
const yy = band + Math.round(Math.abs(x - 24) * 0.13);
for (let dy = 0; dy <= 1; dy++) {
let top = -1;
for (let z = 29; z >= 16; z--) {
if (get(x, yy + dy, z)) { top = z; break; }
}
if (top >= 21) {
set(x, yy + dy, top, black);
if (get(x, yy + dy, top - 1)) set(x, yy + dy, top - 1, deepBlack);
}
}
}
for (let z = 13; z <= 25; z++) {
const yy = band + Math.round((z - 19) * 0.22);
for (let dy = 0; dy <= 1; dy++) {
for (const side of [-1, 1]) {
let edge;
for (let x = side < 0 ? 13 : 35;
side < 0 ? x <= 24 : x >= 24;
x -= side) {
if (get(x, yy + dy, z)) { edge = x; break; }
}
if (edge !== undefined) {
set(edge, yy + dy, z, black);
if (get(edge - side, yy + dy, z))
set(edge - side, yy + dy, z, black);
}
}
}
}
}
// Soft white underside, left visible between the legs.
ellipsoid(24, 25, 12, 8, 11, 4, cream);
ellipsoid(24, 18, 13, 7, 5, 4, white);
// Oversized toy-like head.
ellipsoid(24, 13, 24, 11, 9, 11, orange);
forEach((x, y, z, color) => {
if (color !== orange || y > 23 || z < 15) return;
if (z >= 28) set(x, y, z, rand() < 0.09 ? orange : lightOrange);
else if (z <= 19 && rand() < 0.35) set(x, y, z, darkOrange);
});
// Rounded ears with dark rims and pink inner patches.
for (const ex of [15, 33]) {
sphere(ex, 10, 33, 4, black);
sphere(ex, 9, 34, 3, orange);
ellipsoid(ex, 6, 34, 2, 1, 2, "#e98e83");
set(ex, 5, 35, "#f6b0a0");
}
// Forehead stripes: visible from above and from the front.
for (let y = 6; y <= 18; y++) {
for (const side of [-1, 0, 1]) {
const centerX = side === 0 ? 24 :
24 + side * (6 - Math.round((y - 6) * 0.16));
for (let dx = -1; dx <= 1; dx++) {
const x = centerX + dx;
let top = -1;
for (let z = 35; z >= 26; z--) {
if (get(x, y, z)) { top = z; break; }
}
if (top >= 29) {
set(x, y, top, dx === 0 ? deepBlack : black);
if (get(x, y, top - 1)) set(x, y, top - 1, black);
}
}
}
}
for (let z = 28; z <= 33; z++) {
for (const cx of [18, 24, 30]) {
const x = cx + (cx < 24 ? Math.round((z - 28) * 0.23) :
cx > 24 ? -Math.round((z - 28) * 0.23) : 0);
for (let dx = 0; dx <= 1; dx++) {
for (let y = 3; y <= 12; y++) {
if (get(x + dx, y, z)) {
set(x + dx, y, z, black);
break;
}
}
}
}
}
// Side-of-face tiger marks, away from the eyes.
for (const side of [-1, 1]) {
for (let i = 0; i < 3; i++) {
for (let z = 19 + i * 3; z <= 21 + i * 3; z++) {
const x = 24 + side * (9 - Math.round((z - 19) * 0.16));
for (let y = 5; y <= 13; y++) {
if (get(x, y, z)) { set(x, y, z, black); break; }
}
}
}
}
// Bright cheeks, chin and small smiling muzzle.
ellipsoid(19, 5, 20, 5, 3, 4, white);
ellipsoid(29, 5, 20, 5, 3, 4, white);
ellipsoid(24, 5, 16, 6, 3, 3, cream);
ellipsoid(21, 3, 18, 3, 2, 2, white);
ellipsoid(27, 3, 18, 3, 2, 2, white);
// Amber rings make the simple black dot eyes stand out.
for (const ex of [19, 29]) {
ellipsoid(ex, 4, 26, 3, 2, 3, darkOrange);
ellipsoid(ex, 3, 26, 2, 1, 2, "#ffc04b");
ellipsoid(ex, 2, 26, 1, 1, 2, deepBlack);
set(ex - 1, 1, 27, "#ffffff");
}
ellipsoid(24, 2, 20, 3, 2, 2, "#ed8692");
set(24, 0, 20, "#f5a5a8");
line(24, 2, 18, 24, 2, 16, 0, black);
set(23, 2, 16, black);
set(25, 2, 16, black);
for (const side of [-1, 1]) {
set(24 + side * 5, 2, 19, black);
set(24 + side * 6, 3, 20, black);
}
// Curved, ringed tail: the pivot is where it leaves the rump.
part("tail", [24, 40, 21]);
const tailPoints = [
[24, 40, 21], [26, 42, 21], [29, 44, 22],
[32, 44, 24], [35, 44, 26], [37, 43, 29],
[38, 42, 31]
];
let step = 0;
for (let s = 0; s < tailPoints.length - 1; s++) {
const a = tailPoints[s], b = tailPoints[s + 1];
for (let t = 0; t < 3; t++, step++) {
const f = t / 3;
const x = Math.round(a[0] + (b[0] - a[0]) * f);
const y = Math.round(a[1] + (b[1] - a[1]) * f);
const z = Math.round(a[2] + (b[2] - a[2]) * f);
sphere(x, y, z, step % 5 < 2 ? black : orange,);
}
}
sphere(38, 42, 31, 2, black);
animate("tail", { type: "swing", axis: "y", speed: 2, amplitude: 0.3 });
// Independent short, sturdy walking legs.
function leg(name, x, y, speed) {
part(name, [x, y, 14]);
ellipsoid(x, y, 9, 4, 4, 7, darkOrange);
box(x - 3, y - 3, 3, x + 3, y + 3, 12, orange);
ellipsoid(x, y - 2, 3, 4, 4, 3, orange);
box(x - 3, y - 4, 0, x + 3, y + 1, 2, orange);
// Pale inner leg and the light front of the paw.
box(x + (x < 24 ? 2 : -3), y - 2, 4,
x + (x < 24 ? 3 : -2), y + 2, 9, cream);
box(x - 2, y - 4, 1, x + 2, y - 4, 3, white);
for (const toe of [-2, 0, 2]) {
set(x + toe, y - 5, 1, "#a95023");
}
// A short black mark at the top of each leg.
box(x - 3, y - 2, 12, x + 3, y, 14, black);
animate(name, { type: "swing", axis: "x", speed, amplitude: 0.3 });
}
leg("frontLeft", 16, 17, 5);
leg("frontRight", 32, 17, -5);
leg("rearLeft", 16, 35, -5);
leg("rearRight", 32, 35, 5);
part("body", [24, 27, 19]);import { draw } from "./assets/voxel";
import { tigre } from "./assets/tigre";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, tigre, 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 tigre
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["tigre"] })
# Queda en client/assets/tigre.ts
# https://fogon.page/object/tigre