fogón

← Antiguo y prehistoriaObjeto 3Dfogon/fosil

Fósil

de fogonCC011080 bloques
FósilArrastrá para girarlo
// «Fósil» · gpt-6-sol (medium)
// A big slab of sandy beige rock lying flat on the ground with a dinosaur skeleton fossil embedded in its top: a cream-white skull, spine, ribs and tail bones laid out clearly in relief, with a few cracks and darker sand tones around them.

const sand = ["#d9b779", "#dfbf82", "#e6c98e", "#d3ae70"];
const bone = "#f3e7c9";
const boneLight = "#fff3d9";
const boneShade = "#cfbea0";
const fossilShadow = "#aa885b";

// A broad, slightly clipped sandstone slab.
for (let x = 4; x <= 43; x++) {
  for (let y = 5; y <= 42; y++) {
    const edgeX = Math.min(x - 4, 43 - x);
    const edgeY = Math.min(y - 5, 42 - y);
    if (edgeX + edgeY < 5) continue;

    for (let z = 0; z <= 6; z++) {
      let color;
      if (z === 0) color = "#a47c4c";
      else if (z <= 2) color = rand() < 0.16 ? "#b48c56" : "#bd965e";
      else if (z <= 5) color = rand() < 0.19 ? "#c9a46a" : "#d1ac70";
      else color = sand[Math.floor(rand() * sand.length)];
      set(x, y, z, color);
    }
  }
}

// Scattered grains and patches of darker, weathered sand.
for (let i = 0; i < 290; i++) {
  const x = 6 + Math.floor(rand() * 36);
  const y = 7 + Math.floor(rand() * 34);
  if (get(x, y, 6)) {
    set(x, y, 6, rand() < 0.7 ? "#c6a36c" : "#ebce94");
  }
}

// Fine cracks, kept away from the main fossil.
const cracks = [
  [[7, 14], [11, 15], [13, 12], [16, 12]],
  [[36, 8], [34, 11], [37, 12], [39, 14]],
  [[7, 34], [10, 32], [11, 35], [14, 37]],
  [[35, 38], [37, 35], [40, 34]],
  [[39, 20], [41, 18], [42, 16]]
];
for (const points of cracks) {
  for (let i = 1; i < points.length; i++) {
    line(points[i - 1][0], points[i - 1][1], 7,
         points[i][0], points[i][1], 7, 0, "#98734b");
  }
}

// Each exposed bone has a darker impression beneath its cream-white relief.
function boneLine(x0, y0, x1, y1, width = 0) {
  line(x0, y0, 7, x1, y1, 7, 1, fossilShadow);
  line(x0, y0, 8, x1, y1, 8, width, bone);
}
function joint(x, y, r = 1) {
  sphere(x, y, 8, r, boneLight);
}

// Skull: broad cranium, projecting muzzle, eye sockets and small teeth.
ellipsoid(15, 24, 7, 6, 6, 1, fossilShadow);
ellipsoid(15, 24, 8, 5, 5, 1, bone);
ellipsoid(10, 24, 7, 4, 3, 1, fossilShadow);
ellipsoid(10, 24, 8, 4, 2, 1, bone);
line(9, 21, 9, 14, 21, 9, 0, boneLight);
line(9, 27, 9, 14, 27, 9, 0, boneLight);
ellipsoid(15, 21, 9, 1, 1, 1, "#806b50");
ellipsoid(15, 27, 9, 1, 1, 1, "#806b50");
set(9, 23, 9, "#806b50");
set(9, 25, 9, "#806b50");
for (const x of [9, 11, 13]) {
  set(x, 21, 10, boneLight);
  set(x, 27, 10, boneLight);
}

// Vertebrae form a strong central line from skull to tail.
boneLine(19, 24, 35, 24, 1);
for (const x of [20, 23, 26, 29, 32, 35]) {
  line(x, 22, 9, x, 26, 9, 0, boneLight);
  joint(x, 24);
}

// Four paired, gracefully curving ribs.
for (const x of [23, 26, 29, 32]) {
  for (const side of [-1, 1]) {
    boneLine(x, 24 + side * 2, x + 1, 24 + side * 5);
    boneLine(x + 1, 24 + side * 5, x + 3, 24 + side * 8);
    joint(x + 3, 24 + side * 8);
  }
}

// Long tapering tail, gently bent toward the back of the slab.
boneLine(35, 24, 38, 25, 1);
boneLine(38, 25, 41, 27);
boneLine(41, 27, 42, 28);
joint(38, 25);

// Forelimbs splayed beside the skull and shoulders.
for (const side of [-1, 1]) {
  boneLine(21, 24 + side * 3, 18, 24 + side * 7);
  boneLine(18, 24 + side * 7, 17, 24 + side * 11);
  joint(21, 24 + side * 3);
  joint(18, 24 + side * 7);
  boneLine(17, 24 + side * 11, 15, 24 + side * 12);
  boneLine(17, 24 + side * 11, 18, 24 + side * 13);
}

// Larger hind legs and three short toes on each foot.
for (const side of [-1, 1]) {
  boneLine(32, 24 + side * 3, 35, 24 + side * 7, 1);
  boneLine(35, 24 + side * 7, 37, 24 + side * 11);
  joint(32, 24 + side * 3);
  joint(35, 24 + side * 7);
  joint(37, 24 + side * 11);
  for (const dx of [-1, 0, 1]) {
    boneLine(37, 24 + side * 11, 37 + dx, 24 + side * 13);
  }
}