fogón

← Medieval3D assetfogon/guardia-con-lanza

Guardia con lanza

by fogonCC09037 blocks
Guardia con lanzaDrag to turn it
// «Guardia con lanza» · gpt-6-sol (medium)
// A chunky cartoon castle guard: a chainmail grey body under a red tabard with a gold stripe, a round iron helmet with a nose guard, black dot eyes, brown boots, holding a tall wooden spear with a steel tip upright in one hand and a small round shield on the other arm.

// Chunky storybook castle guard, facing -y.
const iron = "#62696b", ironLight = "#929a99", ironDark = "#41494b";
const red = "#a73335", redLight = "#c84a43", redDark = "#78292d";
const gold = "#e5b94f", goldDark = "#a9782d";
const leather = "#65412d", leatherLight = "#805336";

// Chainmail torso and broad shoulders.
box(16, 20, 15, 32, 29, 31, iron);
box(15, 21, 26, 33, 29, 31, iron);
box(16, 19, 29, 32, 28, 31, ironLight);
box(16, 29, 17, 32, 30, 28, ironDark);

// Individual chainmail links on the visible sides.
for (let z = 16; z <= 29; z += 2) {
  for (let y = 21 + (z % 4 ? 1 : 0); y <= 28; y += 3) {
    set(15, y, z, rand() < 0.25 ? ironDark : ironLight);
    set(33, y, z, rand() < 0.25 ? ironDark : ironLight);
  }
}
for (let x = 17; x <= 31; x += 3) {
  for (let z = 17; z <= 28; z += 3) {
    set(x + (z % 2), 19, z, ironLight);
  }
}

// Red tabard, with a split lower hem and a bold gold center stripe.
box(18, 17, 19, 30, 20, 30, red);
box(18, 17, 15, 22, 20, 19, redDark);
box(26, 17, 15, 30, 20, 19, redDark);
box(19, 16, 22, 29, 17, 29, redLight);
box(23, 15, 17, 25, 16, 30, gold);
box(23, 16, 15, 25, 18, 18, goldDark);
box(18, 16, 20, 30, 17, 21, redDark);
box(18, 18, 14, 22, 20, 15, goldDark);
box(26, 18, 14, 30, 20, 15, goldDark);
box(17, 19, 19, 31, 20, 20, leather);
for (const x of [19, 29]) set(x, 18, 20, gold);

// Neck and face.
box(21, 20, 30, 27, 26, 33, "#bc8b67");
box(20, 17, 32, 28, 21, 37, "#d8a77d");
box(21, 16, 33, 27, 17, 37, "#e2b68b");
box(22, 15, 35, 23, 16, 35, "#262728");
box(26, 15, 35, 27, 16, 35, "#262728");
set(22, 14, 36, "#ffffff");
set(26, 14, 36, "#ffffff");
box(22, 15, 32, 23, 16, 32, leather);
box(25, 15, 32, 26, 16, 32, leather);

// Rounded iron helmet, cheek guards, brow, and projecting nose guard.
ellipsoid(24, 23, 37, 7, 7, 5, iron);
ellipsoid(24, 23, 39, 6, 6, 3, ironLight);
box(18, 17, 37, 30, 21, 38, ironDark);
box(19, 16, 38, 29, 18, 39, ironLight);
box(18, 16, 33, 20, 20, 37, iron);
box(28, 16, 33, 30, 20, 37, iron);
box(19, 15, 34, 19, 17, 36, ironLight);
box(29, 15, 34, 29, 17, 36, ironLight);
box(24, 13, 33, 24, 16, 38, ironLight);
box(23, 16, 41, 25, 26, 41, ironDark);
for (const x of [19, 29]) set(x, 15, 38, goldDark);

// Walking legs: each has its own hip pivot.
part("leftLeg", [20, 24, 16]);
box(17, 21, 5, 22, 28, 16, iron);
box(17, 20, 12, 22, 28, 15, ironDark);
box(17, 20, 3, 22, 28, 7, leather);
box(16, 17, 0, 23, 28, 3, leather);
box(17, 17, 3, 22, 19, 5, leatherLight);
box(16, 17, 0, 23, 28, 0, "#432c22");
box(17, 19, 6, 22, 20, 6, goldDark);
animate("leftLeg", { type: "swing", axis: "x", speed: 5, amplitude: 0.3 });

part("rightLeg", [28, 24, 16]);
box(26, 21, 5, 31, 28, 16, iron);
box(26, 20, 12, 31, 28, 15, ironDark);
box(26, 20, 3, 31, 28, 7, leather);
box(25, 17, 0, 32, 28, 3, leather);
box(26, 17, 3, 31, 19, 5, leatherLight);
box(25, 17, 0, 32, 28, 0, "#432c22");
box(26, 19, 6, 31, 20, 6, goldDark);
animate("rightLeg", { type: "swing", axis: "x", speed: -5, amplitude: 0.3 });

// Shield arm and its small, round heraldic shield.
part("leftArm", [16, 24, 29]);
box(11, 21, 23, 17, 28, 29, iron);
box(10, 20, 27, 17, 28, 30, ironLight);
box(11, 18, 20, 16, 24, 24, ironDark);
box(11, 17, 20, 15, 20, 23, "#bc8b67");
box(10, 16, 22, 14, 18, 24, leather);

// Backing, blue field, heavy iron rim, gold edging and central boss.
for (let x = 4; x <= 16; x++) {
  for (let z = 17; z <= 29; z++) {
    const d = Math.hypot(x - 10, z - 23);
    if (d <= 6.2) {
      set(x, 15, z, ironDark);
      set(x, 14, z, d > 4.9 ? ironDark : "#294775");
      if (d > 4.0 && d <= 4.9) set(x, 13, z, gold);
      else if (d <= 4.0) set(x, 13, z, "#304f80");
      if (d > 5.1 && d < 6.2 && (x + z) % 4 === 0)
        set(x, 13, z, ironLight);
    }
  }
}
box(9, 12, 21, 11, 12, 25, gold);
box(8, 12, 22, 12, 12, 24, gold);
set(10, 11, 23, goldDark);
animate("leftArm", { type: "swing", axis: "x", speed: -5, amplitude: 0.25 });

// Spear arm, fist, and tall upright wooden spear.
part("rightArm", [32, 24, 29]);
box(31, 21, 23, 37, 28, 29, iron);
box(31, 20, 27, 37, 28, 30, ironLight);
box(34, 17, 20, 39, 23, 24, ironDark);
box(36, 16, 20, 39, 20, 23, "#bc8b67");

// Shaft, wood grain, binding and pointed steel head.
box(37, 17, 6, 38, 18, 39, leather);
box(37, 16, 7, 37, 16, 38, leatherLight);
for (let z = 8; z <= 38; z += 6) set(38, 16, z, "#9a6740");
for (const z of [19, 25, 37, 39]) box(37, 16, z, 38, 19, z, ironDark);
box(36, 16, 40, 39, 19, 41, ironDark);
box(36, 16, 41, 39, 19, 42, ironLight);
box(37, 16, 43, 38, 18, 44, "#bdc6c4");
set(37, 17, 45, "#e0e3d7");
set(38, 17, 45, "#e0e3d7");
animate("rightArm", { type: "swing", axis: "x", speed: 5, amplitude: 0.25 });

part("body");