@pose_flow/babylon 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +129 -105
- package/dist/AI_USAGE.md +386 -0
- package/dist/PUBLISHING.md +110 -0
- package/dist/babylon-inertialization.d.ts +29 -0
- package/dist/babylon-inertialization.js +88 -0
- package/dist/babylon.d.ts +27 -5
- package/dist/babylon.js +181 -26
- package/dist/core/controller.d.ts +26 -0
- package/dist/core/controller.js +78 -8
- package/dist/core/database.d.ts +8 -2
- package/dist/core/database.js +62 -24
- package/dist/core/features.d.ts +1 -1
- package/dist/core/features.js +9 -11
- package/dist/core/inertialization.d.ts +3 -0
- package/dist/core/inertialization.js +15 -0
- package/dist/core/profile.d.ts +34 -8
- package/dist/core/profile.js +49 -10
- package/dist/core/root-motion.d.ts +5 -3
- package/dist/core/root-motion.js +43 -7
- package/dist/core/scenario.d.ts +29 -0
- package/dist/core/scenario.js +57 -0
- package/dist/core/schema.d.ts +56 -0
- package/dist/core/schema.js +123 -0
- package/dist/core/search.d.ts +40 -2
- package/dist/core/search.js +147 -16
- package/dist/core/selection.d.ts +24 -0
- package/dist/core/selection.js +41 -0
- package/dist/core/types.d.ts +24 -4
- package/dist/core/types.js +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/dist/offline/src/babylon-inertialization.js +88 -0
- package/dist/offline/src/babylon.js +281 -0
- package/dist/offline/src/core/controller.js +162 -0
- package/dist/offline/src/core/database.js +97 -0
- package/dist/offline/src/core/features.js +41 -0
- package/dist/offline/src/core/inertialization.js +15 -0
- package/dist/offline/src/core/profile.js +103 -0
- package/dist/offline/src/core/root-motion.js +78 -0
- package/dist/offline/src/core/scenario.js +57 -0
- package/dist/offline/src/core/schema.js +123 -0
- package/dist/offline/src/core/search.js +181 -0
- package/dist/offline/src/core/selection.js +41 -0
- package/dist/offline/src/core/types.js +3 -0
- package/dist/offline/src/index.js +11 -0
- package/dist/offline/tools/bake.js +88 -0
- package/dist/offline/tools/cli.js +30 -0
- package/dist/offline/tools/glb.js +54 -0
- package/dist/offline/tools/prepare.js +165 -0
- package/dist/offline/tools/profile-assets.js +90 -0
- package/dist/offline/tools/rig.js +47 -0
- package/dist/offline/tools/validate-assets.js +43 -0
- package/package.json +48 -39
package/README.md
CHANGED
|
@@ -1,105 +1,129 @@
|
|
|
1
|
-
# Motion Match · Babylon.js
|
|
2
|
-
|
|
3
|
-
O código original desta biblioteca é distribuído sob a [licença MIT](LICENSE), com aviso de copyright “2026 Motion Match contributors”. Dependências, modelos, texturas e animações de terceiros mantêm suas próprias licenças; este aviso não os relicencia. Consulte a [proveniência dos assets](docs/ASSETS.md).
|
|
4
|
-
|
|
5
|
-
Biblioteca TypeScript de Motion Matching clássico com Pose Search e laboratório 3D. Inspiração conceitual no Unreal Engine; implementação própria e inicial, sem paridade com o plugin da Epic.
|
|
6
|
-
|
|
7
|
-
O banco compara **pose visível + velocidade + trajetória desejada** e seleciona clipe/tempo. O controlador do jogo continua responsável por posição, colisões, orientação e combate.
|
|
8
|
-
|
|
9
|
-
**Prioridade atual: biblioteca reutilizável para diferentes personagens e jogos.** Modelo
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
##
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
1
|
+
# Motion Match · Babylon.js
|
|
2
|
+
|
|
3
|
+
O código original desta biblioteca é distribuído sob a [licença MIT](LICENSE), com aviso de copyright “2026 Motion Match contributors”. Dependências, modelos, texturas e animações de terceiros mantêm suas próprias licenças; este aviso não os relicencia. Consulte a [proveniência dos assets](docs/ASSETS.md).
|
|
4
|
+
|
|
5
|
+
Biblioteca TypeScript de Motion Matching clássico com Pose Search e laboratório 3D. Inspiração conceitual no Unreal Engine; implementação própria e inicial, sem paridade com o plugin da Epic.
|
|
6
|
+
|
|
7
|
+
O banco compara **pose visível + velocidade + trajetória desejada** e seleciona clipe/tempo. O controlador do jogo continua responsável por posição, colisões, orientação e combate.
|
|
8
|
+
|
|
9
|
+
**Prioridade atual: biblioteca reutilizável para diferentes personagens e jogos.** Modelo/rig/escala são definidos por perfis JSON v2, que referenciam schemas v1 e conjuntos de animações v1 separados, compartilhados pelo bake e laboratório. Veja [como adicionar um personagem](docs/PROFILES.md). Há também o exemplo Barbarian com escala e sample rate próprios.
|
|
10
|
+
|
|
11
|
+
O [roadmap revisado de Motion Matching + Pose Search](docs/ROADMAP.md) prioriza schemas configuráveis, preparação genérica de rigs/animações e conjuntos por contexto para chegar à versão estável. A Fase 1 está implementada: [schemas configuráveis e migração](docs/SCHEMAS.md). A Fase 2 está concluída no escopo documentado e inclui preparação GLB seletiva, recorte temporal, composição de loops medidos, hashes de assets, conferência de bind e CLI offline; retargeting automático continua futuro.
|
|
12
|
+
|
|
13
|
+
Animação de combate também faz parte do escopo obrigatório planejado da 1.0.0 (etapa 4.1): seleção de ataques/combos, esquivas, defesa e reações, com entradas controladas, sequência temporal protegida, eventos de apresentação e camadas. Ainda não implementado; regras de combate permanecem no jogo/servidor. Motion warping é uma expansão posterior.
|
|
14
|
+
|
|
15
|
+
Fase 3 em andamento: filtros por contexto, intervalos elegíveis, política de variantes de idle e roteamento de bancos. Exemplo local `?profile=/profiles/kaykit-context.json`, com dois subconjuntos e variantes no mesmo bake. Cobertura de olhar lateral/camadas permanece pendente; contrato em [PROFILES.md](docs/PROFILES.md) e [AI_USAGE.md](docs/AI_USAGE.md).
|
|
16
|
+
|
|
17
|
+
Fase 4 em andamento: painel de candidatos/custos por canal/rejeições, trajetórias, gravação/replay de queries, máscaras disjuntas e inertialization opcional. Exemplo `?profile=/profiles/kaykit-transitions.json&debug=1`. Confirmar os limites e o aceite pendente em [task-14](task/task-14/task.md); gesto de tronco é somente prévia de apresentação, sem contratos de combate.
|
|
18
|
+
|
|
19
|
+
O MMORPG será usado como consumidor de teste durante o desenvolvimento, em paralelo ao laboratório. Ajustes e problemas com prints, código, logs e erros são acompanhados em [task/summary.md](task/summary.md); veja o [modelo e instruções](task/README.md). A integração prática não precisa aguardar o término do roadmap.
|
|
20
|
+
|
|
21
|
+
## Guias distribuídos com o pacote
|
|
22
|
+
|
|
23
|
+
- [Tutorial para IA integrar a biblioteca](dist/AI_USAGE.md) — fonte em docs/AI_USAGE.md.
|
|
24
|
+
- [Comandos de publicação](dist/PUBLISHING.md) — fonte em docs/PUBLISHING.md.
|
|
25
|
+
|
|
26
|
+
O build copia os guias para dist/ e prepack executa o build antes de empacotar. Implementações e correções devem atualizar o tutorial na mesma alteração, conforme AGENTS.md.
|
|
27
|
+
|
|
28
|
+
## Executar
|
|
29
|
+
|
|
30
|
+
```powershell
|
|
31
|
+
npm ci
|
|
32
|
+
npm run dev
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Abrir http://127.0.0.1:5173. WASD movimenta, Shift corre, arraste orbita e scroll aproxima. O seletor oferece Knight, Paladin, Barbarian e Knight com schema de mãos (33 dimensões). “Teste de locomoção” mantém um movimento ativo para inspeção, sem segurar teclas; voltar a “Manual” devolve o controle ao WASD. “Manter orientação” permite testar deslocamento lateral e para trás no modo manual. O painel mostra candidato, custo, tempo, transições e velocidade. O valor “Atualização MM” inclui o controlador e só inclui busca quando o intervalo vence.
|
|
36
|
+
|
|
37
|
+
Os GLB e bancos já foram gerados neste workspace. Para regenerar:
|
|
38
|
+
|
|
39
|
+
```powershell
|
|
40
|
+
npm run bake
|
|
41
|
+
npm run bake -- --paladin
|
|
42
|
+
npm run validate:assets -- --profile public/profiles/barbarian.json
|
|
43
|
+
npm run bake -- --profile public/profiles/barbarian.json
|
|
44
|
+
npm run bake -- --profile public/profiles/kaykit-hands.json
|
|
45
|
+
npm run typecheck
|
|
46
|
+
npm test
|
|
47
|
+
npm run build
|
|
48
|
+
npm run benchmark
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
O build produz `dist/` (biblioteca ESM + declarações) e `demo-dist/` (laboratório). O pacote npm inclui a biblioteca e os guias de integração/publicação, sem personagens. A publicação inicial 0.1.0 foi informada pelo mantenedor; os novos guias estarão disponíveis após a próxima publicação.
|
|
52
|
+
|
|
53
|
+
## Implementado
|
|
54
|
+
|
|
55
|
+
- Núcleo sem engine: schemas configuráveis de características (preset original de 27 dimensões e exemplo de 33), normalização compartilhada, busca exata ponderada em `Float32Array`, filtros de gait e banco versionado JSON + float32 little endian.
|
|
56
|
+
- Continuidade: avanço natural, loops, fim de clipe, intervalo de busca, tempo mínimo entre trocas e margem de melhora. Defaults de tuning, não parâmetros oficiais do Unreal.
|
|
57
|
+
- Predição com aceleração, frenagem e velocidade angular; horizontes configuráveis (preset: 0,2 / 0,4 / 0,6 s).
|
|
58
|
+
- Adaptador Babylon.js 9.32.1: leitura dos pés visíveis e reprodução com crossfade, incluindo saltos entre dois tempos do mesmo clipe.
|
|
59
|
+
- Bake offline via o mesmo carregador/interpolador Babylon usado na demonstração.
|
|
60
|
+
- Quatro bancos separados: **Knight com mãos, 174 poses / 6 clipes / 33 dimensões**; **Knight, 174 poses / 6 clipes**; **Paladin, 610 poses / 9 clipes**; **Barbarian, 138 poses / 6 clipes**. Todos têm idle, walk, run, backward, left, right; o Paladin inclui stop, turn-left e turn-right sem loop.
|
|
61
|
+
- Trajetória medida dos hips para os três novos clipes: posição, yaw contínuo, velocidade, interpolação e término sem repetir o início. Os dados extraídos alimentam apenas o bake; deslocamento e heading em runtime continuam definidos pelo controlador.
|
|
62
|
+
- Pipeline Blender 5.2 para inspecionar e converter os FBX locais do Paladin.
|
|
63
|
+
|
|
64
|
+
Banco/perfil agora são v2. decodeDatabase rejeita banco v1; usar migração explícita ou novo bake conforme [SCHEMAS.md](docs/SCHEMAS.md). API local ainda sem publicação; conferir os tipos e o guia da versão instalada.
|
|
65
|
+
|
|
66
|
+
## Features e coordenadas
|
|
67
|
+
|
|
68
|
+
A tabela abaixo descreve somente o preset original `LOCOMOTION_SCHEMA`. Para outros schemas, usar os offsets de `compileSchema`.
|
|
69
|
+
|
|
70
|
+
| Índices | Característica |
|
|
71
|
+
| --- | --- |
|
|
72
|
+
| 0–5 | Posição local dos dois pés, XYZ |
|
|
73
|
+
| 6–11 | Velocidade dos pés no mundo, expressa nos eixos locais, XYZ |
|
|
74
|
+
| 12–14 | Velocidade do controlador nos eixos locais, XYZ |
|
|
75
|
+
| 15–20 | Posições futuras locais, XZ, em três horizontes |
|
|
76
|
+
| 21–26 | Direções futuras locais, XZ, em três horizontes |
|
|
77
|
+
|
|
78
|
+
Metros, segundos, Y acima e Z frente. A demo e o bake usam `scene.useRightHandedSystem = true`. Nesse referencial, o lado anatômico esquerdo dos modelos olhando +Z aponta para +X; yaw positivo gira +Z em direção a +X. A direita da câmera é calculada por sua projeção, não por assumir +X. Query e banco precisam usar exatamente a mesma convenção e escala. Não mudar a convenção do MMORPG para importar a lib; adaptar seu referencial ou gerar banco compatível.
|
|
79
|
+
|
|
80
|
+
Peso inicial por dimensão: pose/velocidade 1, trajetória/direção 3. Dimensões com desvio abaixo de 0,0001 usam escala 1, evitando amplificar canais constantes em bancos sem giros. Filtros são opcionais; a demonstração pesquisa todos os clipes.
|
|
81
|
+
|
|
82
|
+
**Os conjuntos são reproduzidos in-place.** Nos seis loops básicos, velocidades em `tools/bake.ts` são parâmetros de autoria: frente 1,8/4,5 m/s; costas −1,5 m/s; strafe KayKit ±3,2 m/s; strafe Paladin ±1,8 m/s. São valores iniciais, não medidas. Esquerda usa +X e direita −X. O bake KayKit remove as mesmas trilhas de deslocamento/heading variável que o player. Orientação constante é parte da pose; o conjunto usa rootOrientation com yaw ±90° para alinhar os strafes originalmente diagonais (±60°) ao deslocamento lateral. O laboratório testa esses clipes na velocidade nominal declarada de 3,2 m/s.
|
|
83
|
+
|
|
84
|
+
Para **stop e giros do Paladin**, Blender registra posição planar e yaw dos hips antes de remover esses movimentos da animação. Os arquivos `.motion.json` são amostrados em relação ao heading atual; futuros além do fim ficam no último estado. A velocidade dos pés inclui a contribuição da rotação do referencial. O movimento vertical do esqueleto é preservado. A orientação é um proxy extraído da pelvis e inclui oscilação natural; não equivale a root motion limpo de produção. Foot sliding ainda pode acontecer.
|
|
85
|
+
|
|
86
|
+
O laboratório tem ciclos de parada e giros no seletor do Paladin. Filtros por estado disponibilizam parada durante frenagem e giro durante mudança de heading com baixa velocidade. A busca decide o clipe/tempo dentro dos candidatos permitidos. Clips concluídos ficam inelegíveis por 0,6 s (configurável em `reselectDelay`). `Query.excludedClips` permite outras exclusões explícitas. O painel exibe a origem da trajetória e as três últimas trocas.
|
|
87
|
+
|
|
88
|
+
## API
|
|
89
|
+
|
|
90
|
+
```ts
|
|
91
|
+
import { decodeDatabase, MotionMatcher, SchemaQueryBuilder, predictTrajectory } from '@pose_flow/babylon';
|
|
92
|
+
import { BabylonMotionPlayer, BabylonSchemaPoseReader } from '@pose_flow/babylon/babylon';
|
|
93
|
+
|
|
94
|
+
// manifest e bytes são carregados uma vez; sem bake durante o jogo.
|
|
95
|
+
const builder = new SchemaQueryBuilder(schema);
|
|
96
|
+
const database = decodeDatabase(manifest, bytes, builder.layout.schema);
|
|
97
|
+
const matcher = new MotionMatcher(database);
|
|
98
|
+
// sources: Map<clip.id, AnimationGroup>; nodes: Map<nome original do osso, TransformNode>.
|
|
99
|
+
// semanticNodes: Map<papel do schema, TransformNode>; schema carregado/validado offline.
|
|
100
|
+
const player = new BabylonMotionPlayer(scene, manifest.clips, sources, nodes);
|
|
101
|
+
const reader = new BabylonSchemaPoseReader(controllerRoot, semanticNodes, builder.layout.schema);
|
|
102
|
+
|
|
103
|
+
// A cada frame, usando a pose medida após a renderização anterior:
|
|
104
|
+
const future = predictTrajectory(trajectoryInput, builder.layout.horizons);
|
|
105
|
+
const query = builder.build(lastVisiblePose, future);
|
|
106
|
+
const playback = matcher.update(dt, query);
|
|
107
|
+
player.update(playback, dt); // antes de scene.render()
|
|
108
|
+
scene.render();
|
|
109
|
+
lastVisiblePose = reader.read(dt); // depois da avaliação de animações
|
|
110
|
+
|
|
111
|
+
// Em teleporte/reconciliação descontínua: reader.reset(); matcher.reset().
|
|
112
|
+
// Na remoção do personagem: player.dispose().
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Instalar localmente no jogo, quando integrar: `npm install D:/motion_match`. Copiar os assets/banco necessários para a pasta pública do jogo é uma etapa separada. Ver contrato e restrições em [docs/INTEGRATION.md](docs/INTEGRATION.md).
|
|
116
|
+
|
|
117
|
+
## Limites atuais
|
|
118
|
+
|
|
119
|
+
Ainda não há IK, foot locking, contato dos pés, motion warping, root-motion-driven movement, worker, KD-tree ou PCA. Inertialization é opt-in e não garante melhor qualidade ou pés travados. Starts e giros em movimento ainda não foram preparados. Os três clipes medidos do perfil Paladin legado são sem loop; há composição de ciclos de trajetórias medidas no núcleo/bake, com caminhada medida do Paladin preparada e conferida no laboratório. A busca linear é apropriada para medir esta base pequena; não há garantia de orçamento em bancos grandes ou com muitos jogadores.
|
|
120
|
+
|
|
121
|
+
Schemas JSON configuráveis não incluem editor visual nem histórico temporal de ossos. Não há retargeting automático entre esqueletos diferentes. KayKit e Mixamo possuem bancos e mapas de ossos independentes. Crossfade de clips com trilhas ausentes exige preparação de cobertura dos ossos.
|
|
122
|
+
|
|
123
|
+
O laboratório tem um bundle de demonstração grande pelo carregamento amplo de Babylon; o build avisa sobre isso. O núcleo da lib não depende de Babylon, e sua entrada pública separada permite usá-lo sem importar o adaptador.
|
|
124
|
+
|
|
125
|
+
## Referências e proveniência
|
|
126
|
+
|
|
127
|
+
- [Epic: Motion Matching](https://dev.epicgames.com/documentation/en-us/unreal-engine/motion-matching-in-unreal-engine): banco, pose, trajetória e busca.
|
|
128
|
+
- [Babylon: Advanced Animations](https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations): grupos de animação e pesos. A implementação foi validada contra o código instalado da versão 9.32.1.
|
|
129
|
+
- [Assets locais](docs/ASSETS.md), [evidências e pendências](docs/VALIDATION.md), [referência fornecida pelo usuário](MOTION_MATCHING_POSE_SEARCH_WEB_BASE_REFERENCIAS.md).
|