← AnimalesObjeto 3Dfogon/abeja
Abeja
Arrastrá para girarlo// «Abeja» · gpt-6-sol (medium)
// A chubby cartoon bee: a round yellow body with thick black stripes and a small stinger, a black round head with big eyes, antennae, little black legs and two transparent light blue wings on top.
// The bee faces toward -y.
part("bee", [24, 24, 0]);
// Six stubby legs and their rounded feet.
for (const y of [19, 27, 35]) {
for (const side of [-1, 1]) {
const hipX = 24 + side * 10;
const footX = 24 + side * 13;
line(hipX, y, 10, footX, y - 1, 3, 1.4, "#25242c");
ellipsoid(footX, y - 2, 2, 2.3, 2.5, 2, "#15151c");
box(footX - 1, y - 3, 1, footX, y - 3, 1, "#38363d");
}
}
// Plump yellow abdomen, with broad stripes that wrap all the way around.
for (let x = 10; x <= 38; x++) {
for (let y = 11; y <= 43; y++) {
for (let z = 4; z <= 32; z++) {
const q =
((x - 24) / 13.5) ** 2 +
((y - 27) / 16) ** 2 +
((z - 18) / 13.5) ** 2;
if (q > 1) continue;
const ripple = 0.28 * Math.sin(x * 0.62 + z * 0.3);
const band = y + ripple;
const striped =
(band >= 20 && band <= 24) ||
(band >= 29 && band <= 33) ||
(band >= 38 && band <= 41);
let color;
if (striped) {
color = z > 22 ? "#303037" : z < 13 ? "#15151b" : "#222228";
if (rand() < 0.035) color = "#3b393d";
} else {
color = z > 23 ? "#ffe24d" : z < 13 ? "#d99619" : "#ffc52f";
if (rand() < 0.07) color = z > 19 ? "#ffdc40" : "#eeb124";
}
set(x, y, z, color);
}
}
}
// A small tapered stinger at the back.
for (let y = 42; y <= 45; y++) {
const r = [2.6, 2, 1.2, 0.45][y - 42];
for (let x = 21; x <= 27; x++) {
for (let z = 15; z <= 21; z++) {
if ((x - 24) ** 2 + (z - 18) ** 2 <= r * r) {
set(x, y, z, y === 45 ? "#111118" : "#29272d");
}
}
}
}
// Oversized charcoal head, softly highlighted on top.
ellipsoid(24, 12, 23, 10, 10, 10, "#202027");
for (let x = 14; x <= 34; x++) {
for (let y = 2; y <= 22; y++) {
for (let z = 13; z <= 33; z++) {
const q =
((x - 24) / 10) ** 2 +
((y - 12) / 10) ** 2 +
((z - 23) / 10) ** 2;
if (q > 1) continue;
let color = z >= 27 ? "#34333a" : z < 18 ? "#18181e" : "#25242b";
if (rand() < 0.055) color = "#3c3a40";
set(x, y, z, color);
}
}
}
// Big friendly eyes facing the viewer.
for (const x of [20, 28]) {
ellipsoid(x, 3.5, 25, 3.1, 2, 3.7, "#f5f9f4");
ellipsoid(x, 1.9, 24.8, 1.65, 1.1, 2.25, "#101219");
set(x - 1, 0, 26, "#ffffff");
set(x, 0, 26, "#ffffff");
}
ellipsoid(17, 5.8, 19, 1.6, 0.8, 1, "#ae636c");
ellipsoid(31, 5.8, 19, 1.6, 0.8, 1, "#ae636c");
line(22, 3, 17, 24, 2, 16, 0, "#e59387");
line(24, 2, 16, 26, 3, 17, 0, "#e59387");
// Curled antennae with round tips.
line(20, 9, 31, 19, 8, 36, 1, "#26252b");
line(19, 8, 36, 17, 7, 38, 1, "#26252b");
ellipsoid(17, 7, 39, 2, 2, 2, "#19191f");
line(28, 9, 31, 29, 8, 36, 1, "#26252b");
line(29, 8, 36, 31, 7, 38, 1, "#26252b");
ellipsoid(31, 7, 39, 2, 2, 2, "#19191f");
animate("bee", { type: "bob", axis: "z", speed: 3, amplitude: 1 });
// Each broad, icy-blue wing is its own flapping part.
function wing(name, side) {
const pivotX = 24 + side * 7;
part(name, [pivotX, 25, 30]);
const cx = 24 + side * 15;
for (let x = cx - 9; x <= cx + 9; x++) {
for (let y = 18; y <= 37; y++) {
for (let z = 32; z <= 36; z++) {
const u = (x - cx) / 8.5;
const v = (y - (27 + side * (x - cx) * 0.3)) / 6.5;
const w = (z - 34) / 2;
const rim = u * u + v * v;
if (rim + w * w > 1) continue;
let color = rim > 0.77 ? "#83bbd0" : "#b9ebf0";
if (z >= 35 && rim < 0.58) color = "#d9f8f7";
if (z <= 33) color = "#91cbd9";
if (rand() < 0.045 && rim < 0.7) color = "#f0ffff";
set(x, y, z, color);
}
}
}
// A sturdy little attachment at the shoulder.
ellipsoid(pivotX, 25, 31, 2.5, 2.5, 1.5, "#9dd7e2");
}
wing("leftWing", -1);
wing("rightWing", 1);
animate("leftWing", { type: "swing", axis: "y", speed: 12, amplitude: 0.5 });
animate("rightWing", { type: "swing", axis: "y", speed: -12, amplitude: 0.5 });import { draw } from "./assets/voxel";
import { abeja } from "./assets/abeja";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, abeja, 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 abeja
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["abeja"] })
# Queda en client/assets/abeja.ts
# https://fogon.page/object/abeja