← Animals3D assetfogon/buho
Búho
Drag to turn it// «Búho» · gpt-6-sol (medium)
// A round cartoon owl perched on a branch, facing front (-y): a brown feathered body with a lighter cream speckled belly, two pointed ear tufts, huge round yellow eyes with black pupils, a small hooked orange beak and folded wings.
// Branch, with a dark underside resting on the floor at z = 0.
line(5, 25, 0, 42, 25, 0, 1, "#60391f");
line(3, 25, 3, 44, 25, 3, 2.5, "#714327");
line(4, 25, 4, 43, 25, 4, 1, "#9b6335");
line(7, 25, 3, 3, 27, 9, 1.3, "#714327");
line(40, 25, 3, 45, 27, 8, 1.2, "#714327");
for (let x = 7; x <= 41; x += 5) {
line(x, 22, 3, x + 2, 22, 3, 0, "#ad7440");
}
// Rounded body.
ellipsoid(24, 24, 20, 12, 10, 12, "#89502d");
forEach((x, y, z, color) => {
if (color !== "#89502d") return;
const exposed = !get(x, y - 1, z) || !get(x, y, z + 1);
if (!exposed) return;
const n = rand();
if (z > 25 && n < 0.31) set(x, y, z, "#a96537");
else if (z < 16 && n < 0.27) set(x, y, z, "#744026");
else if (n < 0.12) set(x, y, z, "#a15e33");
});
// Plump cream bib with scattered feather flecks.
ellipsoid(24, 15, 19, 9, 3.4, 10, "#efd29d");
ellipsoid(24, 13, 22, 7, 1.5, 5, "#f9e3b5");
for (let x = 16; x <= 32; x++) {
for (let z = 11; z <= 27; z++) {
if (rand() > 0.19) continue;
for (let y = 11; y <= 18; y++) {
const c = get(x, y, z);
if ((c === "#efd29d" || c === "#f9e3b5") && !get(x, y - 1, z)) {
set(x, y, z, rand() < 0.7 ? "#d7ae73" : "#fff0ca");
break;
}
}
}
}
// Folded wings with overlapping feather tips.
for (const side of [-1, 1]) {
const x = 24 + side * 11;
ellipsoid(x, 22, 20, 4, 7, 9, "#713f27");
ellipsoid(x - side * 0.6, 20, 21, 3, 6, 7, "#a66336");
for (let i = 0; i < 3; i++) {
ellipsoid(
x + side * (0.7 + i * 0.3), 18 + i, 15 + i * 2,
1.5, 3, 2.5, i === 2 ? "#bd7942" : "#8b4e2c"
);
}
}
// Short feet gripping the branch.
for (const x of [18, 30]) {
ellipsoid(x, 19, 8, 3, 3, 3, "#c67529");
for (const dx of [-2, 0, 2]) {
line(x + dx * 0.5, 20, 6, x + dx, 15, 5, 1, "#eb9b35");
}
}
// The head turns at the neck.
part("head", [24, 24, 27]);
ellipsoid(24, 23, 32, 14, 11, 10, "#955930");
forEach((x, y, z, color) => {
if (color !== "#955930") return;
if (!get(x, y, z + 1) && z >= 35 && rand() < 0.37)
set(x, y, z, "#b47540");
else if (!get(x, y - 1, z) && rand() < 0.09)
set(x, y, z, "#ad6b3a");
});
// Pointed, outward-leaning ear tufts.
for (const side of [-1, 1]) {
ellipsoid(24 + side * 10, 22, 39, 4, 4, 3, "#834827");
for (let z = 39; z <= 46; z++) {
const t = z - 39;
const x = 24 + side * (10 + t * 0.62);
const r = Math.max(0.75, 3.1 - t * 0.38);
sphere(x, 22, z, r, t > 4 ? "#aa6635" : "#95562d");
}
line(
24 + side * 11, 20, 40,
24 + side * 14, 21, 45,
0, "#c58548"
);
}
// Pale face discs and huge yellow eyes.
for (const x of [17, 31]) {
ellipsoid(x, 11.5, 33.5, 7, 3, 7, "#d5a66b");
ellipsoid(x, 9.7, 34, 5.8, 1.2, 5.8, "#efc98d");
cylinder(x, 7, 34, 5.2, 3, "#643a27", "y");
cylinder(x, 6, 34, 4.5, 2, "#ffca40", "y");
cylinder(x, 5, 34.5, 3.5, 1, "#ffe26a", "y");
cylinder(x, 4, 34, 2.35, 2, "#211d20", "y");
sphere(x - 1, 3, 35.5, 0.85, "#ffffff");
}
// Brows and small hooked beak.
ellipsoid(17, 9, 40, 4, 1, 1, "#89502d");
ellipsoid(31, 9, 40, 4, 1, 1, "#89502d");
ellipsoid(24, 8, 29.5, 2.3, 2.8, 3, "#ed8c27");
ellipsoid(24, 6.7, 28, 1.5, 1.7, 2.5, "#f9a431");
set(24, 6, 26, "#bd5724");
animate("head", { type: "swing", axis: "z", speed: 1, amplitude: 0.5 });
part("body");import { draw } from "./assets/voxel";
import { buho } from "./assets/buho";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, buho, x, y, { size: 64, angle: 0, t: performance.now() / 1000 });
// size: its longest side, in px
// angle: turn on the floor, in radians
// t: seconds; if it moves, that animates it# In a terminal, in the game's folder
fogon assets add buho
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["buho"] })
# It lands in client/assets/buho.ts
# https://fogon.page/object/buho