← Asian3D assetfogon/tanuki
Tanuki
Drag to turn it// «Tanuki» · gpt-6-sol (medium)
// A round chubby cartoon tanuki (raccoon dog) standing upright like the classic statue: brown and tan fur, a dark mask around the eyes, big round belly lighter in color, a straw hat on its head, a little sake bottle in one paw, short legs and a fat striped tail.
// Short feet and a broad, upright body.
for (const x of [19, 29]) {
ellipsoid(x, 23, 5, 4, 5, 6, "#70452f");
ellipsoid(x, 19, 2, 5, 6, 2, "#8c5a39");
box(x - 3, 15, 0, x + 3, 22, 1, "#65402d");
}
ellipsoid(24, 24, 20, 12, 10, 14, "#795038");
ellipsoid(24, 19, 20, 11, 8, 13, "#9c6947");
ellipsoid(24, 16, 19, 10, 5, 12, "#704631");
ellipsoid(24, 14, 19, 9, 4, 11, "#dbba84");
ellipsoid(24, 10.5, 21, 6, 1, 5, "#e8c997");
// Fur flecks on exposed surfaces.
forEach((x, y, z, color) => {
if (
(color === "#9c6947" || color === "#795038") &&
(get(x, y - 1, z) === undefined || get(x, y, z + 1) === undefined) &&
rand() < 0.085
) {
set(x, y, z, rand() < 0.5 ? "#b17b52" : "#68432f");
}
});
// Head, ears, and little cheek tufts.
ellipsoid(14, 21, 37, 4, 3, 5, "#754730");
ellipsoid(34, 21, 37, 4, 3, 5, "#754730");
ellipsoid(14, 18, 38, 2, 1, 3, "#c58b67");
ellipsoid(34, 18, 38, 2, 1, 3, "#c58b67");
ellipsoid(24, 21, 33, 10, 8, 8, "#9b6948");
ellipsoid(24, 17, 36, 9, 5, 4, "#bd8c60");
ellipsoid(17, 15, 29, 3, 3, 3, "#b48156");
ellipsoid(31, 15, 29, 3, 3, 3, "#b48156");
// Distinctive dark eye mask, bright eyes, and a soft muzzle.
ellipsoid(19, 13, 34, 5, 3, 4, "#50372e");
ellipsoid(29, 13, 34, 5, 3, 4, "#50372e");
ellipsoid(20, 10, 35, 2, 1, 2, "#f3dfb5");
ellipsoid(28, 10, 35, 2, 1, 2, "#f3dfb5");
set(20, 8, 35, "#211e1c");
set(28, 8, 35, "#211e1c");
set(19, 8, 36, "#ffffff");
set(27, 8, 36, "#ffffff");
ellipsoid(21, 11, 29, 4, 3, 3, "#e5c397");
ellipsoid(27, 11, 29, 4, 3, 3, "#e5c397");
ellipsoid(24, 8, 31, 2, 2, 1, "#302923");
set(24, 8, 29, "#584032");
for (const x of [19, 21, 27, 29]) set(x, 8, 28, "#674636");
// The broad woven straw hat has a slightly raised outer lip.
for (let x = 8; x <= 40; x++) {
for (let y = 9; y <= 33; y++) {
const d = ((x - 24) / 16) ** 2 + ((y - 21) / 12) ** 2;
if (d > 1) continue;
set(x, y, 39, "#806037");
set(x, y, 40, d > 0.82 ? "#e4bb71" : "#caa05d");
if (d > 0.83) set(x, y, 41, "#efca80");
if (d > 0.95 && (x < 12 || x > 36)) set(x, y, 42, "#ebc67d");
if (d > 0.38 && d < 0.83 && rand() < 0.22)
set(x, y, 40, "#e2ba72");
}
}
for (let z = 41; z <= 45; z++) {
const rx = [10, 9, 8, 7, 5][z - 41];
const ry = [7, 7, 6, 5, 4][z - 41];
for (let x = 24 - rx; x <= 24 + rx; x++) {
for (let y = 21 - ry; y <= 21 + ry; y++) {
if (((x - 24) / rx) ** 2 + ((y - 21) / ry) ** 2 <= 1)
set(x, y, z, rand() < 0.13 ? "#e7bf76" : "#d3a65e");
}
}
}
// Lacquer-red hat band and small golden clasp.
for (let x = 15; x <= 33; x++) {
for (let y = 14; y <= 28; y++) {
const d = ((x - 24) / 9) ** 2 + ((y - 21) / 7) ** 2;
if (d > 0.75 && d <= 1.05) set(x, y, 41, "#842e2c");
}
}
box(23, 13, 41, 25, 13, 42, "#eac66e");
// The free paw rests against the belly.
ellipsoid(12, 20, 24, 4, 4, 7, "#785039");
ellipsoid(14, 16, 19, 4, 4, 4, "#a87550");
ellipsoid(16, 13, 18, 3, 2, 2, "#b8855b");
// A thick, striped tail, hinged behind the body.
part("tail", [33, 30, 16]);
for (let x = 33; x <= 42; x++) {
const t = (x - 33) / 9;
const y = 31 + 3 * t;
const z = 15 + 7 * t;
const r = x < 39 ? 4.5 : 4.5 - (x - 39) * 0.45;
const stripe = Math.floor((x - 33) / 2.3) % 2;
ellipsoid(x, y, z, 1.5, r, r, stripe ? "#50372e" : "#b78758");
}
ellipsoid(42, 34, 22, 2, 3, 3, "#50372e");
animate("tail", { type: "swing", axis: "z", speed: 1.5, amplitude: 0.3 });
// Bottle-bearing arm and its jade-green sake flask move together.
part("bottleArm", [34, 21, 27]);
ellipsoid(35, 19, 24, 4, 4, 6, "#795038");
ellipsoid(37, 16, 19, 4, 4, 4, "#a87651");
cylinder(40, 14, 15, 3, 8, "#315c4b");
cylinder(40, 14, 22, 2, 2, "#52846b");
cylinder(40, 14, 24, 2, 1, "#d9b766");
box(38, 10, 17, 42, 11, 21, "#ead7a7");
box(39, 9, 18, 41, 9, 20, "#ead7a7");
set(40, 8, 19, "#a83d35");
set(39, 8, 20, "#a83d35");
set(41, 8, 18, "#a83d35");
ellipsoid(37, 13, 19, 2, 2, 2, "#bd895e");
animate("bottleArm", { type: "swing", axis: "x", speed: 3, amplitude: 0.3 });import { draw } from "./assets/voxel";
import { tanuki } from "./assets/tanuki";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, tanuki, 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 tanuki
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["tanuki"] })
# It lands in client/assets/tanuki.ts
# https://fogon.page/object/tanuki