fogón

← Pirates and sea3D assetfogon/esqueleto-pirata

Esqueleto pirata

by fogonCC06392 blocks
Esqueleto pirataDrag to turn it
// «Esqueleto pirata» · gpt-6-sol (medium)
// A cartoon pirate skeleton standing facing -y: off-white bones with grey shading, a torn black tricorn hat, a ragged red bandana around the neck, a tattered brown vest, glowing green eye dots, holding a rusty curved sword.

const bone = "#eee6ce", boneLight = "#fff5dc", boneShade = "#b9b8ac";
const vest = "#70452b", vestLight = "#93603a", vestDark = "#4a3025";
const black = "#171b20", blackLight = "#30343a", red = "#bd302d";

// Skeleton's body and pelvis.
box(19, 20, 19, 29, 27, 22, boneShade);
ellipsoid(24, 23, 21, 6, 4, 2, bone);
box(22, 18, 20, 26, 20, 22, boneLight);
box(22, 22, 22, 26, 25, 32, boneShade);

// The vest frames exposed ribs, with a dark space behind them.
box(18, 20, 23, 30, 28, 31, vestDark);
box(20, 18, 24, 28, 20, 30, "#292825");
box(17, 17, 23, 20, 27, 31, vest);
box(28, 17, 23, 31, 27, 31, vest);
box(18, 19, 30, 20, 27, 32, vestLight);
box(28, 19, 30, 30, 27, 32, vestLight);
for (let z = 24; z <= 30; z += 2) {
  box(20, 17, z, 28, 19, z, bone);
  box(20, 17, z, 22, 19, z, boneLight);
  box(26, 17, z, 28, 19, z, boneShade);
}
box(23, 16, 24, 25, 18, 31, boneLight);
for (let z of [25, 28, 30]) set(29, 16, z, "#e8b955");
for (let i = 0; i < 45; i++) {
  const x = 17 + Math.floor(rand() * 15);
  const z = 23 + Math.floor(rand() * 9);
  const y = 20 + Math.floor(rand() * 8);
  if (get(x, y, z) === vestDark) set(x, y, z, rand() < 0.5 ? vest : vestLight);
}
// Ragged vest hems.
for (let x of [18, 19, 20, 28, 29, 30]) {
  box(x, 19, 21, x, 25, 22 + (x % 3), x % 2 ? vest : vestDark);
}

// Red neck bandana and fluttering, uneven tails.
box(20, 18, 31, 28, 27, 33, "#922629");
box(20, 16, 32, 28, 20, 33, red);
box(21, 15, 33, 27, 16, 33, "#ed5142");
line(20, 22, 32, 16, 25, 27, 1, red);
line(21, 23, 32, 17, 28, 24, 1, "#9c2529");
box(16, 25, 26, 17, 26, 27, "#e24437");

// Skull: broad cranium, pronounced cheeks and a grinning jaw.
ellipsoid(24, 22, 37, 6, 6, 5, bone);
ellipsoid(24, 21, 39, 5, 5, 3, boneLight);
box(20, 16, 32, 28, 21, 35, boneShade);
box(20, 15, 32, 28, 18, 33, boneLight);
box(18, 17, 34, 21, 20, 35, boneLight);
box(27, 17, 34, 30, 20, 35, boneLight);
box(19, 16, 36, 22, 17, 38, "#272d2a");
box(26, 16, 36, 29, 17, 38, "#272d2a");
box(20, 14, 36, 21, 15, 37, "#61f363");
box(27, 14, 36, 28, 15, 37, "#61f363");
set(20, 13, 37, "#d1ff9b");
set(27, 13, 37, "#d1ff9b");
set(23, 15, 34, "#343936");
set(25, 15, 34, "#343936");
box(21, 14, 31, 27, 15, 31, boneShade);
for (let x = 21; x <= 27; x++) {
  set(x, 14, 32, x % 2 ? boneLight : boneShade);
  if (x < 27) set(x, 13, 31, boneLight);
}
box(19, 19, 38, 19, 21, 39, boneShade);
box(29, 19, 38, 29, 21, 39, boneShade);

// Oversized, turned-up tricorn hat.
ellipsoid(24, 22, 40, 13, 9, 2, black);
ellipsoid(24, 22, 42, 9, 7, 3, blackLight);
box(18, 15, 41, 30, 19, 43, black);
for (let x = 11; x <= 37; x++) {
  const edge = Math.abs(x - 24);
  const top = 42 + Math.floor(edge / 5);
  box(x, 12, 40, x, 15, Math.min(45, top), black);
  set(x, 11, 40, blackLight);
  if (edge > 9) set(x, 12, Math.min(45, top), blackLight);
}
line(12, 11, 41, 20, 11, 42, 0, "#a77e43");
line(28, 11, 42, 36, 11, 41, 0, "#a77e43");
box(13, 12, 44, 15, 13, 45, black);
box(34, 12, 44, 36, 13, 45, black);
// A little white skull badge on the front of the hat.
box(23, 10, 42, 25, 11, 43, boneLight);
set(22, 10, 42, boneLight); set(26, 10, 42, boneLight);
set(23, 9, 42, black); set(25, 9, 42, black);
set(24, 9, 41, boneLight);
line(21, 11, 40, 27, 11, 41, 0, boneShade);
line(27, 11, 40, 21, 11, 41, 0, boneShade);

// Left leg, swinging independently from the hip.
part("leftLeg", [20, 23, 20]);
ellipsoid(20, 23, 19, 3, 3, 2, boneShade);
box(19, 22, 12, 21, 24, 19, bone);
box(19, 20, 10, 21, 23, 12, boneLight);
box(19, 22, 5, 21, 24, 10, boneShade);
box(17, 20, 2, 23, 26, 6, vest);
box(17, 17, 0, 23, 26, 3, vestDark);
box(18, 16, 2, 22, 18, 3, vestLight);
box(17, 20, 5, 23, 25, 5, vestLight);
animate("leftLeg", {type:"swing", axis:"x", speed:5, amplitude:0.3});

part("rightLeg", [28, 23, 20]);
ellipsoid(28, 23, 19, 3, 3, 2, boneShade);
box(27, 22, 12, 29, 24, 19, bone);
box(27, 20, 10, 29, 23, 12, boneLight);
box(27, 22, 5, 29, 24, 10, boneShade);
box(25, 20, 2, 31, 26, 6, vest);
box(25, 17, 0, 31, 26, 3, vestDark);
box(26, 16, 2, 30, 18, 3, vestLight);
box(25, 20, 5, 31, 25, 5, vestLight);
animate("rightLeg", {type:"swing", axis:"x", speed:-5, amplitude:0.3});

// Left arm, with a loose vest shoulder and bony fingers.
part("leftArm", [17, 23, 30]);
ellipsoid(17, 23, 30, 3, 3, 3, vest);
box(14, 20, 28, 17, 26, 30, vestLight);
line(15, 22, 28, 13, 21, 23, 1, bone);
ellipsoid(13, 20, 22, 2, 2, 2, boneShade);
for (let x = 11; x <= 14; x++) line(x, 18, 21, x, 17, 19, 0, boneLight);
animate("leftArm", {type:"swing", axis:"x", speed:-5, amplitude:0.25});

// Sword arm: blade, hand and hilt all swing together.
part("rightArm", [31, 23, 30]);
ellipsoid(31, 23, 30, 3, 3, 3, vest);
box(31, 20, 28, 34, 26, 30, vestLight);
line(33, 22, 28, 36, 19, 23, 1, bone);
ellipsoid(36, 18, 22, 2, 2, 2, boneLight);
line(37, 16, 19, 37, 15, 25, 1, "#513323");
box(36, 14, 20, 38, 15, 22, "#b58a45");
line(34, 15, 24, 40, 15, 24, 1, "#d2a453");
set(34, 14, 25, "#f0cb6c");
set(40, 14, 25, "#f0cb6c");
// Broad, rusty cutlass curving outward and back to a hooked tip.
line(38, 14, 25, 41, 14, 29, 1, "#86918d");
line(41, 14, 29, 43, 14, 33, 1, "#aeb8ae");
line(43, 14, 33, 42, 14, 36, 1, "#aeb8ae");
line(42, 14, 36, 39, 14, 39, 1, "#c8c9b7");
line(39, 14, 39, 38, 14, 39, 0, "#e1dec7");
for (let [x,z] of [[39,27],[40,29],[42,32],[43,34],[41,37]]) {
  set(x, 13, z, "#a75c37");
  set(x, 14, z+1, "#765043");
}
animate("rightArm", {type:"swing", axis:"x", speed:5, amplitude:0.25});
part("body");