← Animals3D assetfogon/coati
Coatí
Drag to turn it// «Coatí» · gpt-6-sol (medium)
// A cartoon coati, horizontal along y, head at the front (-y): a reddish-brown body, a long pointed upturned snout with a black tip, a white mask around the eyes, small round ears, four legs with dark feet and a long upright tail ringed in brown and cream.
const fur = "#ad542f";
const furLight = "#c66a3a";
const furDark = "#874024";
const cream = "#f5e7c5";
const creamShade = "#dcc9a3";
const footDark = "#493029";
// Rounded body with subtle fur variation.
ellipsoid(24, 25, 17, 10, 13, 9, fur);
forEach((x, y, z, color) => {
if (color !== fur) return;
if (z >= 21 && rand() < 0.65) set(x, y, z, furLight);
else if (z <= 12 && rand() < 0.75) set(x, y, z, furDark);
else if (rand() < 0.07) set(x, y, z, furLight);
});
ellipsoid(24, 22, 11, 7, 9, 3, creamShade);
// Tall, curved tail with bold horizontal rings.
for (let z = 19; z <= 43; z++) {
const t = z - 19;
const cy = 35 + 0.8 * t - 0.027 * t * t;
const ring = Math.floor(t / 4) % 2;
const base = ring ? cream : "#704027";
for (let x = 20; x <= 28; x++) {
for (let y = Math.floor(cy - 4); y <= Math.ceil(cy + 4); y++) {
const d = (x - 24) ** 2 + (y - cy) ** 2;
if (d <= 11.5) {
let color = base;
if (ring && d > 7 && rand() < 0.45) color = creamShade;
if (!ring && rand() < 0.12) color = "#91502d";
set(x, y, z, color);
}
}
}
}
sphere(24, 39, 43, 3, "#704027");
// Oversized head and small round ears.
ellipsoid(24, 13, 24, 8, 8, 8, fur);
forEach((x, y, z, color) => {
if (color === fur && y <= 20 && z >= 19 && z <= 32) {
if (z >= 26 && rand() < 0.48) set(x, y, z, furLight);
else if (rand() < 0.045) set(x, y, z, furDark);
}
});
for (const x of [16, 32]) {
sphere(x, 13, 30, 3, furDark);
sphere(x, 11, 31, 2, furLight);
ellipsoid(x, 9, 31, 1.5, 0.8, 1.5, "#ce8c78");
}
// White eye mask and bright, simple dot eyes.
ellipsoid(20, 7, 27, 3, 2.5, 3, cream);
ellipsoid(28, 7, 27, 3, 2.5, 3, cream);
ellipsoid(24, 8, 25, 2, 1.5, 2, creamShade);
sphere(20, 5, 28, 1.4, "#211c1a");
sphere(28, 5, 28, 1.4, "#211c1a");
set(20, 4, 29, "#ffffff");
set(28, 4, 29, "#ffffff");
// Long snout rises toward its black nose.
ellipsoid(24, 8, 21, 4, 5, 3, "#bc673d");
ellipsoid(24, 5, 22, 3, 4, 2.5, "#ce7848");
ellipsoid(24, 3, 24, 2.3, 2.5, 2.2, "#d9824c");
ellipsoid(24, 2, 25, 2, 1.5, 1.5, "#292322");
set(23, 1, 26, "#49403c");
// Four independent walking legs.
function leg(name, x, y, speed) {
part(name, [x, y, 13]);
sphere(x, y, 12, 3, furDark);
cylinder(x, y, 3, 2.5, 9, "#92502e");
ellipsoid(x, y - 1, 2, 3, 3.5, 2, footDark);
box(x - 2, y - 3, 0, x + 2, y, 1, footDark);
animate(name, { type: "swing", axis: "x", speed, amplitude: 0.3 });
part("body");
}
leg("frontLeft", 17, 17, 5);
leg("frontRight", 31, 17, -5);
leg("rearLeft", 17, 33, -5);
leg("rearRight", 31, 33, 5);import { draw } from "./assets/voxel";
import { coati } from "./assets/coati";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, coati, 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 coati
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["coati"] })
# It lands in client/assets/coati.ts
# https://fogon.page/object/coati