fogón

← Medieval3D assetfogon/soporte-espada-escudo

Soporte con espada y escudo

by fogonCC012361 blocks
Soporte con espada y escudoDrag to turn it
// «Soporte con espada y escudo» · gpt-6-sol (medium)
// A wooden weapon display stand: a dark wooden base and an upright post with a crossbar, holding a big kite-shaped heater shield divided into royal blue and deep red with a gold lion or cross emblem and a grey iron rim, and in front of it a long straight silver sword with a gold cross guard, brown leather grip and round pommel, standing point down, plus a steel helmet on top of the post.

const wood = "#3b241b", woodLight = "#60402a", woodDark = "#291a17";
const iron = "#636b70", ironLight = "#a2a9aa", ironDark = "#41494f";
const gold = "#d6a943", goldLight = "#f2ce70", goldDark = "#987029";
const blue = "#23448b", blueLight = "#3057a0";
const red = "#892c3b", redLight = "#a83b49";

// Broad, low timber plinth.
box(7, 12, 0, 41, 36, 2, woodDark);
box(8, 13, 2, 40, 35, 3, wood);
box(10, 15, 4, 38, 33, 4, woodLight);
for (let x = 10; x <= 38; x += 7) {
  box(x, 13, 3, x, 35, 3, woodDark);
}
for (let x of [8, 39]) {
  for (let y of [13, 34]) {
    box(x, y, 1, x + 1, y + 1, 3, ironDark);
    set(x, y, 3, ironLight);
  }
}
for (let x = 12; x <= 36; x += 6) {
  set(x, 12, 2, goldDark);
  set(x, 36, 2, iron);
}

// Upright, feet, and the exposed ends of its crossbar.
box(21, 26, 4, 27, 31, 38, wood);
box(22, 26, 5, 22, 26, 37, woodLight);
box(26, 26, 5, 26, 26, 37, woodDark);
box(16, 23, 4, 20, 34, 7, wood);
box(28, 23, 4, 32, 34, 7, wood);
line(16, 29, 5, 22, 28, 23, 1, woodLight);
line(32, 29, 5, 26, 28, 23, 1, woodDark);
box(9, 26, 29, 39, 30, 32, wood);
box(9, 25, 29, 11, 31, 33, ironDark);
box(37, 25, 29, 39, 31, 33, ironDark);
for (let x of [10, 38]) {
  set(x, 25, 31, ironLight);
  set(x, 25, 29, ironLight);
}

// Steel helm perched above the shield: domed crown, projecting brow and visor.
for (let z = 38; z <= 44; z++) {
  const width = [6, 6, 6, 5, 4, 3, 1][z - 38];
  for (let x = 24 - width; x <= 24 + width; x++) {
    for (let y = 22; y <= 30; y++) {
      const dy = (y - 26) / 5;
      const dx = (x - 24) / (width + 0.5);
      if (dx * dx + dy * dy <= 1.15)
        set(x, y, z, x < 22 ? ironDark : z >= 42 ? ironLight : iron);
    }
  }
}
box(17, 20, 37, 31, 30, 38, ironDark);
box(18, 20, 38, 30, 21, 39, ironLight);
box(19, 19, 38, 29, 19, 38, iron);
box(20, 19, 39, 22, 19, 39, woodDark);
box(26, 19, 39, 28, 19, 39, woodDark);
box(23, 18, 37, 25, 20, 40, ironLight);
box(23, 21, 42, 25, 29, 44, ironLight);
for (let x of [18, 30]) set(x, 20, 38, goldDark);

// Kite shield. Its shoulders are wide and its lower half draws to a point.
function shieldSpan(z) {
  if (z === 7) return [24, 24];
  if (z === 8) return [22, 26];
  if (z <= 12) return [22 - (z - 8), 26 + (z - 8)];
  if (z <= 19) return [18 - Math.floor((z - 12) * 0.72),
                       30 + Math.floor((z - 12) * 0.72)];
  if (z <= 27) return [12, 36];
  if (z <= 30) return [11, 37];
  if (z <= 32) return [12, 36];
  if (z === 33) return [14, 34];
  return [17, 31];
}
for (let z = 7; z <= 34; z++) {
  const [lo, hi] = shieldSpan(z);
  for (let x = lo; x <= hi; x++) {
    const edge = Math.min(x - lo, hi - x);
    const field = x < 24 ? (rand() < 0.08 ? blueLight : blue)
                         : (rand() < 0.08 ? redLight : red);
    box(x, 19, z, x, 23, z, woodDark);
    set(x, 18, z, field);
    set(x, 17, z, field);
    if (edge <= 1 || z === 34) {
      set(x, 16, z, edge === 0 ? ironDark : ironLight);
      if (edge === 0) set(x, 17, z, iron);
    } else if (edge === 2) {
      set(x, 16, z, goldDark);
    }
  }
}
// Raised gilded cross, with broad arms and pointed heraldic ends.
box(23, 15, 15, 25, 15, 30, gold);
box(17, 15, 22, 31, 15, 24, gold);
box(22, 15, 27, 26, 15, 29, gold);
box(22, 15, 16, 26, 15, 17, gold);
box(16, 15, 23, 18, 15, 25, gold);
box(30, 15, 23, 32, 15, 25, gold);
box(24, 14, 18, 24, 14, 29, goldLight);
box(18, 14, 24, 30, 14, 24, goldLight);
for (let z of [20, 27, 31]) {
  const [lo, hi] = shieldSpan(z);
  for (let x of [lo + 1, hi - 1]) {
    set(x, 15, z, goldLight);
    set(x, 14, z, goldDark);
  }
}

// Sword in the foreground: a tapered, straight blade with a bright central ridge.
for (let z = 7; z <= 33; z++) {
  const half = z <= 9 ? Math.floor((z - 7) / 2) : z <= 14 ? 1 : 2;
  for (let x = 24 - half; x <= 24 + half; x++) {
    box(x, 11, z, x, 14, z, x === 24 ? "#e2e5df" : "#9faab1");
    set(x, 10, z, x === 24 ? "#f4f0df" :
        x < 24 ? "#c0cbd0" : "#74838d");
  }
}
box(23, 9, 32, 25, 10, 34, ironDark);
box(16, 9, 34, 32, 13, 35, goldDark);
box(18, 8, 35, 30, 9, 35, goldLight);
box(15, 9, 35, 18, 12, 37, gold);
box(30, 9, 35, 33, 12, 37, gold);
box(16, 8, 36, 17, 9, 37, goldLight);
box(31, 8, 36, 32, 9, 37, goldLight);
box(22, 9, 36, 26, 13, 40, "#69432d");
for (let z = 36; z <= 40; z++) {
  box(22, 8, z, 26, 8, z, z % 2 ? "#a37548" : "#493024");
  set(23, 7, z, z % 2 ? "#c09258" : "#70492e");
}
box(22, 9, 41, 26, 12, 41, goldDark);
sphere(24, 10, 43, 3, gold);
set(23, 7, 43, goldLight);
set(24, 7, 44, goldLight);