6 · Personajes y rostros
El cuerpo
makeCharacter(spec) en recipe/engine/character.mjs construye un rig: radio de cabeza 0.42, cuerpo de 0.8 de alto, piernas de 0.52, brazos de 0.30 + 0.28. Las proporciones son el estilo: una gran cabeza esférica, un cuerpo de frijol dividido en un color superior e inferior, extremidades delgadas de palo en color Antracita, manos de mitón en el color de la piel, zapatos redondeados en color Cognac.
const host = makeCharacter({
name: 'host', skin: SKIN.tan,
top: BRAND.blueCoral, bottom: BRAND.anthracite, split: 0.32, width: 1.0,
hair: 'curly', hairColor: '#2a1d18',
hat: null, glasses: true, beard: false,
face: { browColor: BRAND.anthracite, browThick: 3.4, mustache: null },
extras: torso => { /* agregar una corbata de chorrera, botones, una insignia, un cinturón de herramientas… */ },
});
host.root.position.set(x, 0, z); place.scene.add(host.root);
| Opción | Valores |
|---|---|
skin | SKIN.light / fair / medium / tan / brown / deep, o cualquier color hex. Mezcla entre el reparto. |
top, bottom, split, width | los dos colores del frijol, dónde se encuentran (0–1 de la altura), y un factor de ancho (1.06 para una complexión más robusta) |
hair | short (o cap), bob, bun, ponytail, curly, spiky, bald, y dos pelucas de época: newton (rizos largos) y einstein (cabello blanco salvaje con brillo propio) |
hat / hatColor | cap, tophat (con hatBand), helmet (casco redondo), hardhat, beret, crown |
glasses | true o un color de montura: monturas redondas sobre los ojos pintados |
beard | true (color del cabello) o un color |
face | { browColor, browThick, mustache }: color y grosor de las cejas, un color opcional de bigote pintado |
extras(torso) | agregar partes de vestuario con part(geometry, color): corbatas de chorrera, cuellos, botones, insignias, herramientas |
Diseñando un personaje para un nuevo tema: primero elige una silueta (la forma del cabello o el sombrero es la señal más fuerte en tamaño de teléfono), luego un color de marca para la parte superior, y luego un tono de piel. Las personas históricas se dibujan como nuestros propios caricaturas: el cabello y la ropa de época son suficientes (la peluca rizada de Newton y su abrigo Rouge Noir; el cabello blanco salvaje de Einstein, su bigote y su suéter Blue Coral). Nunca copies un personaje con derechos de autor.
Objetos con rostros (manzanas, planetas, moléculas, máquinas): dales faceDecal(radius, { skin: <color del cuerpo> }) desde faces.mjs, establece el color de los párpados al color del cuerpo, y agrega el grupo del objeto a la lista faceCamera del lugar para que gire hacia la cámara.
Rostros
Calcomanías planas pintadas en la parte frontal de la cabeza (faceDecal): cejas, ojos con pupilas e iluminaciones, una boca, sin nariz, todo de una misma familia de formas. Sin sincronía de labios; el rostro es el que actúa.
Expresiones (EXPRESSIONS en faces.mjs): neutral, content, sleepy, surprised, shocked, curious, thinking, eureka, delighted, smug, knowing, confused, worried (con una gota de sudor), proud (sonrojo), no, wheee, dizzy (ojos en espiral), lookDown. Para agregar una, copia una entrada y cambia las cejas [inner, outer] (grados), lid (0 abierto … 1 cerrado), look (desplazamiento de la pupila), escala de eye y pupil, y mouth (flat, smile, smirk, side, wavy, o, grin, shout).
Intercambios de rostros (la regla de la referencia, medida)
- Intercambia solo a través de un parpadeo: un fotograma medio cerrado, un fotograma cerrado, luego el nuevo rostro.
- El nuevo rostro aparece 2 fotogramas antes de la palabra acentuada (
W(i) - FACE). - Nunca hagas morphing entre expresiones.
- El personaje principal recibe un nuevo rostro aproximadamente cada 1.2 s; los objetos intercambian en su tiempo narrativo (la manzana pasa de
smugashockeden "wrong"). - Parpadeos naturales durante pausas largas: pasa una lista
blinksde tiempos.
rig.faceAt(t, [[0, 'curious'], [W(17) - FACE, 'smug']], [0.75, 6.2]); // intercambia, luego parpadeos naturales
objectFace.set('shocked'); // asignación instantánea para objetos
Manos y accesorios sostenidos
rig.handPos('L' | 'R' | 'both') devuelve la posición mundial de una mano después de la pose actual; coloca los accesorios sostenidos allí cada fotograma (el libro en las manos de Newton, la bola de boliche antes de que Einstein la suelte). rig.headPos() da el centro de la cabeza para el encuadre.
Verificaciones
- ¿En tamaño de teléfono, puedes distinguir cada personaje solo por su silueta?
- Los párpados coinciden con el color de la piel o del cuerpo (sin parpadeos transparentes).
- Los rostros miran a la cámara en cada toma donde actúan.