domingo, 12 de julho de 2026devblog

Rostos de verdade, e o bug do pescoço de girafa

Um corpo compartilhado para a animação e uma cabeça MetaHuman única por jogador, definida pelo ID dele no banco de dados. Mesmo jogador, mesmo rosto, em qualquer máquina, para sempre. Aí os pescoços esticaram.

Dia 27MESMO JOGADORMESMO ROSTO

Meus jogadores agora têm rostos de verdade.

A arquitetura: um esqueleto de corpo para todos os jogadores. É ali que vivem o motion matching, as montages e todas as animações com retarget, e eu nunca mexo nele. A cabeça é uma malha MetaHuman separada que simplesmente veste a pose do corpo, e qual cabeça um jogador recebe é definido pelo ID dele no banco de dados. Mesmo jogador, mesmo rosto, em qualquer máquina, para sempre.

O bug da girafa

Os pescoços esticavam feito girafa quando eles corriam. Eu estava escondendo o osso da cabeça do corpo para ele não atravessar o da MetaHuman. Acontece que esconder um osso colapsa a transformação dele, e a malha da cabeça copia exatamente essas transformações para se posicionar. Eu estava alimentando o rosto com um osso de cabeça corrompido. Funcionava parado e explodia em movimento.

As duas funcionalidades literalmente não podem coexistir e não existe correção por código. A resposta foi a chata, que eu tinha escrito no meu próprio documento de design no primeiro dia e depois passei horas evitando: tirar a cabeça da malha do corpo. Apagar os polígonos da cabeça no Blender e manter o osso. Que é exatamente o que os jogos de futebol de verdade fazem. Zero lógica em tempo de execução agora. Classe de problema extinta.

Lição: quando a solução limpa é "trabalho de conteúdo" e a gambiarra é "código", eu corro para o código. Esse instinto me custou uma noite.

E os rostos não são só cosméticos. Cada jogador é uma linha num banco de dados: nome, idade, contrato, potencial. Então, quando um garoto de dezessete anos da sua base estoura no time principal, ele não é o "Player_0412". Ele tem um rosto que você reconhece.

Entregue: cabeças MetaHuman sobre um corpo de animação compartilhado

Este post foi traduzido do inglês com auxílio de IA. Ler o original