fogón

← FantasíaObjeto 3Dfogon/mago-blanco

Mago blanco

de fogonCC08590 bloques
Mago blancoArrastrá para girarlo
// «Mago blanco» · gpt-6-sol (medium)
// A tall old cartoon wizard facing front (-y) in long flowing white robes with silver trim, a very long white beard, a tall pointed white hat, kind eyes, and a gnarled pale wooden staff held in the right hand with a glowing white-blue crystal on top.

const white = "#f5f6f1";
const pearl = "#e9edf0";
const shadow = "#cbd2d7";
const silver = "#aebbc5";
const deepSilver = "#899ba8";
const skin = "#edc7aa";
const skinShade = "#d6a888";
const wood = "#c6ae83";
const woodShade = "#a58a64";

// Full, bell-shaped robe, resting on the floor.
for (let z = 0; z <= 22; z++) {
  const rx = z < 15 ? 10.8 - z * 0.19 : 7.95 - (z - 15) * 0.13;
  const ry = z < 15 ? 9.0 - z * 0.13 : 7.05 - (z - 15) * 0.08;
  for (let x = 11; x <= 35; x++) {
    for (let y = 14; y <= 34; y++) {
      const d = ((x - 23) / rx) ** 2 + ((y - 24) / ry) ** 2;
      if (d > 1) continue;
      let c = white;
      if (y > 27) c = pearl;
      if (x > 29 || z < 3) c = shadow;
      if (y < 21 && z > 3 && rand() < 0.055) c = pearl;
      set(x, y, z, c);
    }
  }
}

// Rounded shoulders and broad hanging sleeves.
ellipsoid(23, 24, 22, 8, 7, 6, pearl);
ellipsoid(23, 21, 24, 7, 5, 4, white);
ellipsoid(16, 22, 21, 4, 4, 7, pearl);
ellipsoid(15, 19, 18, 3, 3, 5, white);
ellipsoid(13, 18, 16, 3, 3, 2, silver);
ellipsoid(13, 17, 15, 2, 2, 2, skin);

// Hem: a broad silver edge with a thin white glint above it.
for (let x = 12; x <= 34; x++) {
  for (let y = 16; y <= 32; y++) {
    for (let z = 0; z <= 2; z++) {
      if (get(x, y, z) !== undefined) {
        const exposed = get(x, y - 1, z) === undefined;
        if (exposed || z === 0) set(x, y, z, z === 1 ? deepSilver : silver);
        if (exposed && z === 2) set(x, y, z, "#f9faf8");
      }
    }
  }
}

// Flowing folds on the front of the robe.
for (let z = 3; z <= 19; z++) {
  for (const x of [17, 20, 26, 30]) {
    let front;
    for (let y = 13; y <= 26; y++) {
      if (get(x, y, z) !== undefined) { front = y; break; }
    }
    if (front !== undefined) {
      set(x, front, z, x === 20 || x === 26 ? "#ffffff" : "#dce2e5");
      if (z < 14 && (x === 17 || x === 30)) set(x + 1, front, z, shadow);
    }
  }
}
// Silver-edged opening and small decorative clasps.
for (let z = 7; z <= 22; z++) {
  let front;
  for (let y = 13; y <= 25; y++) {
    if (get(23, y, z) !== undefined) { front = y; break; }
  }
  if (front !== undefined) {
    set(22, front - 1, z, silver);
    set(24, front - 1, z, silver);
    if (z === 12 || z === 17 || z === 21) set(23, front - 2, z, "#e2f6f8");
  }
}

// Big friendly face, with white side hair.
ellipsoid(23, 22, 29, 6, 5, 5, skin);
ellipsoid(18, 21, 29, 2, 4, 4, pearl);
ellipsoid(28, 21, 29, 2, 4, 4, pearl);
ellipsoid(23, 25, 31, 5, 3, 3, pearl);
for (const x of [20, 26]) {
  box(x - 1, 16, 31, x + 1, 16, 31, white); // soft brows
  box(x - 1, 16, 29, x + 1, 16, 30, "#f9f9f3");
  set(x, 15, 29, "#526c7a");
  set(x, 14, 30, "#ffffff");
}
ellipsoid(23, 15, 28, 2, 2, 2, skin);
set(23, 13, 27, skinShade);

// Long, layered beard: broad at the cheeks, trailing to a point.
for (let z = 15; z <= 27; z++) {
  const width = z <= 23 ? 0.7 + (z - 15) * 0.53 : 5 - (z - 23) * 0.16;
  const depth = z < 19 ? 2 : 3;
  for (let x = 18; x <= 28; x++) {
    for (let y = 13; y <= 17; y++) {
      if (Math.abs(x - 23) <= width && y >= 16 - depth &&
          y <= 16 && rand() > 0.035) {
        set(x, y, z, x === 27 || y === 16 ? pearl : white);
      }
    }
  }
}
for (let z = 17; z <= 25; z++) {
  set(21, 12, z, "#ffffff");
  set(25, 12, z, pearl);
}
ellipsoid(20, 14, 26, 3, 2, 1, white);
ellipsoid(26, 14, 26, 3, 2, 1, pearl);
set(23, 12, 26, shadow);

// Wide hat brim and tall, slightly bent storybook point.
ellipsoid(23, 22, 34, 9, 7, 1, silver);
ellipsoid(23, 22, 35, 9, 7, 1, white);
for (let z = 36; z <= 45; z++) {
  const t = (z - 36) / 9;
  const cx = 23 - 2 * t;
  const rx = 7.0 * (1 - t) + 0.65;
  const ry = 5.5 * (1 - t) + 0.55;
  for (let x = 15; x <= 30; x++) {
    for (let y = 16; y <= 28; y++) {
      if (((x - cx) / rx) ** 2 + ((y - 22) / ry) ** 2 <= 1) {
        set(x, y, z, y < 21 ? white : pearl);
      }
    }
  }
}
for (let x = 17; x <= 29; x++) {
  const dy = 5.5 * Math.sqrt(Math.max(0, 1 - ((x - 23) / 7) ** 2));
  set(x, Math.round(22 - dy), 36, deepSilver);
}
set(22, 16, 38, "#cceef1");
set(23, 16, 38, "#ffffff");
set(24, 17, 39, silver);

// The staff arm and its wooden staff share the shoulder pivot.
part("staffArm", [29, 22, 25]);
line(29, 21, 25, 35, 18, 23, 3, pearl);
line(31, 19, 24, 35, 17, 23, 2, white);
ellipsoid(35, 17, 23, 3, 3, 2, silver);
ellipsoid(36, 16, 23, 2, 2, 2, skin);

line(39, 17, 1, 38, 16, 13, 1, woodShade);
line(38, 16, 13, 39, 17, 22, 1, wood);
line(39, 17, 22, 37, 16, 30, 1, woodShade);
line(37, 16, 30, 38, 16, 35, 1, wood);
line(38, 16, 32, 35, 16, 34, 0, wood);
line(38, 16, 33, 41, 17, 35, 0, woodShade);
line(39, 17, 8, 41, 17, 10, 0, wood);
line(38, 16, 18, 36, 15, 20, 0, woodShade);
ellipsoid(37, 15, 23, 2, 2, 2, skin);
line(36, 14, 23, 39, 14, 23, 0, skinShade);
animate("staffArm", { type: "swing", axis: "x", speed: 1.5, amplitude: 0.15 });
part("body");

// Crystal, nestled between the staff's forked branches.
part("crystal", [38, 16, 36]);
ellipsoid(38, 16, 37, 3, 3, 4, "#c6faff");
ellipsoid(38, 15, 38, 2, 2, 3, "#f4ffff");
set(38, 14, 39, "#ffffff");
set(37, 15, 41, "#ffffff");
set(39, 15, 40, "#d7ffff");
animate("crystal", {
  type: "colors",
  palette: ["#b9eafa", "#ffffff", "#61eaf6"],
  pattern: "pulse",
  glow: 0.8
});
part("body");