fogón

← FantasíaObjeto 3Dfogon/estante-de-alquimista

Estante de alquimista

de fogonCC027962 bloques
Estante de alquimistaArrastrá para girarlo
// «Estante de alquimista» · gpt-6-sol (medium)
// A dark wooden alchemist's shelf against a back wall, facing front (-y): three shelves full of potion bottles of different shapes and glowing colors, jars with herbs, an old skull, a stack of books and a small brass scale.

const stone = ["#555c56", "#626b60", "#70786a", "#4a514d"];
const wood = "#34251f", woodLight = "#624330", woodDark = "#241c1a";
const brass = "#c99a4b", brassLight = "#f3cf79", brassDark = "#806033";

// Mossy stone wall and uneven courses of masonry.
box(1, 39, 0, 46, 41, 44, "#363d39");
for (let z = 1; z < 44; z += 5) {
  const offset = (Math.floor(z / 5) % 2) * 3;
  for (let x = 1 - offset; x < 47; x += 7) {
    const shade = stone[Math.floor(rand() * stone.length)];
    box(Math.max(1, x), 38, z, Math.min(46, x + 6), 39, Math.min(43, z + 3), shade);
    if (rand() < 0.65) {
      line(Math.max(1, x + 1), 37, z + 3, Math.min(46, x + 4), 37, z + 3, 0, "#839082");
    }
  }
}
for (let i = 0; i < 125; i++) {
  const x = 1 + Math.floor(rand() * 46);
  const z = Math.floor(rand() * 44);
  if (x < 7 || x > 40 || z > 39) {
    set(x, 37, z, rand() < 0.6 ? "#536d48" : "#78905a");
    if (rand() < 0.22) set(x, 36, z + 1, "#9aac70");
  }
}

// Solid, dark plank backing.
box(6, 35, 1, 42, 38, 43, woodDark);
for (let x = 8; x <= 41; x += 5) {
  box(x, 34, 2, x + 3, 35, 42, x % 2 ? "#453024" : "#4b3529");
  line(x + 1, 33, 3, x + 1, 33, 41, 0, "#644332");
}

// Three roomy shelves, with a carved cornice above.
for (const z of [4, 17, 30]) {
  box(5, 16, z, 43, 38, z + 2, woodDark);
  box(7, 17, z + 2, 41, 36, z + 2, "#70503a");
  box(6, 15, z, 42, 17, z + 1, woodLight);
  line(7, 14, z + 1, 41, 14, z + 1, 0, brassDark);
  for (let x = 11; x < 40; x += 8) {
    box(x, 14, z, x + 2, 14, z, brass);
    set(x + 1, 14, z, brassLight);
  }
}
box(4, 15, 43, 44, 38, 45, woodDark);
box(5, 14, 44, 43, 17, 45, woodLight);
box(8, 14, 43, 40, 14, 43, brassDark);
for (let x = 10; x <= 38; x += 7) set(x, 13, 43, brassLight);

// Chunky carved uprights and their little brass fittings.
for (const x of [5, 41]) {
  box(x, 16, 0, x + 2, 21, 43, wood);
  box(x, 15, 0, x + 2, 16, 43, woodLight);
  for (const z of [2, 16, 29, 41]) {
    box(x, 14, z, x + 2, 16, z + 1, brassDark);
    set(x + 1, 14, z + 1, brass);
  }
  for (let z = 7; z < 40; z += 7) {
    line(x + 1, 14, z, x + 1, 14, z + 3, 0, "#81583a");
  }
}

// Bottle silhouettes are intentionally varied, with bright liquid cores.
function potion(x, y, floor, shape, liquid, glow) {
  const base = floor + 1;
  const glass = "#546d72";
  if (shape === "round") {
    ellipsoid(x, y, base + 3, 2.6, 2.4, 2.8, glass);
    ellipsoid(x, y - 1, base + 3, 1.7, 1.35, 1.7, liquid);
    cylinder(x, y, base + 5, 1, 2, "#83a5a1");
  } else if (shape === "tall") {
    box(x - 1, y - 2, base + 1, x + 1, y + 2, base + 5, glass);
    box(x - 1, y - 3, base + 2, x + 1, y - 2, base + 4, liquid);
    box(x, y - 1, base + 5, x, y + 1, base + 7, "#83a5a1");
  } else if (shape === "flask") {
    ellipsoid(x, y, base + 2, 2.7, 2.2, 1.9, glass);
    box(x - 1, y - 1, base + 3, x + 1, y + 1, base + 6, "#63888c");
    box(x - 1, y - 2, base + 2, x + 1, y - 2, base + 3, liquid);
  } else {
    cylinder(x, y, base + 1, 2, 5, glass);
    box(x - 1, y - 2, base + 2, x + 1, y - 2, base + 5, liquid);
    cylinder(x, y, base + 6, 1, 1, "#8ea9a0");
  }
  set(x - 1, y - 3, base + 4, glow);
  set(x - 1, y - 3, base + 5, "#d6faf1");
  set(x, y - 3, base + 2, glow);
  box(x - 1, y - 1, base + (shape === "tall" ? 7 : 6),
      x + 1, y + 1, base + (shape === "tall" ? 8 : 7), "#64412c");
  set(x, y - 2, base + (shape === "tall" ? 8 : 7), "#af8252");
}

function herbJar(x, y, floor, herb) {
  const z = floor + 1;
  cylinder(x, y, z, 2, 5, "#667b70");
  box(x - 1, y - 2, z + 1, x + 1, y - 2, z + 3, herb);
  set(x, y - 3, z + 2, "#b7d48a");
  cylinder(x, y, z + 5, 2, 1, brassDark);
  box(x - 1, y - 3, z + 1, x + 1, y - 3, z + 2, "#c3ab77");
  set(x, y - 4, z + 1, "#6b4838");
}

// Top shelf: a busy row of luminous glass and apothecary jars.
potion(12, 26, 32, "round", "#a43af2", "#e088ff");
herbJar(18, 27, 32, "#557e39");
potion(24, 26, 32, "tall", "#10cfcf", "#80fff0");
potion(30, 27, 32, "flask", "#e33a9f", "#ff91dc");
herbJar(35, 27, 32, "#718f39");
potion(39, 26, 32, "round", "#9edc2e", "#e9ff7d");

// Middle shelf: contrasting fat, slender and square bottles.
potion(12, 26, 19, "flask", "#1edac5", "#9cfff0");
potion(18, 27, 19, "round", "#d842ea", "#f6a0ff");
herbJar(24, 27, 19, "#607b39");
potion(30, 26, 19, "square", "#e5a535", "#ffe58a");
potion(36, 27, 19, "tall", "#7161ed", "#bcb0ff");

// A few little bottles farther back, visible between the larger ones.
for (const [x, z, c] of [[15, 20, "#4ccab9"], [27, 33, "#bd69df"], [33, 20, "#a8d653"]]) {
  box(x, 31, z, x + 1, 33, z + 3, c);
  box(x, 31, z + 4, x + 1, 32, z + 4, brassDark);
}

// Books on the bottom shelf, some piled and some leaning-looking.
for (let i = 0; i < 3; i++) {
  const colors = ["#623a55", "#315d59", "#80533c"];
  box(11, 25, 7 + i * 2, 20 - i, 33, 8 + i * 2, colors[i]);
  line(12, 24, 8 + i * 2, 19 - i, 24, 8 + i * 2, 0, "#d5be8b");
  box(11, 24, 7 + i * 2, 12, 24, 8 + i * 2, brassDark);
}
for (const [x, color, height] of [
  [12, "#426265", 5], [15, "#78404f", 6], [18, "#78543b", 4]
]) {
  box(x, 26, 12, x + 2, 32, 12 + height, color);
  box(x, 25, 12, x + 2, 25, 12 + height, "#a77951");
  line(x, 24, 13, x + 2, 24, 13, 0, brassLight);
}

// Friendly oversized old skull, with deep readable eye sockets.
ellipsoid(26, 26, 12, 3.5, 3, 3.5, "#d7c7a1");
ellipsoid(25, 24, 14, 2, 1, 1, "#eee0ba");
box(24, 23, 8, 28, 27, 10, "#c4b28f");
box(24, 22, 9, 28, 23, 10, "#ead8b0");
for (const x of [24, 28]) {
  ellipsoid(x, 22, 12, 1.1, 0.7, 1.2, "#493b37");
  set(x, 21, 12, "#251f25");
}
set(26, 21, 10, "#51413a");
for (const x of [24, 25, 27, 28]) set(x, 21, 8, "#765d4b");

// Small brass balance scale, complete with hanging pans.
box(34, 25, 7, 39, 30, 7, brassDark);
box(35, 26, 8, 38, 29, 8, brass);
cylinder(36, 27, 8, 1, 7, brass);
sphere(36, 27, 15, 1, brassLight);
line(31, 27, 14, 40, 27, 14, 0, brassLight);
for (const x of [32, 40]) {
  line(x, 27, 14, x, 27, 11, 0, brassDark);
  line(x - 2, 27, 11, x, 27, 10, 0, brass);
  line(x + 2, 27, 11, x, 27, 10, 0, brass);
  ellipsoid(x, 27, 10, 2, 1.5, 0.7, brass);
  line(x - 1, 25, 10, x + 1, 25, 10, 0, brassLight);
}

// Moss at the exposed wall edges, and tiny storybook mushrooms.
for (const x of [2, 3, 44, 45]) {
  for (let z = 1; z <= 10; z++) {
    if (rand() < 0.62) set(x, 37, z, rand() < 0.5 ? "#5e774c" : "#8b9b61");
  }
}
for (const [x, y, h, cap] of [[3, 35, 3, "#bd668a"], [45, 36, 4, "#b27851"]]) {
  box(x, y, 0, x, y, h, "#ded1a7");
  ellipsoid(x, y, h + 1, 1.6, 1.4, 1, cap);
  set(x - 1, y - 1, h + 1, "#f2d9ad");
  set(x + 1, y - 1, h + 1, "#f2d9ad");
}