← Antiguo y prehistoriaObjeto 3Dfogon/mamut
Mamut
Arrastrá para girarlo// «Mamut» · gpt-6-sol (medium)
// A big chunky cartoon woolly mammoth on four thick legs, body horizontal along y, covered in shaggy reddish-brown fur in several shades with a high domed head. At the front (-y) a long trunk hanging down and two huge curved cream tusks curling forward and up, small dark eyes, small ears, a short tail.
const fur = "#99502d";
const furLight = "#b96a3a";
const furDark = "#71391f";
const furGold = "#ce8247";
const ivory = "#f5e6bd";
const ivoryShade = "#d8c69d";
// Broad, horizontal body and a high, domed forehead.
ellipsoid(24, 25, 26, 15, 14, 11, fur);
ellipsoid(24, 25, 30, 13, 12, 7, furLight);
ellipsoid(24, 13, 32, 10, 10, 10, fur);
ellipsoid(24, 14, 37, 9, 8, 6, furLight);
ellipsoid(24, 7, 30, 8, 4, 8, "#a95b32");
// Subtle color variation, with darker fur underneath.
forEach((x, y, z, color) => {
if (color === fur || color === furLight) {
if (z < 20 && rand() < 0.52) set(x, y, z, furDark);
else if (z > 32 && rand() < 0.12) set(x, y, z, furGold);
else if (rand() < 0.07) set(x, y, z, color === fur ? furLight : fur);
}
});
// Pointed locks along the sides and hanging belly fringe.
for (let y = 15; y <= 35; y += 3) {
for (const side of [-1, 1]) {
const x = 24 + side * (12 + (y > 32 ? -2 : 0));
const top = 23 + Math.floor(rand() * 5);
line(x, y, top, x + side, y + 1, top - 5, 1,
rand() < 0.5 ? furDark : fur);
line(x - side, y - 1, top + 3, x, y, top - 1, 1,
rand() < 0.5 ? furLight : furGold);
}
}
for (let y = 17; y <= 34; y += 3) {
for (let x = 14; x <= 34; x += 4) {
line(x, y, 18, x + (rand() < 0.5 ? -1 : 1), y + 1, 14, 1, furDark);
}
}
// Shaggy crown and cheek ruffs.
for (let x = 17; x <= 31; x += 3) {
line(x, 13, 41, x - 1, 11, 43, 1, furGold);
}
for (const side of [-1, 1]) {
for (let y = 8; y <= 19; y += 3) {
line(24 + side * 9, y, 32, 24 + side * 10, y + 1, 27,
1, y % 2 ? furDark : furLight);
}
}
// Little ears, with warm inner fur visible from the front.
for (const x of [12, 36]) {
ellipsoid(x, 15, 34, 4, 2, 5, furDark);
ellipsoid(x, 12, 34, 3, 1, 4, furGold);
ellipsoid(x, 11, 34, 2, 1, 3, "#b76541");
}
// Friendly eyes and heavy eyebrows.
for (const x of [17, 31]) {
ellipsoid(x, 4, 34, 2, 1, 2, furDark);
box(x, 3, 33, x + 1, 3, 35, "#211c19");
set(x, 2, 35, "#ffffff");
line(x - 2, 5, 37, x + 2, 5, 37, 1, furLight);
}
// Short tail with a shaggy dark tip.
line(24, 37, 28, 24, 41, 24, 1, furDark);
line(24, 41, 24, 24, 42, 19, 2, fur);
ellipsoid(24, 42, 19, 2, 2, 3, furDark);
line(23, 42, 19, 23, 43, 16, 0, furDark);
// Four independent, chunky walking legs.
for (const [name, x, y, speed] of [
["front-left", 15, 15, 4],
["front-right", 33, 15, -4],
["rear-left", 15, 33, -4],
["rear-right", 33, 33, 4]
]) {
part(name, [x, y, 19]);
ellipsoid(x, y, 16, 5, 5, 7, furDark);
ellipsoid(x, y, 13, 4, 4, 7, fur);
ellipsoid(x, y - 1, 5, 4, 5, 5, furLight);
ellipsoid(x, y - 2, 2, 5, 5, 2, furDark);
box(x - 4, y - 5, 0, x + 4, y + 1, 1, furDark);
for (const dx of [-2, 0, 2]) {
box(x + dx, y - 6, 0, x + dx + 1, y - 5, 2, ivoryShade);
set(x + dx, y - 6, 2, ivory);
}
animate(name, {type: "swing", axis: "x", speed, amplitude: 0.3});
}
part("body");
// Two enormous tusks: outward, forward, then dramatically upward.
for (const side of [-1, 1]) {
const x = 24 + side * 7;
line(x, 7, 26, x + side * 2, 4, 21, 3, ivoryShade);
line(x + side * 2, 4, 21, x + side * 4, 2, 17, 3, ivory);
line(x + side * 4, 2, 17, x + side * 6, 1, 19, 2, ivory);
line(x + side * 6, 1, 19, x + side * 7, 1, 24, 2, ivory);
line(x + side * 7, 1, 24, x + side * 7, 1, 28, 1, ivory);
set(x + side * 7, 1, 29, "#fff5da");
}
// Hanging trunk, hinged at the face.
part("trunk", [24, 5, 30]);
line(24, 5, 30, 24, 3, 25, 3, fur);
line(24, 3, 25, 24, 3, 19, 3, furLight);
line(24, 3, 19, 24, 4, 13, 3, fur);
ellipsoid(24, 3, 12, 3, 3, 2, furDark);
for (const z of [17, 21, 25]) {
line(21, 2, z, 27, 2, z, 0, furDark);
}
box(22, 0, 11, 23, 0, 12, "#482c25");
box(25, 0, 11, 26, 0, 12, "#482c25");
animate("trunk", {type: "swing", axis: "x", speed: 2, amplitude: 0.3});import { draw } from "./assets/voxel";
import { mamut } from "./assets/mamut";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, mamut, 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 mamut
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["mamut"] })
# Queda en client/assets/mamut.ts
# https://fogon.page/object/mamut