← AsiáticoObjeto 3Dfogon/monte-fuji
Monte Fuji
Arrastrá para girarlo// «Monte Fuji» · gpt-6-sol (medium)
// Mount Fuji as a chunky diorama: a wide cone mountain with gentle slopes in blue-grey shades, a white snow cap with jagged edges on top, a ring of green forest and a few pink cherry trees around the base.
// Lacquered display base and grassy ground
box(2, 2, 0, 45, 45, 0, "#303b40");
box(2, 2, 1, 45, 45, 1, "#9e3e33");
box(3, 3, 2, 44, 44, 2, "#d5d1be");
box(4, 4, 3, 43, 43, 3, "#638353");
for (let i = 3; i <= 44; i++) {
set(i, 2, 1, "#d5ad58");
set(i, 45, 1, "#a77a3e");
set(2, i, 1, "#d5ad58");
set(45, i, 1, "#a77a3e");
}
for (let i = 2; i <= 45; i++) {
set(i, 2, 2, "#414b4a");
set(i, 45, 2, "#414b4a");
set(2, i, 2, "#414b4a");
set(45, i, 2, "#414b4a");
}
// Solid volcanic cone, with broad radial ridges and an uneven snow line
function mountainTop(x, y) {
const dx = x - 24, dy = y - 24;
const r = Math.hypot(dx, dy);
if (r > 19.1) return 3;
const a = Math.atan2(dy, dx);
const ridge = (0.85 * Math.sin(7 * a + 0.4) +
0.42 * Math.sin(13 * a - 0.7)) * Math.min(1, r / 8);
let h = 4 + 31 * (1 - Math.pow(r / 19.1, 1.12)) + ridge;
if (r < 1.4) h -= 2; // shallow summit crater
return Math.max(4, Math.min(35, Math.floor(h)));
}
for (let x = 4; x <= 44; x++) {
for (let y = 4; y <= 44; y++) {
const dx = x - 24, dy = y - 24;
const r = Math.hypot(dx, dy);
if (r > 19.1) continue;
const a = Math.atan2(dy, dx);
const top = mountainTop(x, y);
const snowline = 22.5 + 1.6 * Math.sin(7 * a + 0.6)
+ 1.1 * Math.sin(12 * a - 0.8)
+ 0.5 * Math.sin(r * 1.4 + 3 * a);
for (let z = 4; z <= top; z++) {
let color = "#526574";
const surface = top - z;
if (surface < 4) {
const n = rand();
color = n < 0.16 ? "#415563"
: n < 0.48 ? "#627887"
: n < 0.84 ? "#708491" : "#83949b";
if (z < 13 && n < 0.24) color = "#526b67";
}
if (z >= snowline && surface < 6) {
const n = rand();
color = surface > 2 ? "#aebdc0"
: n < 0.15 ? "#c5d5d6"
: n < 0.68 ? "#f1f2e9" : "#ffffff";
}
if (r < 1.4 && z === top) color = "#c1cecc";
set(x, y, z, color);
}
}
}
// Small flecks of grass and pale stones around the foot
for (let i = 0; i < 370; i++) {
const x = 5 + Math.floor(rand() * 38);
const y = 5 + Math.floor(rand() * 38);
if (Math.hypot(x - 24, y - 24) < 18.6) continue;
set(x, y, 4, rand() < 0.2 ? "#a9ad91" :
rand() < 0.5 ? "#476d4d" : "#829869");
}
const cherries = [
[12, 9], [35, 8], [7, 25],
[41, 19], [39, 37], [13, 40]
];
// Dense ring of compact, tiered evergreens
for (let ring = 0; ring < 2; ring++) {
const count = ring === 0 ? 29 : 34;
for (let i = 0; i < count; i++) {
const a = 2 * Math.PI * (i + (ring ? 0.47 : 0)) / count;
const r = (ring ? 20.6 : 17.8) + (rand() - 0.5) * 1.7;
const x = Math.round(24 + Math.cos(a) * r);
const y = Math.round(24 + Math.sin(a) * r);
if (x < 6 || x > 42 || y < 6 || y > 42) continue;
if (y < 9 && x > 18 && x < 30) continue;
if (cherries.some(([cx, cy]) => Math.hypot(x - cx, y - cy) < 4)) continue;
const ground = mountainTop(x, y);
const height = 6 + Math.floor(rand() * 3);
box(x, y, ground + 1, x, y, ground + height - 1, "#655344");
for (let dz = 2; dz <= height; dz++) {
const width = dz < 4 ? 2.5 : dz < 6 ? 1.9 : 1.1;
for (let ox = -2; ox <= 2; ox++) {
for (let oy = -2; oy <= 2; oy++) {
if (ox * ox + oy * oy > width * width) continue;
const shade = rand();
set(x + ox, y + oy, ground + dz,
shade < 0.18 ? "#244c43" :
shade < 0.55 ? "#376b53" : "#508463");
}
}
}
set(x, y, ground + height + 1, "#6b9a70");
}
}
// Cherry trees: dark branching trunks and generous pink blossom clouds
for (const [x, y] of cherries) {
const g = mountainTop(x, y);
box(x, y, g + 1, x + 1, y, g + 6, "#65453f");
line(x, y, g + 5, x - 2, y, g + 8, 0, "#705047");
line(x + 1, y, g + 5, x + 3, y + 1, g + 8, 0, "#705047");
line(x, y, g + 6, x, y - 2, g + 8, 0, "#705047");
const blooms = [
[x - 2, y, g + 9], [x + 3, y + 1, g + 9],
[x, y - 2, g + 10], [x + 1, y + 2, g + 9],
[x, y, g + 11]
];
for (const [bx, by, bz] of blooms) {
sphere(bx, by, bz, 2, "#d989aa");
set(bx, by, bz + 2, "#ffcfda");
set(bx - 1, by - 1, bz + 1, "#ffe0e3");
set(bx + 1, by, bz + 1, "#f5b2cb");
}
}
// A little red torii at the front, framing the mountain
box(21, 4, 4, 21, 4, 9, "#a63830");
box(27, 4, 4, 27, 4, 9, "#a63830");
box(20, 4, 9, 28, 4, 9, "#bb4735");
box(19, 4, 11, 29, 4, 11, "#ae3d32");
box(20, 4, 12, 28, 4, 12, "#343f3c");
box(21, 4, 10, 27, 4, 10, "#d7a65c");
box(21, 4, 6, 27, 4, 6, "#8d342d");
set(21, 4, 8, "#e3b765");
set(27, 4, 8, "#e3b765");import { draw } from "./assets/voxel";
import { monteFuji } from "./assets/monte-fuji";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, monteFuji, 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 monte-fuji
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["monte-fuji"] })
# Queda en client/assets/monte-fuji.ts
# https://fogon.page/object/monte-fuji