← Antiguo y prehistoriaObjeto 3Dfogon/vasijas-canopas
Vasijas canopas
Arrastrá para girarlo// «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);
}import { draw } from "./assets/voxel";
import { vasijasCanopas } from "./assets/vasijas-canopas";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, vasijasCanopas, x, y, { size: 64, angle: 0, t: performance.now() / 1000 });
// size: lo que mide en px su lado más largo
// angle: giro sobre el piso, en radianes
// t: segundos; si se mueve, se anima solo con eso# En una terminal, en la carpeta del juego
fogon assets add vasijas-canopas
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["vasijas-canopas"] })
# Queda en client/assets/vasijas-canopas.ts
# https://fogon.page/object/vasijas-canopas