fogón

← Ancient and prehistory3D assetfogon/vasijas-canopas

Vasijas canopas

by fogonCC09951 blocks
Vasijas canopasDrag to turn it
// «Vasijas canopas» · gpt-6-sol (medium)
// A set of four Egyptian canopic jars in a row on a low stone slab: cream alabaster jars with painted hieroglyph bands, each with a different animal or human head lid (human, baboon, jackal, falcon) in gold and dark colors.

const stone = ["#c9ad78", "#d7bd8a", "#e4cc9b"];
const cream = ["#e7d4a6", "#f2e1b9", "#fff0ce"];
const gold = "#e8b94d", goldLight = "#ffdb72", goldDark = "#a97429";
const lapis = "#203b70", lapisLight = "#376098";
const turquoise = "#39a99e", darkTurquoise = "#206e77";
const ink = "#172637";

function oval(cx, cy, cz, rx, ry, rz, colors) {
  for (let z = Math.ceil(cz-rz); z <= cz+rz; z++)
    for (let y = Math.ceil(cy-ry); y <= cy+ry; y++)
      for (let x = Math.ceil(cx-rx); x <= cx+rx; x++) {
        const d = ((x-cx)/rx)**2 + ((y-cy)/ry)**2 + ((z-cz)/rz)**2;
        if (d <= 1) {
          const shade = z > cz+rz*0.25 || y < cy-ry*0.4 ? 2 : z < cz-rz*0.4 ? 0 : 1;
          set(x,y,z,rand()<0.045 ? colors[Math.floor(rand()*3)] : colors[shade]);
        }
      }
}

// Low, worn sandstone display slab.
box(1,12,0,46,36,2,stone[0]);
box(2,13,3,45,35,3,stone[1]);
box(1,12,1,46,12,2,"#b9955d");
box(2,13,3,45,13,3,goldDark);
box(3,14,3,44,34,3,stone[2]);
for (let i=0;i<200;i++) {
  const x=3+Math.floor(rand()*42), y=14+Math.floor(rand()*21);
  set(x,y,3,rand()<0.55 ? "#ead5a7" : "#c9ad78");
}
for (const x of [5,16,27,38,44]) {
  box(x,12,1,x+1,12,2,gold);
  set(x,12,2,goldLight);
}
for (const x of [4,43]) {
  for (const y of [15,32]) {
    box(x,y,3,x+1,y+1,3,turquoise);
    set(x,y,3,goldLight);
  }
}

const centers=[8,19,30,41];
for (const cx of centers) {
  const cy=24;
  cylinder(cx,cy,4,3.7,2,goldDark);
  cylinder(cx,cy,5,3.5,1,goldLight);

  // Solid alabaster vessel, gently swelling toward its belly.
  for (let z=6;z<=24;z++) {
    let r = z===6 ? 3.45 : z===7 ? 3.85 :
            z<=19 ? 4.35 : z===20 ? 4.2 :
            z===21 ? 4.05 : z===22 ? 3.7 :
            z===23 ? 3.3 : 2.9;
    for (let x=cx-5;x<=cx+5;x++)
      for (let y=cy-5;y<=cy+5;y++) {
        if (((x-cx)/r)**2+((y-cy)/(r*0.94))**2>1) continue;
        let c = z<10 ? cream[0] : y<=22 || z>=21 ? cream[2] : cream[1];
        if (rand()<0.055) c=cream[Math.floor(rand()*3)];
        if (z===9 || z===10 || z===18) c=z===10 ? goldLight : goldDark;
        if (z>=12 && z<=16) c=(z===12 || z===16) ? gold : lapis;
        set(x,y,z,c);
      }
  }

  // Raised lip and the dark seam beneath the removable lid.
  cylinder(cx,cy,24,3.1,2,gold);
  cylinder(cx,cy,26,3.5,1,goldLight);
  cylinder(cx,cy,27,3.25,1,lapis);
  for (let x=cx-2;x<=cx+2;x++) set(x,20,25,goldLight);

  // Large, simple hieroglyphs, painted on the forward-facing lapis band.
  // Surface is one block farther forward at the middle than at the edges.
  for (let dx=-3;dx<=3;dx++) {
    const y=Math.abs(dx)>=3 ? 22 : Math.abs(dx)===2 ? 21 : 20;
    const x=cx+dx;
    if (dx===-3 || dx===3) {
      for (let z=13;z<=15;z++) set(x,y,z,turquoise);
    } else if (dx===-2) {
      set(x,y,13,goldLight); set(x,y,14,goldLight);
      set(x,y,15,goldLight); set(x+1,20,15,goldLight);
    } else if (dx===0) {
      set(x,y,13,goldLight); set(x,y,14,turquoise);
      set(x,y,15,goldLight);
    } else if (dx===2) {
      set(x,y,13,goldLight); set(x,y,15,goldLight);
      set(x-1,20,14,goldLight);
    }
  }
  // Turquoise lotus above the inscription.
  set(cx,20,19,darkTurquoise);
  set(cx,20,20,turquoise);
  set(cx-1,20,21,turquoise);
  set(cx+1,20,21,turquoise);
  set(cx,20,22,gold);
}

// Human-headed lid: striped blue nemes framing a friendly golden face.
{
  const x=8;
  oval(x,23,32,3.5,2.7,4.6,[lapis,lapisLight,"#5875a0"]);
  box(x-4,21,28,x-3,24,34,lapis);
  box(x+3,21,28,x+4,24,34,lapis);
  for (const z of [29,32,34]) {
    box(x-4,20,z,x-3,24,z,gold);
    box(x+3,20,z,x+4,24,z,gold);
  }
  oval(x,20,32,2.45,2.1,3.05,
       ["#ba813d","#dcaa5b","#f1c779"]);
  box(x-2,19,35,x+2,22,35,goldLight);
  box(x-1,18,36,x+1,22,36,lapis);
  set(x-1,18,33,ink); set(x+1,18,33,ink);
  set(x-1,17,33,"#ffffff"); set(x+1,17,33,"#ffffff");
  set(x,17,31,"#e6b466");
  set(x-1,18,29,goldDark); set(x,18,29,goldDark);
  set(x+1,18,29,goldDark);
}

// Baboon-headed lid: round ears, midnight-blue fur, pale muzzle.
{
  const x=19;
  oval(x,22,32,3.2,2.8,3.6,
       ["#172e52","#284778","#436696"]);
  oval(x-3,22,34,1.7,1.45,1.85,
       ["#172e52","#284778","#436696"]);
  oval(x+3,22,34,1.7,1.45,1.85,
       ["#172e52","#284778","#436696"]);
  set(x-4,20,34,gold); set(x+4,20,34,gold);
  oval(x,19,30,2.35,2,1.85,
       ["#b98543","#dab06c","#f1d090"]);
  box(x-2,19,32,x+2,20,32,"#d6a45e");
  set(x-1,18,33,ink); set(x+1,18,33,ink);
  set(x-1,17,33,"#ffffff"); set(x+1,17,33,"#ffffff");
  set(x-1,17,30,ink); set(x+1,17,30,ink);
  set(x,17,29,goldDark);
  box(x-2,21,36,x+2,23,36,gold);
}

// Jackal-headed lid: tall pointed ears and a long, unmistakable snout.
{
  const x=30;
  oval(x,22,32,2.9,2.6,3.35,
       ["#182c49","#263f68","#385881"]);
  for (const s of [-1,1]) {
    const ex=x+s*2;
    box(ex,21,35,ex+s,24,36,lapis);
    box(ex,22,37,ex+s,23,38,lapis);
    set(ex,22,39,ink);
    set(ex,20,37,goldDark);
    set(ex,20,38,gold);
  }
  oval(x,19,30,1.7,3.3,1.35,
       ["#1a2c43","#263f60","#405b78"]);
  box(x-1,16,29,x+1,18,30,lapis);
  box(x-1,15,29,x+1,16,29,ink);
  set(x-2,19,33,goldLight); set(x+2,19,33,goldLight);
  set(x-2,18,33,ink); set(x+2,18,33,ink);
  set(x-2,17,33,"#ffffff"); set(x+2,17,33,"#ffffff");
  box(x-1,20,35,x+1,23,35,gold);
}

// Falcon-headed lid: pale feathered face, blue markings and hooked gold beak.
{
  const x=41;
  oval(x,22,32,3,2.6,3.65,
       ["#b98a46","#e0b85e","#f6d886"]);
  for (const s of [-1,1]) {
    box(x+s*3,22,30,x+s*3,24,33,lapis);
    box(x+s*2,20,33,x+s*2,22,35,lapis);
    set(x+s*2,19,34,goldLight);
    set(x+s*2,18,33,ink);
    set(x+s*2,17,33,"#ffffff");
  }
  box(x-1,19,35,x+1,22,35,cream[2]);
  box(x-1,18,31,x+1,19,32,goldLight);
  box(x,17,29,x,19,31,gold);
  box(x,16,29,x,17,29,goldDark);
  box(x-1,21,36,x+1,23,36,lapis);
  set(x,21,37,goldLight);
}