← Monstruos y enemigosObjeto 3Dfogon/arana-gigante
Araña gigante
Arrastrá para girarlo// «Araña gigante» · gpt-6-sol (medium)
// A giant cartoon spider seen standing, horizontal: a round black body with a big hairy abdomen at the back marked with a red hourglass, a smaller head at the front (-y) with a cluster of six glowing red eyes and two little fangs, and eight long jointed legs (four per side) arching up then down to the floor.
const ink = "#111019";
const shadow = "#1b1923";
const charcoal = "#292630";
const highlight = "#3b3541";
part("body");
// Eight independently animated legs. Each pivot sits at the body.
for (const side of [-1, 1]) {
const shoulders = [14, 20, 27, 34];
const knees = [8, 16, 34, 40];
const feet = [3, 12, 36, 44];
for (let i = 0; i < 4; i++) {
const name = `leg_${side < 0 ? "L" : "R"}_${i + 1}`;
const sx = 24 + side * (i === 0 ? 6 : 7);
const sy = shoulders[i];
const ky = knees[i];
const fy = feet[i];
const kx = 24 + side * (14 + (i % 2));
const ox = 24 + side * 19;
const fx = 24 + side * 21;
const kz = 27 + (i % 2);
part(name, [sx, sy, 18]);
// Thick, angular upper leg; long tapered descent to the floor.
line(sx, sy, 18, 24 + side * 10, (sy + ky) / 2, 25, 2.2, ink);
line(24 + side * 10, (sy + ky) / 2, 25, kx, ky, kz, 2.1, ink);
line(kx, ky, kz, ox, (ky + fy) / 2, 19, 1.9, ink);
line(ox, (ky + fy) / 2, 19, fx, fy, 2, 1.6, ink);
line(sx, sy, 19, 24 + side * 10, (sy + ky) / 2, 26, 1.05, charcoal);
line(24 + side * 10, (sy + ky) / 2, 26, kx, ky, kz + 1, 0.9, highlight);
line(kx, ky, kz, ox, (ky + fy) / 2, 20, 0.75, charcoal);
sphere(kx, ky, kz, 2.35, shadow);
sphere(kx, ky, kz + 1, 1.25, charcoal);
ellipsoid(fx, fy, 1, 2.1, 2, 1.2, ink);
set(fx, fy - 1, 2, charcoal);
animate(name, {
type: "swing",
axis: "x",
speed: (i + (side === 1 ? 1 : 0)) % 2 === 0 ? 6 : -6,
amplitude: 0.25
});
}
}
part("body");
// Round, heavy abdomen and smaller forward head.
ellipsoid(24, 30, 18, 9, 10, 8.3, ink);
ellipsoid(24, 30, 18.8, 8.5, 9.5, 7.7, shadow);
ellipsoid(24, 29, 20, 7.7, 8.6, 6.4, charcoal);
ellipsoid(24, 21, 17, 5, 6, 4.5, ink);
ellipsoid(24, 16, 18, 6.7, 6.3, 6, ink);
ellipsoid(24, 16, 18.6, 6.2, 5.8, 5.5, shadow);
ellipsoid(24, 15.5, 20, 5.6, 5.2, 4, charcoal);
// Sparse bristles give the abdomen a hairy outline without hiding its shape.
for (let i = 0; i < 220; i++) {
const a = rand() * Math.PI * 2;
const v = rand() * 1.8 - 0.9;
const ring = Math.sqrt(1 - v * v);
const x = 24 + 8.7 * Math.cos(a) * ring;
const y = 30 + 9.7 * Math.sin(a) * ring;
const z = 18 + 8.1 * v;
if (z < 12 || (y < 24 && z < 22)) continue;
const length = 0.8 + rand() * 1.5;
line(
x, y, z,
x + Math.cos(a) * length,
y + Math.sin(a) * length,
z + v * length + 0.3,
0,
rand() < 0.45 ? highlight : charcoal
);
}
// Broad red hourglass painted across the upper abdomen.
for (let y = 25; y <= 37; y++) {
const width = 0.75 + Math.abs(y - 31) * 0.43;
for (let x = Math.ceil(24 - width); x <= Math.floor(24 + width); x++) {
const nx = (x - 24) / 8.5;
const ny = (y - 30) / 9.5;
const inside = 1 - nx * nx - ny * ny;
if (inside <= 0) continue;
const z = Math.round(18.8 + 7.7 * Math.sqrt(inside)) + 1;
set(x, y, z, "#a8172b");
set(x, y, z + 1, Math.abs(x - 24) < width - 0.7 ? "#f03845" : "#c91d34");
}
}
set(24, 31, 28, "#ff6658");
// Six bright eyes, with the outer pair wrapping around the face.
const eyes = [
[19, 20.5, 1.15], [22, 21, 1.3], [26, 21, 1.3], [29, 20.5, 1.15],
[22, 17, 1.65], [26, 17, 1.65]
];
for (const [x, z, r] of eyes) {
const dx = (x - 24) / 6.7;
const dz = (z - 18) / 6;
const yf = 16 - 6.3 * Math.sqrt(Math.max(0.08, 1 - dx * dx - dz * dz));
sphere(x, yf - 0.5, z, r + 0.45, "#480e20");
sphere(x, yf - 1.15, z, r, "#ef243a");
set(x, Math.round(yf - r - 1), Math.round(z + 0.5), "#ff9a75");
}
// Friendly little pointed fangs beneath the eyes.
line(21, 10, 14, 21, 8, 11, 0.8, "#d6d2cd");
line(27, 10, 14, 27, 8, 11, 0.8, "#d6d2cd");
set(21, 8, 10, "#f4e9d8");
set(27, 8, 10, "#f4e9d8");import { draw } from "./assets/voxel";
import { aranaGigante } from "./assets/arana-gigante";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, aranaGigante, 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 arana-gigante
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["arana-gigante"] })
# Queda en client/assets/arana-gigante.ts
# https://fogon.page/object/arana-gigante