← Basics3D assetfogon/corgi
Corgi
Drag to turn it// «Corgi» · gpt-6-sol (medium)
// Corgi («Corgi»).
// A short-legged, warm tan corgi facing -y.
const tan = "#bf7934", gold = "#d99443", lightTan = "#e6aa58";
const darkTan = "#995721", cream = "#f5eedb", white = "#fff9eb";
const shadow = "#d9d1bd";
// Solid, rounded body and pale underside.
ellipsoid(24, 28, 15, 11, 14, 8, tan);
ellipsoid(24, 28, 19, 10, 12, 5, gold);
ellipsoid(24, 28, 11, 8, 11, 3, shadow);
ellipsoid(24, 19, 15, 9, 5, 7, cream);
// Broad head, with its cheeks projecting toward the viewer.
ellipsoid(24, 14, 24, 11, 8, 9, gold);
ellipsoid(24, 17, 28, 9, 5, 4, lightTan);
ellipsoid(15, 12, 22, 3, 4, 6, tan);
ellipsoid(33, 12, 22, 3, 4, 6, tan);
// Subtle, block-sized flecks on the exposed golden fur.
forEach((x, y, z, color) => {
if ((color === gold || color === tan) &&
(!get(x, y - 1, z) || !get(x, y, z + 1)) && rand() < 0.075) {
set(x, y, z, rand() < 0.65 ? lightTan : darkTan);
}
});
// Tall, pointed ears: stepped silhouettes and dusky pink interiors.
for (const cx of [15, 33]) {
const widths = [4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0];
widths.forEach((w, i) => {
const z = 30 + i;
box(cx - w, 13, z, cx + w, 18, z,
i > 8 ? lightTan : (i % 3 === 0 ? lightTan : tan));
});
box(cx - 2, 12, 33, cx + 2, 12, 37, darkTan);
box(cx - 1, 11, 34, cx + 1, 11, 38, "#b97768");
box(cx, 12, 39, cx, 13, 40, "#a76556");
box(cx - 3, 14, 30, cx + 3, 18, 31, gold);
}
// White blaze between the eyes, tapering up the forehead.
box(22, 6, 26, 26, 8, 30, white);
box(23, 7, 31, 25, 10, 33, cream);
box(22, 5, 23, 26, 7, 26, white);
box(23, 4, 19, 25, 6, 23, white);
// Distinct white eye patches, dark eyes, and tiny highlights.
for (const cx of [17, 31]) {
ellipsoid(cx, 6, 24, 3, 2, 3, cream);
box(cx - 2, 4, 24, cx + 1, 5, 26, "#342c28");
box(cx - 1, 3, 24, cx + 1, 4, 26, "#171b1d");
set(cx - 1, 2, 26, "#ffffff");
box(cx - 3, 6, 19, cx, 8, 22, white);
}
// Plush white muzzle, black nose, smile and little pink tongue.
ellipsoid(20, 5, 17, 5, 3, 4, white);
ellipsoid(28, 5, 17, 5, 3, 4, white);
box(21, 3, 17, 27, 5, 19, cream);
box(22, 2, 19, 26, 3, 21, "#292725");
box(23, 1, 19, 25, 2, 20, "#17191b");
set(23, 1, 21, "#696967");
box(23, 3, 15, 25, 3, 17, "#49302c");
box(21, 3, 14, 23, 3, 14, "#49302c");
box(25, 3, 14, 27, 3, 14, "#49302c");
box(23, 2, 12, 25, 3, 15, "#d97680");
box(24, 1, 13, 25, 1, 14, "#f2a2a0");
// Short animated legs with oversized pale paws.
function leg(name, pivot, x, y, speed, amplitude) {
part(name, pivot);
ellipsoid(x, y, 9, 3, 3, 6, tan);
box(x - 2, y - 2, 4, x + 2, y + 2, 10, gold);
box(x - 2, y - 3, 1, x + 2, y + 2, 4, cream);
box(x - 3, y - 4, 0, x + 3, y + 1, 2, white);
box(x - 3, y - 4, 0, x + 3, y - 4, 0, shadow);
for (const dx of [-1, 1]) {
set(x + dx, y - 4, 2, cream);
}
animate(name, { type: "swing", axis: "x", speed, amplitude });
}
leg("front_left", [16.5, 18.5, 13], 16, 18, 5.5, 0.31);
leg("front_right", [31.5, 18.5, 13], 32, 18, -5.5, 0.31);
leg("rear_left", [16.5, 34, 12], 16, 35, -5.5, 0.27);
leg("rear_right", [31.5, 34, 12], 32, 35, 5.5, 0.27);
// Raised, fluffy little tail.
part("tail", [24, 39, 18.5]);
ellipsoid(24, 40, 20, 3, 4, 3, tan);
ellipsoid(24, 43, 23, 3, 3, 3, gold);
ellipsoid(24, 44, 25, 2, 2, 2, cream);
animate("tail", { type: "swing", axis: "z", speed: 8, amplitude: 0.55 });import { draw } from "./assets/voxel";
import { corgi } from "./assets/corgi";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, corgi, 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 corgi
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["corgi"] })
# It lands in client/assets/corgi.ts
# https://fogon.page/object/corgi