fogón

← Monstruos y enemigosObjeto 3Dfogon/elemental-de-hielo

Elemental de hielo

de fogonCC013808 bloques
Elemental de hieloArrastrá para girarlo
// «Elemental de hielo» · gpt-6-sol (medium)
// A cartoon ice elemental facing -y: a hulking body made of chunky pale blue and white ice crystals, jagged shards on the shoulders and head, two glowing cyan eyes, big crystal fists, floating with no legs over a small cloud of frost on the floor.

// Frost cloud on the floor
const snow = "#effcff", frost = "#c6f2f7", shadow = "#83b7ce";
ellipsoid(24, 24, 0, 16, 10, 2, frost);
ellipsoid(24, 23, 1, 12, 8, 2, snow);
for (let i = 0; i < 28; i++) {
  const x = 10 + Math.floor(rand() * 29);
  const y = 15 + Math.floor(rand() * 19);
  if (get(x, y, 0)) set(x, y, 2, rand() < 0.5 ? snow : frost);
}

// The elemental floats above the cloud.
part("body", [24, 24, 23]);
const deep = "#578ba9", blue = "#80c1d8", ice = "#b6e5ee";
const pale = "#ddf7f9", white = "#f4ffff", glow = "#42f8ff";

// Broad, heavy torso with a dark lower edge.
ellipsoid(24, 25, 20, 12, 9, 11, deep);
ellipsoid(24, 24, 22, 12, 9, 10, blue);
box(15, 17, 17, 33, 30, 27, ice);
box(17, 16, 22, 31, 19, 28, pale);
box(18, 17, 16, 30, 20, 18, blue);

// Angular breastplate and a large central crystal.
box(20, 14, 19, 28, 16, 26, blue);
box(21, 13, 21, 27, 14, 27, pale);
box(23, 12, 20, 25, 13, 26, white);
line(24, 13, 26, 24, 17, 30, 1, ice);
line(18, 16, 24, 21, 15, 20, 1, white);
line(30, 16, 24, 27, 15, 20, 1, white);

// Arms: thick upper sections, oversized faceted fists.
for (const side of [-1, 1]) {
  const sx = side < 0 ? 11 : 36;
  ellipsoid(sx, 24, 24, 5, 7, 6, deep);
  ellipsoid(sx, 23, 25, 5, 6, 6, ice);
  const fx = side < 0 ? 7 : 41;
  ellipsoid(fx, 20, 16, 5, 6, 6, deep);
  box(fx - 4, 15, 14, fx + 4, 24, 20, blue);
  box(fx - 3, 15, 18, fx + 3, 21, 21, pale);
  box(fx - 3, 14, 13, fx + 3, 15, 16, ice);
  box(fx - 2, 14, 19, fx + 2, 14, 20, white);
  // Facet lines on the front of each fist.
  line(fx - 2, 14, 16, fx - 1, 14, 19, 0, white);
  line(fx + 1, 14, 15, fx + 2, 14, 18, 0, deep);
}

// Big blocky head, set forward of the shoulders.
ellipsoid(24, 22, 32, 10, 8, 8, blue);
box(16, 15, 29, 32, 27, 36, ice);
box(17, 13, 30, 31, 15, 36, pale);
box(19, 14, 37, 29, 23, 38, white);
box(16, 16, 28, 32, 26, 29, deep);

// Crown of staggered ice points.
box(17, 17, 37, 21, 23, 40, ice);
box(18, 18, 40, 20, 22, 43, pale);
set(19, 20, 44, white);
box(24, 19, 38, 29, 25, 41, pale);
box(25, 20, 41, 28, 24, 43, white);
box(26, 21, 44, 27, 23, 44, white);
box(30, 21, 36, 33, 26, 39, blue);
box(31, 22, 39, 32, 25, 41, pale);

// A few subtle chips on the large ice surfaces.
const chips = [];
forEach((x, y, z, color) => {
  if ((color === ice || color === blue) && z > 17 && rand() < 0.012)
    chips.push([x, y, z, rand() < 0.65 ? pale : deep]);
});
for (const chip of chips) set(...chip);

// Friendly glowing eyes, strongly outlined against the pale face.
for (const x of [20, 28]) {
  box(x - 2, 12, 31, x + 2, 13, 35, deep);
  box(x - 1, 11, 32, x + 1, 12, 34, glow);
  set(x, 10, 33, white);
  box(x - 2, 12, 36, x + 1, 13, 36, blue);
}
// Tiny crooked smile.
box(22, 12, 29, 26, 12, 29, deep);
set(22, 12, 30, deep);
set(26, 12, 30, deep);
box(23, 11, 29, 25, 11, 29, white);

animate("body", { type: "bob", axis: "z", speed: 2, amplitude: 2 });

// Separate pulsing shoulder shards.
part("shoulder crystals", [24, 24, 30]);
for (const side of [-1, 1]) {
  const x = side < 0 ? 10 : 38;
  box(x - 3, 19, 28, x + 3, 26, 32, ice);
  box(x - 2, 20, 33, x + 2, 25, 36, pale);
  box(x - 1, 21, 37, x + 1, 24, 40, white);
  set(x, 22, 41, white);

  const outer = x + side * 4;
  box(outer - 1, 23, 28, outer + 1, 27, 34, blue);
  set(outer, 25, 35, pale);
}
animate("shoulder crystals", {
  type: "colors",
  palette: ["#b6e5ee", "#f4ffff", "#84f4ff"],
  pattern: "pulse",
  glow: 0.5
});