fogón

← Ancient and prehistory3D assetfogon/legionario-romano

Legionario romano

by fogonCC09347 blocks
Legionario romanoDrag to turn it
// «Legionario romano» · gpt-6-sol (medium)
// A chunky cartoon Roman legionary standing facing front (-y): a steel helmet with a red crest, segmented silver armor over a red tunic, a big curved red rectangular shield with gold decoration in one hand and a short sword in the other, sandals.

const red = "#a9272b", redLight = "#c93b3a", redDark = "#791d26";
const gold = "#e8b44e", goldLight = "#ffd47a", goldDark = "#a77530";
const steel = "#aeb8bb", steelLight = "#dce2df", steelDark = "#737e85";
const skin = "#dbad82", skinLight = "#edc49b", leather = "#754a32";

// Legs are separate parts, joined at the hips.
part("leftLeg", [22, 24, 18]);
box(20, 21, 11, 24, 27, 18, redDark);
box(20, 21, 3, 24, 26, 11, skin);
box(19, 17, 0, 25, 28, 2, leather);
box(20, 16, 1, 24, 21, 2, skinLight);
box(20, 19, 3, 24, 26, 4, "#a97545");
box(20, 21, 6, 24, 26, 7, "#a97545");
box(21, 19, 4, 22, 25, 8, goldDark);
animate("leftLeg", { type: "swing", axis: "x", speed: 4, amplitude: 0.3 });

part("rightLeg", [28, 24, 18]);
box(26, 21, 11, 30, 27, 18, redDark);
box(26, 21, 3, 30, 26, 11, skin);
box(25, 17, 0, 31, 28, 2, leather);
box(26, 16, 1, 30, 21, 2, skinLight);
box(26, 19, 3, 30, 26, 4, "#a97545");
box(26, 21, 6, 30, 26, 7, "#a97545");
box(28, 19, 4, 29, 25, 8, goldDark);
animate("rightLeg", { type: "swing", axis: "x", speed: -4, amplitude: 0.3 });

part("body");

// Red tunic and its dangling, gold-tipped skirt panels.
box(18, 19, 19, 32, 30, 29, red);
box(19, 19, 16, 31, 29, 20, redDark);
for (let x = 19; x <= 31; x += 3) {
  box(x, 17, 15, x + 1, 21, 20, redLight);
  box(x, 16, 15, x + 1, 17, 16, goldDark);
}
box(18, 17, 20, 32, 30, 21, leather);
box(19, 16, 20, 31, 17, 21, goldDark);
box(24, 15, 19, 27, 17, 22, gold);

// Chunky segmented cuirass, with each horizontal plate overlapping the next.
box(19, 18, 22, 31, 29, 30, steelDark);
box(20, 17, 23, 30, 29, 30, steel);
for (let z = 23; z <= 29; z += 2) {
  box(20, 16, z, 30, 18, z, steelLight);
  box(20, 15, z - 1, 30, 16, z - 1, steel);
  box(21, 15, z - 1, 29, 15, z - 1, "#c4ccca");
}
box(23, 15, 22, 27, 16, 23, goldDark);
box(24, 14, 22, 26, 15, 23, gold);
box(18, 18, 28, 21, 29, 31, steel);
box(29, 18, 28, 33, 29, 31, steel);
box(18, 17, 30, 22, 27, 31, steelLight);
box(28, 17, 30, 33, 27, 31, steelLight);
box(19, 16, 30, 20, 19, 30, goldDark);
box(31, 16, 30, 32, 19, 30, goldDark);

// Left arm grips the back of the shield.
box(16, 20, 23, 19, 27, 29, red);
box(14, 17, 18, 17, 23, 24, skin);
box(13, 15, 19, 16, 19, 22, skinLight);
box(15, 18, 24, 18, 24, 26, steelDark);

// Face and neck.
box(23, 20, 29, 27, 26, 33, skin);
ellipsoid(25, 22, 34, 5, 5, 5, skin);
box(22, 16, 31, 28, 19, 35, skinLight);
box(24, 15, 31, 26, 17, 33, skin);
set(23, 15, 33, "#302b2b");
set(27, 15, 33, "#302b2b");
set(23, 14, 34, "#ffffff");
set(27, 14, 34, "#ffffff");
box(24, 15, 30, 26, 15, 30, "#934d47");

// Steel helmet: dome, brow band, cheek guards, and red transverse crest.
ellipsoid(25, 22, 37, 6, 6, 4, steelDark);
ellipsoid(25, 21, 38, 5, 5, 3, steel);
box(20, 16, 35, 30, 19, 36, steelLight);
box(19, 18, 34, 21, 25, 36, steelDark);
box(29, 18, 34, 31, 25, 36, steelDark);
box(19, 16, 30, 21, 19, 34, steel);
box(29, 16, 30, 31, 19, 34, steel);
box(19, 15, 34, 21, 17, 35, steelLight);
box(29, 15, 34, 31, 17, 35, steelLight);
box(22, 15, 36, 28, 16, 36, goldDark);
box(24, 14, 36, 26, 15, 37, gold);
box(19, 20, 40, 31, 24, 40, goldDark);
for (let x = 19; x <= 31; x++) {
  const height = (x < 21 || x > 29) ? 42 : 44;
  box(x, 19, 41, x, 25, height, (x % 3 === 0) ? redDark : red);
  box(x, 18, height - 1, x, 21, height, redLight);
}

// Broad, gently curved rectangular scutum.
for (let x = 5; x <= 17; x++) {
  const front = 11 + Math.floor(Math.abs(x - 11) / 4);
  const top = (x === 5 || x === 17) ? 30 : 32;
  const bottom = (x === 5 || x === 17) ? 11 : 9;
  box(x, front, bottom, x, 16, top, redDark);
  box(x, front - 1, bottom + 1, x, front, top - 1, (x % 4 === 0) ? redLight : red);
  box(x, front - 2, bottom, x, front, bottom + 1, goldDark);
  box(x, front - 2, top - 1, x, front, top, gold);
  if (x === 5 || x === 17) box(x, front - 2, bottom, x, 16, top, gold);
}
// Gold lightning wings and a prominent central shield boss.
for (const side of [-1, 1]) {
  for (let i = 1; i <= 5; i++) {
    const x = 11 + side * i;
    const y = 9 + Math.floor(i / 4);
    box(x, y, 23 + Math.floor(i / 2), x, y, 25 + Math.floor(i / 2), gold);
    box(x, y, 16 - Math.floor(i / 2), x, y, 18 - Math.floor(i / 2), gold);
  }
}
box(9, 8, 19, 13, 10, 22, goldDark);
box(10, 7, 20, 12, 9, 22, goldLight);
set(11, 6, 21, steelLight);

// Sword arm swings at the shoulder; blade points proudly upward.
part("swordArm", [33, 24, 28]);
box(32, 21, 23, 36, 27, 29, red);
box(32, 19, 27, 36, 27, 29, steel);
box(35, 18, 19, 38, 23, 24, skin);
box(37, 15, 19, 40, 20, 22, skinLight);
box(38, 15, 22, 39, 17, 27, leather);
box(36, 14, 26, 41, 18, 27, gold);
box(38, 14, 27, 39, 18, 35, steelDark);
box(38, 13, 28, 39, 14, 35, steelLight);
box(38, 15, 36, 39, 17, 37, steel);
box(38, 16, 38, 39, 16, 38, steelLight);
box(38, 14, 20, 39, 15, 21, goldDark);
animate("swordArm", { type: "swing", axis: "x", speed: 3, amplitude: 0.4 });