← BibliotecaPackmormon/melee-weapons
Armas blancas por código
Clonar
fogon pieces add melee-weaponsgit clone https://git.fogon.gg/mormon/melee-weapons.gitfogon new melee-weapons --from melee-weaponshttps://fogon.gg/piece/56/armas-blancas-por-codigoNada con eso.
Armas blancas por código
Un arsenal de armas blancas modeladas enteras por código (three.js): ningún archivo de modelo, ninguna imagen. Cada arma es una función que la arma en el momento, con sus materiales generados (acero rectificado, hierro martillado, latón, cuero, madera), los cantos gastados y los rincones oscurecidos. Son armas de juego: formas gruesas y siluetas que se leen de lejos, no réplicas de museo.

Son tipos genéricos y diseños propios: no copian ningún arma de película, libro, serie o juego.
En la demo: el arma elegida, sola, para girarla (arrastrando; la rueda o dos dedos acercan). Se elige en la página de la pieza, que es la grilla con la foto de cada arma: un clic abre la demo en esa, y la última opción es La armería, todas juntas. Arriba, cuatro vistas (entera, de perfil, empuñadura, punta) y los tres acabados; abajo, sus medidas, sus triángulos, la línea de código que la crea y la descarga del .glb tal como está en pantalla. Nada pasa por una sala: es solo la página.
Qué trae
Una carpeta, client/melee (fogon pieces add melee-weapons):
| Archivo | Qué hay |
|---|---|
index.ts | El catálogo. WEAPONS, WEAPON_LIST (cada arma con su nombre, tipo y si es de una o dos manos) y createWeapon(id, options). |
sword.ts … spear.ts | Una función por arma: createSword, createGreatsword, createFalchion, createScimitar, createDagger, createAxe, createHammer, createMace, createSpear. |
kit.ts | Con qué se modela: Model y sus cuatro formas (loft, lathe, sweep, plate), los chaflanes (bevel, bar) y el sombreado por vértice. |
parts.ts | Las piezas que comparten: blade (hoja con biseles, vaceo y lomo), wrap (puño encordado), band, haft, langet, y assemble, que convierte un Model en un arma. |
materials.ts | Los siete materiales y los tres acabados (FINISHES, createMaterials). |
studio.ts | La luz: un entorno para que el metal tenga qué reflejar, una luz principal con sombras y un relleno. |
glb.ts | toGlb(object): el arma como archivo .glb. |
| Arma | id | Largo | Manos | Triángulos |
|---|---|---|---|---|
| Espada de caballero | sword | 106 cm | 1 | 8.700 |
| Mandoble | greatsword | 152 cm | 2 | 15.100 |
| Alfanje | falchion | 81 cm | 1 | 6.700 |
| Cimitarra | scimitar | 94 cm | 1 | 6.700 |
| Daga | dagger | 44 cm | 1 | 1.800 |
| Hacha de batalla | axe | 80 cm | 2 | 10.000 |
| Martillo de guerra | hammer | 87 cm | 2 | 8.600 |
| Maza de aletas | mace | 66 cm | 1 | 8.800 |
| Lanza | spear | 220 cm | 2 | 13.600 |
Cómo se usa
import { createWeapon, studio } from "./melee";
studio(scene, renderer); // una vez: el metal sin nada que reflejar se ve negro
const axe = createWeapon("axe", { finish: "shadow" });
hand.add(axe.object); // un hueso de la mano, o la cámara
Todas vienen en la misma postura: la punta hacia −Z, el filo principal hacia abajo (−Y), los planos de la hoja hacia ±X y el origen donde la agarra la mano. Las medidas son metros.
Lo que devuelve createWeapon:
object: unTHREE.Groupcon una malla por material (steel,edge,iron,brass,leather,wood,gem).points: lugares del arma en su propio espacio:grip(la mano),guard,pommel,tip, y según el armahead(la cabeza del hacha, el martillo, la maza o la lanza) ygrip2(la segunda mano en las de dos manos).info:length,height,width(metros),triangles,vertices.setFinish("royal"): cambia el acabado sin volver a modelar.dispose().
Las opciones: finish ("soldier", "royal", "shadow"), materials (un juego hecho con createMaterials, para compartirlo entre muchas armas: así diez espadas usan los mismos siete materiales) y textureSize (el lado de las imágenes generadas; 512 por defecto, 256 alcanza en un celular).
Los acabados
finish | Cómo es |
|---|---|
soldier | Acero satinado, herrajes de hierro forjado, cuero marrón y fresno. |
royal | Acero bruñido, herrajes dorados, cuero azul y nogal oscuro. |
shadow | Acero pavonado casi negro con el filo vivo, hierro negro, cuero rojo oscuro y madera ebonizada. |
Un acabado es un color y una rugosidad por material: para uno propio alcanza con pasarle a createMaterials un objeto como los de FINISHES.
Como archivo .glb
Si preferís cargar un archivo en vez de construir el arma (otro motor, un programa de modelado), la demo sirve uno por arma, de 0,2 a 0,6 MB, cada una en el acabado con que se ve en la armería: sword.glb, greatsword.glb (real), falchion.glb (sombría), scimitar.glb (real), dagger.glb, axe.glb (sombría), hammer.glb, mace.glb y spear.glb. Para otro acabado, el botón «bajar .glb» de la demo baja el que está en pantalla (sin comprimir, unos 3 MB).
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
import { MeshoptDecoder } from "three/examples/jsm/libs/meshopt_decoder.module.js";
const loader = new GLTFLoader().setMeshoptDecoder(MeshoptDecoder); // sin esta línea no abren
const gltf = await loader.loadAsync("https://play.fogon.gg/melee-weapons/axe.glb");
hand.add(gltf.scene);
Vienen con la geometría comprimida (meshopt) y las imágenes en WebP: three.js las abre con esa línea; otros programas necesitan soportar esas dos extensiones, o usar el .glb sin comprimir que baja la demo.
Cómo están hechas
- Los cantos son de verdad. Cada esquina lleva un chaflán chico y las normales solo se promedian entre caras que están a menos de 60°: las caras grandes quedan planas y el chaflán agarra la luz como una línea.
- Cada vértice lleva un tinte. Al armar la malla, lo que sobresale se aclara (canto gastado) y lo que queda hundido se oscurece (mugre en el rincón). Por eso el desgaste sigue la forma y no depende de una imagen pintada a mano.
- Las imágenes son grises y se repiten. Dicen dónde el material es más claro, más áspero o está abollado; el color lo pone el acabado. Cuatro juegos de imágenes (acero, hierro, cuero, madera) sirven a todos los materiales y a todas las armas, y las coordenadas van en metros, así el grano tiene el mismo tamaño en todas partes.
- El filo es otro material. Los biseles de las hojas y el afilado del hacha van en
edge, el mismo acero pulido: es lo que hace que el filo brille aunque el resto de la hoja esté oscuro.
Agregar un arma
Un archivo al lado de los otros y una línea en WEAPON_LIST. Se modela parada: +Y hacia la punta, +X hacia el filo principal, ±Z los planos, el origen en la mano (assemble la gira a la postura del pack).
import { Model, bar, steps } from "./kit";
import { assemble, band, blade, wrap, type WeaponOptions } from "./parts";
export function createShortSword(o: WeaponOptions = {}) {
const m = new Model();
blade(m, { from: 0.06, length: 0.5, left: (t) => -0.025 * (1 - t ** 3), right: (t) => 0.025 * (1 - t ** 3), thick: () => 0.007, bevel: () => 0.4 });
m.sweep([[-0.07, 0.055, 0], [0.07, 0.055, 0]], () => bar(0.018, 0.016, 0.0025), { mat: "iron", caps: "both" }); // la cruz
wrap(m, { from: -0.05, to: 0.045, rx: () => 0.014, rz: () => 0.011 }); // el puño
band(m, -0.062, -0.048, 0.02); // el pomo
m.points.grip = [0, 0, 0];
return assemble(m, "short-sword", o);
}
Las cuatro formas de Model: loft (una piel sobre anillos de puntos), lathe (algo torneado alrededor de +Y, o facetado con pocas caras), sweep (una sección llevada a lo largo de un camino: cruces, picos) y plate (una chapa forjada con su canto y su filo: la hoja de un hacha, una aleta). place y mirror mueven o espejan lo que se hace adentro.
Licencia
MIT. Hecho por código para Fogón.
Elegí un archivo.
| Versión | Cuándo | Peso | Commit |
|---|---|---|---|
| v2 en la demo | 15 de nov de 2026 | 5.0 MB | 1415917 |
| v1 | 15 de nov de 2026 | 4.9 MB | b6f3146 |
Todavía nadie publicó una versión hecha a partir de esta pieza.
Armá el pedido para tu agente
Elegí qué querés hacer, copiá el pedido y pegáselo a tu IA (Claude, ChatGPT, Codex…). Ella hace el resto.