← AnimalesObjeto 3Dfogon/zorro
Zorro
Arrastrá para girarlo// «Zorro» · gpt-6-sol (medium)
// A cartoon red fox, horizontal along y, head at the front (-y): a slim orange body with a white chest and belly, black socks on its four thin legs, a pointy face with a white muzzle, black nose, amber eyes and large pointy ears with black tips. A big bushy orange tail with a white tip.
const orange = "#ed7428";
const sunlit = "#fa9238";
const shadow = "#c95a25";
const cream = "#fff0d7";
const white = "#fff9eb";
const black = "#29252c";
// Rounded body, with a lighter back and a pale underside.
ellipsoid(24, 26, 20, 8, 11, 8, orange);
ellipsoid(24, 26, 15, 6, 9, 3, cream);
ellipsoid(24, 17, 20, 5, 4, 8, cream);
// Big, rounded head.
ellipsoid(24, 14, 27, 9, 8, 9, orange);
// Give the exposed orange fur a little top light and gentle variation.
forEach((x, y, z, color) => {
if (color !== orange) return;
if (!get(x, y, z + 1) && z >= 23 && rand() < 0.72) {
set(x, y, z, sunlit);
} else if (z < 20 && rand() < 0.13) {
set(x, y, z, shadow);
} else if (rand() < 0.045) {
set(x, y, z, sunlit);
}
});
// Tall triangular ears, pink inside and black at their points.
for (const cx of [18, 30]) {
for (let z = 33; z <= 43; z++) {
const t = z - 33;
const halfWidth = t < 4 ? 3 : t < 8 ? 2 : t < 10 ? 1 : 0;
const front = t < 7 ? 10 : 11;
const back = t < 7 ? 15 : 14;
box(cx - halfWidth, front, z, cx + halfWidth, back, z,
z >= 40 ? black : t < 3 ? shadow : orange);
if (z >= 35 && z <= 39) {
box(cx - Math.min(halfWidth, 1), front - 1, z,
cx + Math.min(halfWidth, 1), front - 1, z, "#edaa94");
}
}
}
// White cheeks and pointed muzzle.
ellipsoid(20, 9, 23, 3, 3, 3, white);
ellipsoid(28, 9, 23, 3, 3, 3, white);
ellipsoid(24, 8, 23, 4, 4, 2, white);
box(23, 6, 26, 25, 10, 27, sunlit);
box(23, 4, 23, 25, 5, 24, black);
set(24, 3, 24, "#393139");
// Amber eyes with little black pupils and white glints.
for (const cx of [20, 28]) {
box(cx - 1, 7, 29, cx, 7, 30, "#e9a13a");
box(cx - 1, 6, 29, cx, 6, 30, "#33252a");
set(cx - 1, 5, 30, white);
}
// Four independently swinging legs.
function leg(name, cx, cy, speed) {
part(name, [cx, cy, 17]);
ellipsoid(cx, cy, 12, 3, 3, 5, orange);
box(cx - 2, cy - 2, 5, cx + 2, cy + 2, 12, shadow);
box(cx - 2, cy - 2, 2, cx + 2, cy + 2, 7, black);
box(cx - 2, cy - 3, 0, cx + 2, cy + 2, 3, black);
box(cx - 2, cy - 3, 3, cx + 2, cy - 3, 4, "#42353a");
animate(name, { type: "swing", axis: "x", speed, amplitude: 0.3 });
}
leg("front-left", 18, 19, 5);
leg("front-right", 30, 19, -5);
leg("rear-left", 18, 31, -5);
leg("rear-right", 30, 31, 5);
// A high, oversized brush tail with a bold white tip.
part("tail", [24, 34, 24]);
ellipsoid(24, 36, 25, 4, 5, 4, shadow);
ellipsoid(24, 40, 29, 7, 7, 7, orange);
ellipsoid(24, 43, 30, 6, 5, 6, orange);
for (let x = 17; x <= 31; x++) {
for (let y = 42; y <= 47; y++) {
for (let z = 22; z <= 37; z++) {
if (!get(x, y, z)) continue;
const edge = y === 42 ? ((x + z) % 3 === 0) : y >= 44 || (x + z) % 4 !== 0;
if (edge) set(x, y, z, z >= 32 ? white : cream);
}
}
}
animate("tail", { type: "swing", axis: "z", speed: 3, amplitude: 0.3 });import { draw } from "./assets/voxel";
import { zorro } from "./assets/zorro";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, zorro, 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 zorro
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["zorro"] })
# Queda en client/assets/zorro.ts
# https://fogon.page/object/zorro