fogón

← AsiáticoObjeto 3Dfogon/monte-fuji

Monte Fuji

de fogonCC023144 bloques
Monte FujiArrastrá 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");