fogón

← Ancient and prehistory3D assetfogon/arco-del-triunfo

Arco del triunfo

by fogonCC016478 blocks
Arco del triunfoDrag to turn it
// «Arco del triunfo» · gpt-6-sol (medium)
// A Roman triumphal arch of cream stone: a big central arched passage and two smaller side arches, decorative columns on the front (-y), a carved inscription band on top in gold letters, and a small bronze chariot statue on the very top.

const stone = "#eee0bd";
const light = "#fff1d3";
const shade = "#c9b48e";
const dark = "#a8906f";
const gold = "#e8b94d";
const goldLight = "#ffe18a";
const bronze = "#826448";
const bronzeLight = "#b48a58";

// A shallow foundation keeps the three passages open above floor level.
box(2, 15, 0, 45, 32, 0, shade);
box(3, 18, 1, 44, 30, 31, stone);

function inArch(x, z, cx, spring, radius) {
  const dx = x - cx;
  if (z <= spring) return Math.abs(dx) < radius;
  return dx * dx + (z - spring) ** 2 < radius * radius;
}

// Cut the central passage and its two smaller companions right through the arch.
for (let x = 3; x <= 44; x++)
  for (let y = 18; y <= 30; y++)
    for (let z = 1; z <= 30; z++)
      if (inArch(x, z, 23.5, 21, 7.6) ||
          inArch(x, z, 8.5, 16, 4.3) ||
          inArch(x, z, 38.5, 16, 4.3))
        set(x, y, z, null);

// Subtle marble variation, concentrated on visible faces.
forEach((x, y, z, color) => {
  if (color === stone && (y === 18 || y === 30 || x === 3 || x === 44)) {
    const n = rand();
    if (n < 0.055) set(x, y, z, light);
    else if (n < 0.105) set(x, y, z, shade);
  }
});

// Raised voussoirs around the three openings on the front.
for (const [cx, spring, radius] of [[23.5, 21, 7.6], [8.5, 16, 4.3], [38.5, 16, 4.3]]) {
  for (let x = Math.floor(cx - radius - 2); x <= Math.ceil(cx + radius + 2); x++)
    for (let z = spring; z <= spring + radius + 2; z++) {
      const d = Math.hypot(x - cx, z - spring);
      if (d >= radius && d < radius + 1.7) {
        const color = ((Math.floor(x * 0.7) + Math.floor(z * 0.8)) % 4 === 0) ? shade : light;
        box(x, 16, z, x, 17, z, color);
      }
    }
}
box(23, 15, 29, 24, 17, 31, goldLight); // central keystone

// Four projecting, fluted columns.
for (const cx of [4, 15, 32, 43]) {
  box(cx - 1, 14, 1, cx + 1, 19, 3, shade);
  box(cx - 1, 14, 3, cx + 1, 18, 4, light);
  cylinder(cx, 17, 5, 1.5, 22, stone);
  for (let z = 5; z <= 26; z++)
    if (z % 5 !== 0) set(cx, 15, z, light);
  box(cx - 1, 14, 27, cx + 1, 19, 28, light);
  box(cx - 2, 14, 29, cx + 2, 19, 30, shade);
  box(cx - 2, 14, 30, cx + 2, 19, 30, light);
}

// Entablature: broad inscription field between strongly stepped cornices.
box(3, 17, 31, 44, 31, 32, shade);
box(2, 16, 32, 45, 32, 32, light);
box(3, 17, 33, 44, 31, 38, stone);
box(2, 16, 39, 45, 32, 39, shade);
box(1, 15, 40, 46, 33, 40, light);
box(3, 17, 37, 44, 17, 37, light);

for (let x = 5; x <= 43; x += 4) {
  box(x, 16, 34, x + 1, 16, 35, shade);
  set(x, 16, 38, gold);
}

// Deep red inscription tablet and a legible gold SPQR.
box(14, 15, 33, 33, 16, 38, gold);
box(15, 14, 34, 32, 14, 37, "#893f39");
box(16, 14, 38, 31, 14, 38, "#ad6850");
const glyphs = {
  S: ["111", "100", "111", "001", "111"],
  P: ["110", "101", "110", "100", "100"],
  Q: ["111", "101", "101", "111", "001"],
  R: ["110", "101", "110", "101", "101"]
};
"SPQR".split("").forEach((letter, i) => {
  glyphs[letter].forEach((row, j) => {
    for (let k = 0; k < 3; k++)
      if (row[k] === "1") set(17 + i * 4 + k, 13, 38 - j, j === 0 ? goldLight : gold);
  });
});

// Small bronze chariot: cart, two conspicuous wheels, horse, and driver.
box(22, 22, 42, 31, 27, 43, bronze);
box(23, 21, 44, 31, 22, 44, bronzeLight);
box(24, 26, 44, 31, 27, 44, bronzeLight);
for (const wx of [24, 29]) {
  for (let dx = -2; dx <= 2; dx++)
    for (let dz = -2; dz <= 2; dz++) {
      const d = Math.hypot(dx, dz);
      if (d >= 1.4 && d <= 2.35) set(wx + dx, 20, 43 + dz, bronzeLight);
    }
  set(wx, 19, 43, gold);
}
box(14, 23, 44, 20, 26, 45, bronze);
box(13, 23, 45, 15, 25, 46, bronzeLight);
box(11, 23, 45, 13, 25, 46, bronze);
box(12, 23, 47, 12, 24, 47, bronze);
box(14, 24, 47, 14, 24, 47, bronze);
set(11, 22, 46, "#302a27");
for (const x of [15, 19]) box(x, 23, 41, x, 24, 44, bronze);
for (const x of [16, 20]) box(x, 26, 41, x, 26, 44, bronze);
line(20, 23, 44, 24, 23, 44, 0, bronzeLight);
line(14, 22, 46, 27, 21, 45, 0, gold);
box(26, 23, 45, 28, 25, 46, bronzeLight);
set(27, 24, 47, goldLight);
set(28, 23, 47, bronze);
line(28, 23, 46, 30, 22, 47, 0, bronze);