← AnimalesObjeto 3Dfogon/tucan
Tucán
Arrastrá para girarlo// «Tucán» · gpt-6-sol (medium)
// A cartoon toucan perched on a short branch, facing front (-y): a black body, white throat, a red patch under the tail, blue skin around the eyes and a huge colorful beak in bright orange and yellow with a black tip and a red line.
// Branch and its short support
cylinder(24, 26, 0, 3, 6, "#79502e");
line(7, 25, 5, 41, 25, 5, 2, "#80512e");
line(9, 25, 7, 39, 25, 7, 1, "#a66b38");
line(32, 25, 5, 37, 31, 7, 1, "#79502e");
for (let x = 9; x <= 39; x += 3) {
set(x, 23, 7, "#b77a43");
if (rand() > 0.5) set(x + 1, 27, 5, "#603b26");
}
// Tail, with the red patch showing beneath it
ellipsoid(24, 34, 15, 5, 6, 4, "#d33836");
ellipsoid(24, 37, 19, 5, 6, 2, "#191c24");
line(21, 37, 19, 20, 41, 18, 1, "#252935");
line(27, 37, 19, 28, 41, 18, 1, "#252935");
// Rounded body and big head
ellipsoid(24, 25, 18, 9, 8, 11, "#181b22");
ellipsoid(24, 24, 20, 7, 7, 8, "#23262e");
ellipsoid(24, 22, 32, 8, 7, 7, "#171a21");
ellipsoid(24, 17, 26, 5, 2, 8, "#f1eee0");
ellipsoid(24, 15, 29, 4, 1, 5, "#ffffff");
// Subtle speckles on the broad black surfaces
forEach((x, y, z, color) => {
if ((color === "#181b22" || color === "#171a21") && rand() < 0.045) {
set(x, y, z, rand() < 0.5 ? "#222630" : "#11151b");
}
});
// Short orange legs gripping the branch
for (const x of [20, 28]) {
box(x - 1, 23, 7, x + 1, 26, 11, "#dc8236");
box(x - 2, 20, 6, x + 2, 25, 7, "#f5a648");
for (const dx of [-2, 0, 2]) {
line(x + dx, 22, 6, x + dx, 19, 5, 0, "#f4a044");
}
}
// Bright blue eye surrounds, set to either side of the beak
for (const x of [17, 31]) {
ellipsoid(x, 16, 34, 3, 2, 3, "#168dc3");
ellipsoid(x, 14, 34, 2, 1, 2, "#45bde1");
ellipsoid(x, 13, 34, 1, 1, 1, "#101820");
set(x - 1, 12, 35, "#ffffff");
}
// Oversized, tapered beak pointing toward the viewer
for (let y = 3; y <= 18; y++) {
const t = (y - 3) / 15;
const width = 2.5 + 4 * t + 1.2 * Math.sin(Math.PI * t);
const height = 2.4 + 2.2 * t;
const centerZ = 32.5 + 0.5 * t;
for (let x = Math.ceil(24 - width); x <= Math.floor(24 + width); x++) {
for (let z = Math.ceil(centerZ - height); z <= Math.floor(centerZ + height); z++) {
const u = (x - 24) / width;
const v = (z - centerZ) / height;
if (u * u + v * v > 1) continue;
let color;
if (y <= 6) color = z >= centerZ ? "#252832" : "#11151d";
else if (z === 31 && y <= 16) color = "#e94738";
else if (z <= 30) color = "#ffd344";
else if (z <= 32) color = "#f4aa2f";
else color = z >= centerZ + height - 1 ? "#ffcf49" : "#fa842b";
set(x, y, z, color);
}
}
}
// Red line carried around the visible sides
for (let y = 7; y <= 16; y++) {
const t = (y - 3) / 15;
const edge = Math.floor(2.5 + 4 * t + 1.2 * Math.sin(Math.PI * t));
set(24 - edge, y, 32, "#dc4235");
set(24 + edge, y, 32, "#dc4235");
}
// Independently flapping wings
part("leftWing", [16, 25, 23]);
ellipsoid(13, 25, 19, 4, 6, 7, "#20242c");
ellipsoid(12, 24, 17, 3, 5, 5, "#30343d");
line(12, 22, 15, 11, 26, 13, 1, "#161a22");
animate("leftWing", { type: "swing", axis: "y", speed: 4, amplitude: 0.35 });
part("rightWing", [32, 25, 23]);
ellipsoid(35, 25, 19, 4, 6, 7, "#20242c");
ellipsoid(36, 24, 17, 3, 5, 5, "#30343d");
line(36, 22, 15, 37, 26, 13, 1, "#161a22");
animate("rightWing", { type: "swing", axis: "y", speed: -4, amplitude: 0.35 });import { draw } from "./assets/voxel";
import { tucan } from "./assets/tucan";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, tucan, 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 tucan
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["tucan"] })
# Queda en client/assets/tucan.ts
# https://fogon.page/object/tucan