fogón

← Medieval3D assetfogon/campesino

Campesino

by fogonCC09791 blocks
CampesinoDrag to turn it
// «Campesino» · gpt-6-sol (medium)
// A chunky cartoon medieval peasant man: a brown tunic tied with a rope belt, beige trousers, simple dark shoes, a round head with a short brown beard, a straw hat, black dot eyes, carrying a small sack over one shoulder.

// Chunky peasant, facing -y.
const tunic = "#79502f", tunicLight = "#916039", tunicDark = "#604027";
const skin = "#e8b985", skinShade = "#cf986b";
const straw = "#dfbd68", strawLight = "#f1d584", strawDark = "#ae8742";
const rope = "#e2c48b", ropeDark = "#aa8450";

// Walking legs, each hinged at its hip.
function leg(name, x, speed) {
  part(name, [x, 24, 17]);
  box(x - 2, 21, 6, x + 2, 28, 18, "#b9a887");
  box(x - 2, 20, 6, x + 2, 22, 10, "#c9b99a");
  box(x - 2, 21, 5, x + 2, 28, 6, "#a29177");

  box(x - 3, 20, 1, x + 3, 29, 5, "#49362b");
  box(x - 3, 17, 0, x + 3, 27, 2, "#392b25");
  box(x - 2, 17, 3, x + 2, 20, 4, "#594032");
  box(x - 3, 17, 0, x + 3, 27, 0, "#2e2724");
  animate(name, { type: "swing", axis: "x", speed, amplitude: 0.3 });
}
leg("leftLeg", 20, 5);
leg("rightLeg", 28, -5);

// Tunic and broad, slightly uneven hem.
part("body");
ellipsoid(24, 24, 24, 9, 7, 9, tunic);
box(17, 18, 19, 31, 29, 29, tunic);
box(16, 17, 16, 32, 30, 20, tunic);
box(15, 18, 15, 18, 29, 18, tunicDark);
box(30, 18, 15, 33, 29, 18, tunicDark);
box(18, 17, 16, 30, 17, 18, tunicLight);
box(19, 18, 29, 29, 29, 31, tunicLight);

// Small woven flecks on the cloth.
forEach((x, y, z, color) => {
  if (color === tunic && rand() < 0.045)
    set(x, y, z, rand() < 0.55 ? tunicLight : tunicDark);
});

// Neck opening and collar.
box(20, 17, 29, 28, 20, 30, tunicDark);
box(22, 19, 29, 26, 26, 32, skinShade);
box(22, 17, 30, 26, 19, 31, skin);

// Rope belt wrapping the waist, with a prominent front knot.
box(17, 17, 20, 31, 17, 21, ropeDark);
box(19, 16, 20, 29, 16, 21, rope);
box(16, 19, 20, 17, 28, 21, rope);
box(31, 19, 20, 32, 28, 21, rope);
box(23, 15, 20, 25, 16, 22, strawLight);
set(24, 14, 21, ropeDark);
line(24, 15, 19, 23, 15, 15, 0, rope);
line(25, 15, 19, 26, 15, 17, 0, ropeDark);

// Sack slung over his right shoulder, behind the arm.
ellipsoid(38, 28, 25, 4, 5, 7, "#937047");
ellipsoid(39, 29, 22, 3, 4, 3, "#795b3d");
box(35, 25, 31, 38, 29, 33, "#aa8251");
box(35, 25, 33, 37, 28, 34, ropeDark);
line(33, 23, 31, 36, 26, 33, 1, rope);
line(32, 17, 30, 19, 16, 21, 0, ropeDark);
line(32, 16, 30, 20, 15, 22, 0, rope);
for (let i = 0; i < 15; i++) {
  const x = 36 + Math.floor(rand() * 6);
  const z = 20 + Math.floor(rand() * 10);
  set(x, 23, z, rand() < 0.5 ? "#ad895a" : "#735638");
}

// Head, ears, beard and friendly little face.
ellipsoid(24, 23, 35, 7, 7, 6, skin);
box(16, 21, 34, 17, 24, 36, skinShade);
box(31, 21, 34, 32, 24, 36, skinShade);
ellipsoid(24, 17, 32, 5, 3, 3, "#684328");
box(20, 15, 32, 28, 16, 33, "#71482b");
box(19, 17, 32, 20, 19, 35, "#71482b");
box(28, 17, 32, 29, 19, 35, "#71482b");
box(21, 15, 34, 23, 16, 34, "#604027");
box(25, 15, 34, 27, 16, 34, "#604027");
box(23, 14, 33, 25, 15, 34, skinShade);
set(24, 13, 34, skin);
set(24, 14, 31, "#382a25");
set(21, 16, 36, "#211c1a");
set(27, 16, 36, "#211c1a");
set(18, 17, 34, "#d89a75");
set(30, 17, 34, "#d89a75");

// Wide straw brim, dark hatband, and rounded crown.
ellipsoid(24, 22, 40, 12, 10, 1, strawDark);
ellipsoid(24, 22, 41, 12, 10, 1, straw);
box(16, 16, 41, 32, 28, 41, strawLight);
ellipsoid(24, 22, 43, 8, 7, 2, straw);
box(17, 16, 42, 31, 28, 42, strawDark);
box(18, 16, 42, 30, 16, 42, "#785634");
box(19, 16, 45, 29, 27, 45, strawLight);
for (let i = 0; i < 35; i++) {
  const x = 17 + Math.floor(rand() * 15);
  const y = 16 + Math.floor(rand() * 13);
  if (get(x, y, 43) === straw)
    set(x, y, 43, rand() < 0.5 ? strawLight : strawDark);
}

// Arms swing opposite the leg on the same side.
function arm(name, x, speed) {
  part(name, [x, 24, 29]);
  ellipsoid(x, 24, 27, 4, 5, 4, tunic);
  box(x - 2, 20, 23, x + 2, 28, 27, tunicLight);
  box(x - 2, 19, 22, x + 2, 27, 23, tunicDark);
  box(x - 2, 21, 17, x + 2, 26, 21, skin);
  box(x - 2, 20, 15, x + 2, 26, 18, skinShade);
  box(x - 1, 19, 16, x + 1, 20, 18, skin);
  animate(name, { type: "swing", axis: "x", speed, amplitude: 0.25 });
}
arm("leftArm", 13, -5);
arm("rightArm", 35, 5);