← AsiáticoObjeto 3Dfogon/monje-shaolin
Monje shaolín
Arrastrá para girarlo// «Monje shaolín» · gpt-6-sol (medium)
// A cartoon Shaolin monk in a kung-fu stance facing front: saffron-orange robe with a darker orange sash, bald head with a calm face, a string of big brown prayer beads around the neck, simple grey leggings and black shoes, one fist forward.
// Front faces -y. The monk stands in a wide, grounded stance.
const orange = "#e88727";
const lightOrange = "#f5a33d";
const shadowOrange = "#bf581c";
const sash = "#a9441d";
const skin = "#e9ad78";
const skinLight = "#f6c494";
const skinShadow = "#cc875d";
const grey = "#62666b";
const darkGrey = "#464a50";
const black = "#242429";
// Body and layered robe.
ellipsoid(24, 25, 24, 10, 7, 11, orange);
box(16, 20, 19, 32, 30, 29, orange);
ellipsoid(24, 25, 19, 10, 7, 4, shadowOrange);
box(18, 19, 19, 30, 19, 27, lightOrange); // bright front fold
box(17, 20, 18, 31, 20, 19, shadowOrange);
box(17, 30, 20, 31, 31, 27, shadowOrange);
forEach((x, y, z, color) => {
if (color === orange && rand() < 0.085) {
set(x, y, z, rand() < 0.62 ? lightOrange : shadowOrange);
}
});
// Wide diagonal sash and its gold-edged knot.
line(17, 19, 30, 29, 19, 20, 2, sash);
line(18, 18, 31, 30, 18, 21, 0, "#f5b34d");
box(17, 17, 20, 31, 18, 22, sash);
box(17, 17, 22, 31, 17, 22, "#e7782b");
ellipsoid(29, 16, 21, 2, 2, 2, "#ef9b32");
line(29, 17, 20, 31, 17, 16, 1, sash);
line(28, 17, 20, 28, 17, 17, 1, "#dc6b25");
// Collar: a clear V opening above the robe.
line(18, 19, 32, 24, 17, 27, 1, "#f8b44d");
line(30, 19, 32, 24, 17, 27, 1, shadowOrange);
ellipsoid(24, 19, 30, 3, 2, 3, skin);
box(22, 17, 31, 26, 19, 33, skin);
// Neck and bald head.
cylinder(24, 24, 30, 4, 5, skinShadow);
ellipsoid(24, 23, 37, 7, 6, 7, skin);
ellipsoid(24, 22, 39, 6, 5, 5, skinLight);
ellipsoid(24, 21, 36, 6, 4, 5, skin);
ellipsoid(17, 23, 36, 2, 2, 3, skinShadow);
ellipsoid(31, 23, 36, 2, 2, 3, skinShadow);
set(16, 21, 36, skinLight);
set(32, 21, 36, skinLight);
// Calm brows and eyes on the front of the face.
line(20, 16, 38, 22, 16, 38, 0, "#71483a");
line(26, 16, 38, 28, 16, 38, 0, "#71483a");
line(20, 15, 36, 22, 15, 36, 0, "#513b32");
line(26, 15, 36, 28, 15, 36, 0, "#513b32");
set(21, 14, 36, "#332c2a");
set(27, 14, 36, "#332c2a");
box(23, 15, 34, 25, 15, 36, skinShadow);
set(24, 14, 35, skinLight);
line(22, 16, 32, 26, 16, 32, 0, "#955e4c");
set(21, 16, 33, "#da926e");
set(27, 16, 33, "#da926e");
// Six small temple marks.
for (const [x, z] of [[21, 41], [24, 42], [27, 41], [21, 39], [24, 40], [27, 39]]) {
set(x, 17, z, "#a7684d");
}
// Large wooden prayer beads draped around the collar.
for (let i = 0; i < 18; i++) {
const a = i * Math.PI * 2 / 18;
const x = 24 + Math.cos(a) * 7;
const y = 23 + Math.sin(a) * 5;
const z = 31 - Math.max(0, -Math.sin(a)) * 2;
sphere(x, y, z, 1.35, i % 3 === 0 ? "#754020" : "#8b4d26");
set(Math.round(x), Math.round(y - 1), Math.round(z + 1), "#b1743c");
}
for (const [x, y, z] of [[22, 17, 29], [23, 16, 27], [24, 16, 25], [25, 16, 27], [26, 17, 29]]) {
sphere(x, y, z, 1.4, "#824722");
set(x, y - 1, z + 1, "#b7773d");
}
// Left leg steps toward the viewer.
part("leftLeg", [18, 25, 19]);
ellipsoid(18, 23, 14, 4, 4, 6, grey);
box(15, 19, 6, 21, 25, 15, grey);
box(15, 18, 6, 21, 18, 10, "#777b7e");
box(15, 19, 10, 21, 19, 11, darkGrey);
ellipsoid(18, 20, 5, 4, 4, 3, darkGrey);
box(14, 14, 1, 22, 24, 4, black);
box(15, 13, 1, 21, 15, 3, "#343439");
box(14, 14, 0, 22, 24, 0, "#141419");
box(15, 14, 4, 21, 16, 4, "#44434a");
animate("leftLeg", { type: "swing", axis: "x", speed: -5, amplitude: 0.25 });
// Right leg braces farther back.
part("rightLeg", [30, 27, 19]);
ellipsoid(30, 28, 14, 4, 4, 6, grey);
box(27, 25, 6, 34, 32, 15, grey);
box(27, 24, 7, 34, 24, 10, "#777b7e");
box(27, 25, 11, 34, 25, 12, darkGrey);
ellipsoid(31, 28, 5, 4, 4, 3, darkGrey);
box(27, 21, 1, 36, 32, 4, black);
box(28, 20, 1, 35, 22, 3, "#343439");
box(27, 21, 0, 36, 32, 0, "#141419");
box(28, 21, 4, 35, 23, 4, "#44434a");
animate("rightLeg", { type: "swing", axis: "x", speed: 5, amplitude: 0.25 });
// Rear arm bends into a guarded fist.
part("leftArm", [16, 24, 30]);
sphere(16, 24, 30, 4, orange);
line(15, 23, 29, 10, 26, 24, 3, orange);
sphere(10, 26, 24, 3, shadowOrange);
line(10, 25, 24, 12, 20, 27, 3, lightOrange);
line(11, 21, 26, 12, 20, 27, 2, shadowOrange);
sphere(12, 19, 27, 3, skin);
box(10, 16, 26, 14, 17, 28, skinLight);
line(11, 16, 28, 13, 16, 28, 0, skinShadow);
animate("leftArm", { type: "swing", axis: "x", speed: 5, amplitude: 0.25 });
// Other arm thrusts a large, unmistakable fist forward.
part("rightArm", [32, 24, 30]);
sphere(32, 24, 30, 4, orange);
line(33, 23, 29, 36, 17, 26, 3, orange);
sphere(36, 17, 26, 3, shadowOrange);
line(35, 16, 26, 29, 9, 27, 3, lightOrange);
sphere(30, 10, 27, 3, orange);
box(27, 8, 25, 32, 9, 29, shadowOrange); // sleeve cuff
box(28, 7, 25, 32, 8, 29, "#f5ac45");
ellipsoid(29, 6, 27, 4, 3, 3, skin);
box(26, 3, 26, 32, 4, 28, skinLight);
for (const x of [27, 29, 31]) {
set(x, 2, 28, skinShadow);
}
box(30, 4, 24, 33, 6, 26, skinShadow); // curled thumb
animate("rightArm", { type: "swing", axis: "x", speed: -5, amplitude: 0.25 });import { draw } from "./assets/voxel";
import { monjeShaolin } from "./assets/monje-shaolin";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, monjeShaolin, x, y, { size: 64, angle: 0, t: performance.now() / 1000 });
// size: lo que mide en px su lado más largo
// angle: giro sobre el piso, en radianes
// t: segundos; si se mueve, se anima solo con eso# En una terminal, en la carpeta del juego
fogon assets add monje-shaolin
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["monje-shaolin"] })
# Queda en client/assets/monje-shaolin.ts
# https://fogon.page/object/monje-shaolin