fogón

← Medieval3D assetfogon/arquero

Arquero

by fogonCC06116 blocks
ArqueroDrag to turn it
// «Arquero» · gpt-6-sol (medium)
// A chunky medieval archer standing: a green hood and tunic with a brown leather belt, brown trousers and boots, a quiver full of arrows with white fletching on his back, and a big curved wooden longbow held in his left hand. Arms and legs are moving parts.

// A storybook archer facing -y.
const green = "#426b3c";
const greenLight = "#59864b";
const greenDark = "#304f32";
const leather = "#75472b";
const leatherLight = "#98643a";
const leatherDark = "#513321";
const skin = "#d7a879";
const skinShade = "#b98259";
const wood = "#8c572d";
const woodLight = "#b17a42";

// Sturdy torso and flared tunic.
box(19, 20, 19, 29, 28, 28, green);
box(18, 20, 23, 30, 28, 28, green);
box(18, 19, 16, 30, 28, 20, greenDark);
box(19, 19, 17, 29, 28, 19, green);
box(20, 18, 20, 28, 20, 27, greenLight);
box(19, 19, 27, 29, 27, 29, greenDark);
box(21, 19, 29, 27, 26, 31, "#d1ad83"); // neck

// Subtle hand-dyed texture, kept on the large cloth surfaces.
forEach((x, y, z, color) => {
  if (color === green && rand() < 0.11)
    set(x, y, z, rand() < 0.65 ? "#4c7742" : greenDark);
});

// Tunic seams, skirt points and a little gold heraldry.
box(19, 18, 16, 20, 19, 19, greenLight);
box(28, 18, 16, 29, 19, 19, greenLight);
box(23, 18, 16, 25, 19, 18, greenLight);
box(23, 17, 23, 25, 18, 25, "#bd9b4b");
set(24, 17, 26, "#e2c36b");
set(24, 17, 22, "#e2c36b");
set(22, 18, 25, "#d1b35d");
set(26, 18, 25, "#d1b35d");

// Wide leather belt and buckle.
box(18, 18, 19, 30, 29, 21, leatherDark);
box(19, 17, 20, 29, 18, 21, leather);
box(22, 16, 19, 26, 17, 22, "#c89f53");
box(23, 15, 20, 25, 16, 21, leatherDark);
set(24, 15, 20, "#e3bd70");
box(29, 18, 19, 31, 22, 22, leather);
set(30, 17, 20, "#d2a65b");

// Quiver, strapped diagonally over the right shoulder and visible beside it.
line(27, 29, 27, 32, 30, 22, 1, leatherDark);
line(30, 29, 28, 33, 31, 34, 2, leather);
box(30, 28, 22, 34, 32, 33, leather);
box(31, 28, 23, 34, 28, 31, leatherLight);
box(30, 28, 32, 34, 32, 33, "#bb8549");
box(31, 28, 24, 34, 28, 24, leatherDark);
box(31, 28, 29, 34, 28, 29, leatherDark);
for (let i = 0; i < 5; i++) {
  const x = 30 + i;
  const y = 29 + (i % 2);
  line(x, y, 32, x, y, 38 - (i % 2), 0, "#93714a");
  box(x, y, 35, x, y + 1, 37 - (i % 2),
      i % 2 ? "#e8e0c7" : "#f5eedb");
}

// Face, with a deep green hood framing it.
box(20, 19, 31, 28, 25, 37, skin);
box(20, 17, 32, 28, 19, 36, skin);
box(22, 16, 32, 26, 17, 34, skin);
box(23, 15, 32, 25, 16, 33, skinShade); // nose
box(21, 16, 35, 23, 16, 35, "#f1e9d8");
box(26, 16, 35, 28, 16, 35, "#f1e9d8");
set(22, 15, 35, "#30352c");
set(27, 15, 35, "#30352c");
box(21, 16, 36, 23, 16, 36, "#65452d");
box(26, 16, 36, 28, 16, 36, "#65452d");
box(23, 16, 31, 25, 16, 31, "#7b4936");
box(22, 16, 30, 26, 17, 30, skinShade);

// Hood back, peaked crown, and thick shadowed opening.
box(18, 20, 32, 19, 27, 38, greenDark);
box(29, 20, 32, 30, 27, 38, greenDark);
box(19, 23, 33, 29, 28, 39, greenDark);
box(19, 18, 38, 29, 27, 40, green);
box(21, 19, 40, 27, 25, 41, greenLight);
box(18, 17, 35, 20, 21, 38, green);
box(28, 17, 35, 30, 21, 38, green);
box(19, 17, 37, 29, 19, 39, greenLight);
box(20, 17, 37, 28, 17, 37, greenDark);
box(18, 17, 32, 20, 20, 35, greenDark);
box(28, 17, 32, 30, 20, 35, greenDark);
box(20, 17, 30, 28, 19, 31, green);
box(22, 16, 30, 26, 17, 30, greenLight);

// Legs move opposite their corresponding arms.
part("left leg", [21, 23, 16]);
box(19, 21, 7, 23, 27, 16, "#70543a");
box(19, 20, 5, 23, 27, 9, "#805e40");
box(19, 20, 1, 23, 27, 6, leatherDark);
box(18, 17, 0, 23, 27, 3, leather);
box(18, 17, 1, 23, 18, 2, leatherLight);
box(19, 19, 5, 23, 20, 5, "#a77b48");
animate("left leg", { type: "swing", axis: "x", speed: -3, amplitude: 0.3 });

part("right leg", [28, 23, 16]);
box(26, 21, 7, 30, 27, 16, "#70543a");
box(26, 20, 5, 30, 27, 9, "#805e40");
box(26, 20, 1, 30, 27, 6, leatherDark);
box(26, 17, 0, 31, 27, 3, leather);
box(26, 17, 1, 31, 18, 2, leatherLight);
box(26, 19, 5, 30, 20, 5, "#a77b48");
animate("right leg", { type: "swing", axis: "x", speed: 3, amplitude: 0.3 });

// Left arm reaches out to grip the bow. The bow travels with the hand.
part("left arm", [18, 23, 27]);
ellipsoid(17, 22, 26, 3, 4, 3, greenDark);
line(17, 21, 26, 12, 17, 23, 2, green);
line(12, 17, 23, 9, 15, 22, 2, leather);
box(7, 13, 20, 10, 16, 23, skin);
box(8, 12, 21, 10, 13, 22, skinShade);

// The longbow curves away from its drawn string.
for (let z = 6; z <= 38; z++) {
  const x = 13 - 6 * Math.sin(Math.PI * (z - 6) / 32);
  const nextX = 13 - 6 * Math.sin(Math.PI * (z - 5) / 32);
  line(x, 14, z, nextX, 14, z + 1, 1,
       z > 18 && z < 26 ? woodLight : wood);
}
box(6, 13, 19, 9, 15, 25, leatherDark); // wrapped grip
box(7, 12, 20, 9, 13, 24, leatherLight);
box(12, 13, 6, 14, 15, 8, woodLight);
box(12, 13, 36, 14, 15, 38, woodLight);
line(13, 14, 7, 29, 14, 22, 0, "#ded4b2");
line(29, 14, 22, 13, 14, 37, 0, "#ded4b2");
animate("left arm", { type: "swing", axis: "x", speed: 3, amplitude: 0.3 });

// Right hand draws a nocked arrow.
part("right arm", [30, 23, 27]);
ellipsoid(32, 22, 26, 3, 4, 3, greenDark);
line(32, 20, 26, 34, 17, 23, 2, green);
line(34, 17, 23, 29, 15, 22, 2, leather);
box(27, 13, 20, 30, 16, 23, skin);
box(27, 12, 21, 29, 13, 22, skinShade);
line(9, 12, 22, 30, 12, 22, 0, "#bfa478");
box(8, 12, 21, 10, 12, 23, "#a1a5a1"); // arrowhead
box(27, 11, 22, 30, 13, 22, "#eee9dc");
box(28, 12, 21, 30, 12, 23, "#e1ded3");
animate("right arm", { type: "swing", axis: "x", speed: -3, amplitude: 0.3 });

part("body", [24, 24, 20]);