← Asian3D assetfogon/kitsune
Kitsune
Drag to turn it// «Kitsune» · gpt-6-sol (medium)
// A magical cartoon fox spirit standing on four legs, horizontal along y: white fur with orange-red markings on the ears, face and paws, a red ribbon with a little gold bell on its neck, black dot eyes, and NINE big fluffy tails fanning up and out behind it, white with orange tips.
const white = "#fff8ed";
const cream = "#f0eadf";
const shadow = "#d8dfe1";
const orange = "#dc5b39";
const orangeLight = "#f47d49";
const orangeDark = "#b94534";
const red = "#a92435";
const redLight = "#d83b47";
const gold = "#f4c75e";
// Nine fluffy tails form a fan behind the fox.
part("tails", [24, 34, 19]);
const tailEnds = [
[5, 22], [8, 29], [12, 35],
[18, 39], [24, 41], [30, 39],
[36, 35], [40, 29], [43, 22]
];
for (let i = 0; i < tailEnds.length; i++) {
const ex = tailEnds[i][0];
const ez = tailEnds[i][1];
const ey = 41 + (i % 3);
line(24, 35, 19, ex, ey, ez - 2, 2.3, shadow);
line(24, 35, 20, ex, ey - 1, ez - 2, 1.65, cream);
const bx = 24 + (ex - 24) * 0.84;
const bz = 19 + (ez - 19) * 0.84;
ellipsoid(bx, ey - 1, bz, 3.1, 2.7, 3.4, shadow);
ellipsoid(bx, ey - 1.5, bz + 0.7, 2.9, 2.5, 3.1, white);
ellipsoid(ex, ey, ez, 2.5, 2.3, 2.7, orangeDark);
ellipsoid(ex, ey - 0.5, ez + 0.5, 2.3, 2.1, 2.4, orange);
ellipsoid(ex, ey - 1, ez + 1.1, 1.4, 1.5, 1.1, orangeLight);
}
animate("tails", {
type: "swing",
axis: "z",
speed: 2,
amplitude: 0.25
});
// Body and chest.
part("body");
ellipsoid(24, 26, 18, 8, 10, 6, shadow);
ellipsoid(24, 25, 19, 8, 10, 6, white);
ellipsoid(24, 29, 19, 8, 6, 6, cream);
ellipsoid(24, 18, 19, 6, 5, 6, white);
ellipsoid(24, 17, 16, 4, 4, 4, cream);
// Each leg swings separately from its shoulder or hip.
const legs = [
["frontLeft", 19, 20, 5],
["frontRight", 29, 20, -5],
["rearLeft", 19, 31, -5],
["rearRight", 29, 31, 5]
];
for (const leg of legs) {
const name = leg[0];
const x = leg[1];
const y = leg[2];
const speed = leg[3];
part(name, [x, y, 15]);
ellipsoid(x, y, 12, 2.8, 3, 4, cream);
ellipsoid(x, y - 0.4, 11, 2.5, 2.7, 3.6, white);
box(x - 2, y - 2, 3, x + 2, y + 1, 10, white);
ellipsoid(x, y - 1.5, 2, 2.7, 3, 2, orangeDark);
ellipsoid(x, y - 2, 2, 2.6, 2.6, 1.7, orange);
box(x - 1, y - 4, 0, x + 1, y - 2, 1, orangeLight);
animate(name, {
type: "swing",
axis: "x",
speed: speed,
amplitude: 0.3
});
}
part("body");
// Neck, ribbon, bow and gold bell.
ellipsoid(24, 17, 22, 5.5, 4, 5, white);
ellipsoid(24, 17, 22, 5.4, 2.6, 2.5, red);
ellipsoid(24, 15, 23, 4.8, 1.3, 0.9, redLight);
ellipsoid(21, 13, 21, 2.5, 1.2, 1.7, redLight);
ellipsoid(27, 13, 21, 2.5, 1.2, 1.7, redLight);
sphere(24, 12, 21, 1.2, red);
sphere(24, 11, 18, 2, gold);
set(23, 9, 18, "#fff0aa");
set(24, 9, 17, "#9d6835");
// Rounded fox head and orange face markings.
ellipsoid(24, 13, 28, 7, 6, 7, shadow);
ellipsoid(24, 12.5, 28.5, 7, 6, 7, white);
ellipsoid(18, 11, 26, 2.5, 2.7, 3, orange);
ellipsoid(30, 11, 26, 2.5, 2.7, 3, orange);
ellipsoid(19, 9, 31, 2.6, 1.4, 3, orange);
ellipsoid(29, 9, 31, 2.6, 1.4, 3, orange);
ellipsoid(24, 8, 23, 4.5, 4, 3, cream);
ellipsoid(24, 7, 23, 3.8, 3, 2.5, white);
// Tall, tapered ears with pale inner fur.
for (const cx of [18, 30]) {
for (let z = 34; z <= 42; z++) {
const half = Math.max(0, Math.round((42 - z) * 0.43));
const earColor = z >= 39 ? orangeDark : orange;
box(cx - half, 11, z, cx + half, 15, z, earColor);
if (z >= 35 && z <= 40 && half >= 1) {
const innerHalf = Math.max(0, half - 1);
box(cx - innerHalf, 10, z, cx + innerHalf, 11, z, "#ffc2ad");
}
}
set(cx, 12, 42, orangeLight);
}
// Cheeks, dot eyes and small nose.
ellipsoid(19, 8, 25, 2, 1.5, 1.5, white);
ellipsoid(29, 8, 25, 2, 1.5, 1.5, white);
sphere(20, 7, 29, 1.1, "#24232a");
sphere(28, 7, 29, 1.1, "#24232a");
set(20, 6, 30, "#ffffff");
set(28, 6, 30, "#ffffff");
ellipsoid(24, 4, 24, 1.5, 1, 1, "#303039");
set(23, 7, 21, "#b8a8a2");
set(25, 7, 21, "#b8a8a2");import { draw } from "./assets/voxel";
import { kitsune } from "./assets/kitsune";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, kitsune, 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 kitsune
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["kitsune"] })
# It lands in client/assets/kitsune.ts
# https://fogon.page/object/kitsune