← Monstruos y enemigosObjeto 3Dfogon/ogro
Ogro
Arrastrá para girarlo// «Ogro» · gpt-6-sol (medium)
// A fat cartoon ogre facing -y: tan-olive skin, a huge round belly, a small bald head with one big tooth sticking up, angry little eyes, a brown patched vest, carrying a big wooden log over the right shoulder.
const skinDark = "#777f36", skin = "#a6ad50", skinLight = "#c1c76c";
const vestDark = "#4c2c20", vest = "#75442b", vestLight = "#98603a";
const barkDark = "#55321f", bark = "#80502b", barkLight = "#a97440";
// Round body and open brown vest.
ellipsoid(24, 24, 21, 12, 9, 12, skinDark);
ellipsoid(24, 23, 23, 11, 8, 10, skin);
ellipsoid(24, 24, 22, 12, 9, 11, vestDark);
ellipsoid(24, 23, 23, 11, 8, 10, vest);
ellipsoid(24, 17, 18, 10, 7, 10, skinDark);
ellipsoid(24, 16, 20, 9, 7, 8, skin);
ellipsoid(24, 14, 22, 7, 5, 5, skinLight);
// Vest lapels, seams, and a conspicuous stitched patch.
for (const x of [16, 32]) {
ellipsoid(x, 17, 25, 3, 3, 6, vestDark);
ellipsoid(x + (x < 24 ? 1 : -1), 15, 26, 2, 2, 5, vest);
}
line(18, 14, 20, 18, 15, 29, 0, vestLight);
line(30, 14, 20, 30, 15, 29, 0, vestLight);
box(14, 15, 20, 17, 15, 24, vestLight);
for (let z = 20; z <= 24; z += 2) {
set(14, 14, z, "#d0a06a");
set(17, 14, z + 1, "#d0a06a");
}
for (let x = 19; x <= 29; x += 3) set(x, 10, 17, "#777f36");
// Neck, broad jaw, bald head, and ears.
ellipsoid(24, 20, 31, 5, 5, 4, skinDark);
ellipsoid(24, 19, 37, 7, 6, 7, skinDark);
ellipsoid(24, 18, 39, 6, 5, 5, skin);
ellipsoid(24, 16, 34, 6, 5, 3, skin);
for (const x of [16, 32]) {
ellipsoid(x, 20, 37, 3, 3, 3, skinDark);
ellipsoid(x, 18, 38, 2, 2, 2, skinLight);
set(x, 16, 38, "#704a34");
}
// Little glowing eyes under sharply sloping angry brows.
box(19, 12, 38, 22, 13, 40, "#403626");
box(26, 12, 38, 29, 13, 40, "#403626");
box(20, 11, 39, 21, 11, 40, "#f5e657");
box(27, 11, 39, 28, 11, 40, "#f5e657");
set(21, 10, 40, "#fffaa0");
set(27, 10, 40, "#fffaa0");
line(19, 12, 42, 22, 11, 40, 1, "#574327");
line(26, 11, 40, 29, 12, 42, 1, "#574327");
ellipsoid(24, 12, 36, 3, 3, 2, skinDark);
ellipsoid(24, 10, 37, 2, 2, 1, skinLight);
box(21, 10, 32, 27, 11, 33, "#49392b");
box(22, 9, 31, 26, 10, 31, skinDark);
// One oversized upward-pointing tusk.
box(26, 8, 32, 27, 9, 35, "#e9dcaa");
box(26, 8, 36, 26, 9, 36, "#fff0c4");
line(27, 8, 33, 27, 8, 35, 0, "#c4b582");
// Free arm and its chunky dangling fist.
ellipsoid(12, 23, 28, 5, 5, 5, skinDark);
ellipsoid(11, 21, 27, 4, 4, 5, skin);
line(11, 21, 26, 10, 18, 17, 3, skinDark);
ellipsoid(10, 17, 17, 4, 4, 4, skin);
ellipsoid(10, 15, 15, 4, 4, 3, skinDark);
for (let x = 8; x <= 12; x += 2) set(x, 11, 15, skinLight);
// Each leg swings independently from its hip.
for (const [name, x, speed] of [["leftLeg", 18, 2], ["rightLeg", 30, -2]]) {
part(name, [x, 24, 12]);
ellipsoid(x, 24, 10, 4, 4, 6, skinDark);
ellipsoid(x, 22, 9, 3, 4, 5, skin);
box(x - 4, 21, 2, x + 4, 27, 6, vestDark);
ellipsoid(x, 20, 3, 5, 6, 3, vest);
box(x - 5, 16, 0, x + 5, 26, 1, "#382720");
box(x - 4, 16, 2, x + 4, 18, 3, vestLight);
animate(name, { type: "swing", axis: "x", speed, amplitude: 0.3 });
}
part("body");
// Shoulder, long wooden log, and the arm wrapped around it all move together.
part("logArm", [35, 23, 30]);
ellipsoid(35, 23, 29, 5, 5, 5, skinDark);
ellipsoid(36, 21, 30, 4, 4, 5, skin);
line(36, 21, 29, 39, 17, 35, 3, skinDark);
ellipsoid(38, 18, 33, 3, 4, 4, skin);
// Dark bark silhouette, warmer core, and a visible front end-grain.
cylinder(39, 5, 37, 5, 37, barkDark, "y");
cylinder(39, 6, 37, 4, 35, bark, "y");
for (let y = 8; y <= 39; y += 2) {
if (y % 6 !== 0) {
line(35, y, 35, 35, Math.min(y + 2, 40), 35, 0, barkLight);
line(42, y, 39, 42, Math.min(y + 2, 40), 39, 0, barkDark);
}
}
for (let x = 35; x <= 43; x++)
for (let z = 33; z <= 41; z++) {
const d = Math.hypot(x - 39, z - 37);
if (d <= 3.5) set(x, 4, z, d > 2.5 ? barkLight : "#bd8b50");
if (d <= 1.5) set(x, 3, z, "#916039");
}
set(39, 3, 37, barkDark);
ellipsoid(39, 14, 36, 3, 3, 3, skinDark);
ellipsoid(39, 12, 37, 3, 2, 2, skin);
for (let x = 37; x <= 41; x += 2) set(x, 10, 37, skinLight);
animate("logArm", { type: "swing", axis: "x", speed: 2, amplitude: 0.25 });
part("body");import { draw } from "./assets/voxel";
import { ogro } from "./assets/ogro";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, ogro, 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 ogro
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["ogro"] })
# Queda en client/assets/ogro.ts
# https://fogon.page/object/ogro