13 minuto(s) de leitura

1. O que é Blend Space?

Figura: Blend Space
Figura: Editor de animações.

O objetivo do Blend Space é reduzir a necessidade de criar nós individuais codificados para mesclar animações com um editor que realiza a mesclagem com base em propriedades ou condições específicas. Permitindo que o animador ou programador especifique as entradas, as animações e como as entradas são usadas para mesclar entre as animações, virtualmente qualquer tipo de mesclagem pode ser executado usando o Blend Space.

Figura: Blend Space 1D.
Figura: Para carregar o editor de animação na horizontal usamos o menu de contexto Animation > Blend Space 1D e em seguida selecionamos o esqueleto base das animações.

Informação: Nos próximos passos vamos criar várias sequencias de animações para o personagem BP_Human.

2. Blend Space 1D

Os Blend Spaces também podem ser criados em um formato unidimensional, conhecido como Blend Space 1D. Eles podem se misturar entre qualquer número de poses ou animações, mas o fazem com base em um único valor de entrada. Um exemplo de caso de uso para umBlend Space 1D seria quando você tem um personagem que se orienta automaticamente na direção em que está se movendo. Se o personagem não pode se desviar ou se mover em várias direções, um Blend Space 1D pode ser usado para se misturar de um Idle a um Walk e, finalmente, a Run com base em um único valor de Speed (como mostrado no exemplo abaixo).

Figura: Editor Blend Space 1D.
Figura: Utilizamos este elemento quando temos somente um parâmetro para controle da mudança de animações, neste caso o eixo horizontal com o parâmetro Speed.

3. Implementando os personagens

A seguir os parâmetros para o personagem Human:

Nome do arquivo: BS_Human1D;

Sequencia de animação: Arraste as animações para o sequenciador conforme o parâmetro Speed;

Horizantal Axis: Speed;

Maximum Axis Value: 600 (Velocidade máxima de corrida do personagem);

Interpolation Time: 0.25.

Altere esse valor gradativamente para melhorar a mudança de estados.

Para acompanhar o movimentação pressione Shift + LMB e arrastre o mouse.

Nota: Alteramos o nome do parâmetro para Speed com a finalidade de facilitar a identificação dentro da lógica de programação Blueprint que usaremos posteriormente.

Parâmetros para o personagem Mutant.

Nome do arquivo: BS_Mutant

Horizontal Axis

  • Name : Speed

  • Maximum axis value : 220

  • Interpolation time : 0.5

Para criar a movimentação no eixo horizontal vamos arrastar os elementos apresentados em Asset Browser para a linha do tempo.

  • Mutant_Idle em tempo 0;

  • Mutant_Walking em tempo 110;

  • Mutant_Run em tempo 220;

3.1. Vídeo Animation Blend Space 1D

4. Blend Space

Este elemento é utilizado quanto existem dois parâmetros para controle das animações por exemplo: Direction/Direção e Speed/Velocidade.

Figura: Editor Blend Space.
Figura: Menu de contexto Animation > Blend Space.

Salve o objeto com o nome do arquivo BS_Human e em Sequencia de animação arraste as animações para o sequenciador conforme o parâmetro Speed e Direction;

Horizontal Axis: Direction

  • Minimum Axis Value: -180;

  • Maximum Axis Value: 180 (A direção do personagem varia entre esses valores);

Vertical Axis: Speed

  • Minimum Axis Value: 0;

  • Maximum Axis Value: 600 (Velocidade do personagem);

Informação: Alteramos os nomes dos parâmetros para Speed e Direction com a finalidade de facilitar a identificação dentro da lógica de programação Blueprint que usaremos posteriormente.

5. O que é Animation Blueprint?

Figura: Animation Blueprint Editor.
Figura: Animação e Blueprint.

É um Blueprint especializado que controla a animação de uma malha esquelética. Os gráficos são editados dentro do Animation Blueprint Editor, onde você pode realizar a combinação da animação, controlar diretamente os ossos de um esqueleto ou configurar a lógica que definirá a pose final da animação para uma malha esquelética a ser usada por quadro.

Informação: Vamos implementar a lógica de movimentação utilizando o elemento Animation Blueprint para os personagens Human e Mutant.

Figura: Menu contexto Animation > Animation Blueprint.
Figura: Para criar o objeto ABP_Human utilizamos o menu de contexto.
Figura: Editor Animmation Blueprint MyBlueprint.
Figura: A aba MyBlueprint apresenta a organização do editor.

O Editor é separado em AnimGraph e EventGraph, onde o primeiro implementa a lógica de nós de sequencias de animação e o segundo a lógica de programação Blueprint.

6. Estados de maquina ou State Machine

Uma máquina de estados representa uma sequencie lógica de estados associados a uma animação.

O nó Output Pose é o estado ou pose final da animação. A seguir vamos criar vários nós e a sua lógica.

Figura: Animation graphs Output Pose.
Figura: No editor Animation Graphs crie o estado Base com Add new state;
Figura: Idle/Walk/Run.
Figura: Dentro do nó criado adicionaremos um novo estado com Add State com o nome Idle/Walk/Run.

7. Blend Space e State Machine

Para exemplificar vamos apresentar os dois métodos de Blend Space com o personagem Humano mas antes vamos adicionar a lógica para implementar as variáveis Speed e Direction que servirão como parâmetros para as animações.

Figura: Animation Blueprint -Speeed e Direction.
Figura: No gráfico de eventos ou EventGraph vamos adicionar o seguinte código..
Figura: Blend Space 1D dentro do State.
Figura: Criado anteriormente, BS_Human1D recebe como parâmetro Speed dentro do nó Idle/Walk/Run.
Figura: Blend Space.
Figura: Nó Idle/Walk/Run adicionamos BS_Human que recebe como parâmetro Speed e Direction pois trabalha com duas coordenadas.

Para os passos posteriores vamos utilizar o BS_Human (Blend Space).

7.1. Exemplo de um personagem saltando

Para simular o salto do personagem vamos adicionar os seguintes estados e em seguida fazer as suas conexões.

Figura: Sequencia de estados do personagem.
Figura: Iniciando em Idle/Walk/Run e logo em seguida os estados para simulação do salto.

Nota: A animação de salto pode ser dividida em Início de Salto (Jump_Start), Salto no Ar (Jump_Loop) e Finalização do Salto (Jump_End), pois o personagem pode se manter na aminação de Salto no Ar dependendo da altura.

Figura: State Jump Start
Figura: Em Jump_Start adicionamos a animação S_Human_Jump_Start iniciando a animação de salto.

Repetimos a operação para os outros estados adicionando as animações :

  • S_Human_Jump_Loop;

  • S_Human_Jump_End;

Na condição de controle de fluxo entre Idle/Walk/Run e Jump_Start vamos utilizar a variável InAir e testar se o valor é True.

Figura: Animação de personagem permanecendo no ar.
Figura: State Jump Start InAir.

Na condição de controle de fluxo entre Jump_End e Idle/Walk/Run vamos utilizar a variável InAir e testar se o valor não é True.

Figura: Início da animação.
Figura: Figura: Início da animação.

Na condição de controle de fluxo entre Jump_Start e Jump_Loop vamos utilizar a função Current Time (Ratio) (S_Jump_Start). Esta função retorna a proporção de tempo atual da sequência e se o valor for menor 0.1 (10%) de tempo para acabar deve ser feito a transição para outro nó.

Figura: Animação e Current Time.
Figura: State Condition Current Time (Ratio).

Na condição de controle de fluxo entre Jump_End e Idle/Walk/Run vamos utilizar a função Current Time (Ratio) (S_Jump_End) com a mesma lógica do nó descrito anteriormente.

Figura: Animação de final do salto.
Figura: State Condition Current Time (Ratio) Jump End.

Devemos considerar que o salto depende se o personagem esta em queda e se a função Jump foi acionado na lógica da classe do personagem, neste casso BP_Human.

Figura: Exemplo da Classe BP e a Função Jump.
Figura: InputAction Jump associado aos nós Jump e Stop Jumping.

7.2. Implementado Animation Blueprint utilizando o Mutante

Usamos o menu de contexto Animation > Animation Blueprint para criar ABP_Mutant.

Agora vamos copiar todos os nos do Event Graph de ThirdPerson_AnimBP para o componente criado, logo em seguida arrastre o elemento BS_Mutant para AnimGraph.

Figura: Animação do mutante.
Figura: AnimGraph BS_Mutant.

7.3. Vídeo Animation Blueprint do Mutante

8. Implementando a Corrida

Em este passo iremos implementar a corrida do personagem. Vamos configura o evento Left Shift para alterar a propriedade Max Walk Speed do componente CharacterMomement com os valores 220 para velocidade máxima e 110 para caminhada.

Figura: Implementando a corrida do mutante.
Figura: Blueprint running.

8.1. Vídeo Implementando a corrida do mutante

9. Animation Montage

Uma Animation Montage ou montagem de animação (ou montagem, para abreviar) fornece uma maneira de controlar um ativo de animação diretamente por meio do código Blueprint ou C ++. Com uma montagem de animação, você pode combinar várias sequências de animação diferentes em um único ativo que você pode dividir em seções para reprodução individualmente ou em combinação. Você também pode disparar eventos dentro de uma montagem que pode executar uma variedade de tarefas locais ou replicadas, como tocar sinais de som ou efeitos de partículas, alterar valores do jogador como contagem de munição ou até mesmo replicar o movimento raiz em jogos em rede (desde que o movimento raiz esteja ativado na animação).

Em este passo utilizaremos o Animation Montage para montar as animações de ataque esquerda e direita.

Figura: Animation Montage para o ataque.
Figura: Menu de contexto Animation > Animation Montage.

Vamos baixar e instalar os arquivos Mutant_Punch.fbx e Mutant_Swipping do site https://mixano.com para animar ataque direita e ataque esquerda.

Mixano

No editor de animação arrastre as animações para a linha de tempo. Observe que cada animação ocupa uma raia ou slot dentro de uma seção;

Adicione um novo slot de nome Attack e salve;

Figura: Animation Montage para o ataque 2.
Figura: Selecione o novo slot em Montage > DefaultGroup.Attack e salve toda animação.

9.1. Vídeo montando Animação de ataque

10. AnimGraph

AnimGraph utiliza o conceito de máquinas de estado que fornecem uma maneira gráfica de quebrar a animação de uma malha esquelética em uma série de estados. Esses estados são então governados por Regras de transição que controlam como combinar de um estado para outro.

O processo de design para animação Skeletal Mesh se torna mais simples, pois você pode criar um gráfico que controla facilmente como seus personagens podem fluir entre os tipos de animação sem ter que criar uma rede Blueprint complexa.

Informação: Em este passo utilizaremos a lógica de programação com AnimGraph para combinar e programar a lógica de mudanças de estado ou poses.

A seguir vamos criar os nós dentro do gráfico de estados para simular a animação básica.

Vamos adicionar um novo estado Add New State Machine com nome BasicLocomotion, este estado dever conter a animação criadas anteriormente com o Blend space 1D, BS_Mutant.

Figura: AnimGraph BasicLocomotion.
Figura: Conectamos o nó em Output Pose substituindo os estados anteriores se existirem;.
Figura: AnimGraph Idle/Walk/Run - Animação para andar, correr e parado.
Figura: Arrastamos e colamos BS_Mutant para a AnimGraph e renomeamos o nó para Idle/Walk/Run pois ele contem essas animações.

Em este estado passamos como parâmetro a variável Speed para animação BS_Mutant;

Figura: Animação para corrida, AnimGraph Speed.
Figura: Conectando a variável Speed em BS_Mutant.

11. Salvando estados e poses

Neste passo vamos implementar a animação de ataque com soco de direita e esquerda, salvando poses e passar de um estado para outro.

New Save cached Pose... - Salva o estado acionando o menu de contexto dentro do AnimGraph;

Use cached pose BasicLocomotion - Acessa um estado salvo anteriormente.

Figura: Animação de ataque com AnimaGraph Attack.
Figura: Podemos usar vários nós salvos de estados anteriores.

Slot DefaultGroup - Associamos a montagem de animação AM_Mutant_Attack na qual definimos a sequencia de ataque usando o menu de context;

Selecionando o Slot criado atualizamos Slot Name para DefaultGroup.Attack para acessar a sequencia de animação.

Agora vamos implementar a lógica para chamar as animações quando forem pressionados os botões do mouse direito e esquerdo.

No objeto BP_Mutant adicione os eventos de chamada de função e associe a função Play Anim Montage.

Figura: Blueprint para chamar a animação de ataque.
Figura: Ao acionar os botões do mouse é executada a animação.

11.1. Vídeo montando o ataque

12. Layered Blend per bone

Em este passo iremos continuar com a programação AnimGraph para fazer o personagem correr e atacar ao mesmo tempo, para isso vamos misturar os ossos das animações utilizando Layered Blend per Bone.

Podemos misturar várias animações no nó de estado e utilizar um osso (bone) como referência, no exemplo abaixo misturamos a animação básica LocoCachecom AttackingCache adicionando o osso Spine.

Figura: Unreal Engine - Animação - Layered Blend per bone.
Figura: Usando o nó para misturar duas poses.

13. Layered Blend by bool

Neste passo vamos misturar as animações condicionando a uma variável para que possamos definir o estado do personagem, correndo ou parado.

Figura: Unreal Engine - Animação - Layered Blend by bool.
Figura: Podemos condicionar a mistura de animações utilizando valores condicionais boolean.

No Event Graph de ABP_Mutant adicionamos a lógica para verificar se o personagem esta me movimentando testando a variável Speed.

Figura:Animação - Layered Blend by bool.
Figura: Definindo uma variável de controle Moving.

13.1. Vídeo do personagem correndo e atacando

14. Aim Offset

Um Aim Offset é um recurso que armazena uma série de poses que podem ser combinadas para ajudar um personagem a apontar uma arma. Durante a animação, o resultado do Aim Offset é misturado com outros movimentos, como correr, caminhar, pular, etc. para fazer com que o personagem pareça olhar suavemente em todas as direções.

14.1. Animation Starter Pack

Figura: Adicionando o pacote Animation Starter Pack.
Figura: A Epic Store oferece um pacote de animações para o Mannequin, facilitando a prototipação do personagem utilizando armas de tiro..

14.2. Preparando o projeto

Neste passo vamos criar várias animações com o personagem mirando utilizando a animação Aim_Space_hip como base. Estas animações servem de referência para realizar a interpolação.

1. Crie as pastas para organizar o projeto:

/Maps/Shooter
/Characters/Shooter
/Characters/Shooter/Animations

2. Mova o arquivo /AnimStarterPack/Aim_Space_hip para a pasta /Characters/Shooter/Animations

3. Duplique o arquivo várias vezes Aim_Space_hip e renomeio para os seguintes nomes:

  • Aim_Center;

  • Aim_Center_Up;

  • Aim_Center_Down;

Figura: Editor Aim Offset.
Figura: Editando a animação para criar novas animações.

14.3. Removendo frames

Vamos remover frames antes e depois da pose final que estamos querendo obter.

  1. Posicione no frame 0;

  2. Clicando com o botão direito do mouse na barra de tempo, escolha Remove from frame N1 to frame N2;

  3. Onde N1 é o Início e N2 é o final.

Arquivo Início Antes Depois
Aim_Center 0 1-87  
Aim_Center_Up 0 0-10 1-78
Aim_Center_Down 0 0-20 1-68
Aim_Left_Center 30 0 - 30 1 - 57
Aim_Left_Up 40 0 - 40 1 - 48
Aim_Left_Down 50 0 - 50 1 - 37
Aim_Right_Center 60 0 - 60 1 - 27
Aim_Right_Up 70 0 - 70 1 - 17
Aim_Right_Down 80 0 - 80 1 - 8

Edite a propriedade de vária animações ao mesmo tempo

Unreal Engine

AdditiveSettings:

  • Additive Anim Type : Mesh Space;

  • Base Pose Type : Idle_Rifle_Hip.

Agora vamos criar Aim Offset Menu de contexto Animation > Aim Offset ou Escolha o esqueleto do Mannequin e utilizando BMP escolha Create > Aim Offset;

Figura: Editor Aim Offset.
Figura: Altere os parâmetros em Asset Details para os seguintes valores:

Coordenadas horizontais - Horizontal Axis:

  • Name : Yaw

  • Minimun Axis Value : -90

  • Maximun Axis Value : 90

Coordenadas Verticais - Vertical Axis:

  • Name : Pitch

  • Minimun Axis Value : -90

  • Maximun Axis Value : 90

Adicione as animações que foram preparadas anteriormente na janela Offset considerando a ordem dos eixos e movimentação.

Animação Posição
Aim_Center Centro
Aim_Left_Center Centro Esquerda

Continue adicionando as animações nas coordenadas.

15. Misturando animações

A seguir vamos apresentar o fluxo e a lógica do personagem Mannequim que utiliza dois tipos de estado, com arma e sem arma.

Cafegeek - Animation BP State Base e Weapon Figura: Lógica do Animation Blueprint, carregando e atualizando variáveis. [Link]

15.1. Variáveis do personagem

Figura: My Blueprint - Variáveis.
Figura: Valores para controle de velocidade e estados do personagem.

15.2. Inicialização de variáveis

Figura: Event Blueprint Initialize Animation.
Figura: Inicializa a variável Character Movement.

15.3. Atualizando a animação

Figura: Event Blueprint Update Animation.
Figura: Se o objeto BP_Mannequin estiver instanciado determina o seu fluxo de eventos.

15.3.1. Calculando velocidade e direção

Figura: Velocity e Direction.
Figura: Defina Velocity e GroundSpeed a partir da velocidade dos componentes de movimento. A velocidade do solo é calculada apenas a partir dos eixos X e Y da velocidade, portanto, mover para cima ou para baixo não a afeta.

15.3.2. Limitando a velocidade e queda

Figura: GetCurrentAcceleration e IsFalling.
Figura: Define ShouldMove como verdadeiro somente se a velocidade do solo estiver acima de um pequeno limite (para evitar que velocidades incrivelmente pequenas acionem animações) e se houver aceleração (entrada) aplicada no momento. Define IsFalling como verdadeiro determinado pela função IsFalling.

15.3.3. Atualizando as variáveis de controle de estados

Figura: Get BP_Mannequin.
Figura: Atualiza as variáveis que determinam os estados das animações.

15.3.4. Levantando a arma para mirar

Figura: AimPitch e AimYaw.
Figura: Atualiza as variáveis limitando o angulo de rotação em -90 e 90 graus.

15.4. State Machines

Figura: Base Pose.
Figura: Animação base do personagem.
Figura: Base - Event Graph.
Figura: Eventos da animação básica.

15.4.1. Weapon Base

Figura: Weapon Hip e Weapon Aim - Event Graph .
Figura: Eventos com animações do personagem segurando uma arma e mirando.
Figura: WeaponBase.
Figura: Evento AimOffset Player com seus parâmetros e Blend Poses by Bool para alternar entre uma pose ou outra.
Figura: WeaponEquip.
Figura: Utilizamos Layered Blend per Bone para mesclar as animações a partir de um determinado osso.
Figura: Details > Layered blend per bone.
Figura: Configuramos o objeto para utilizar o osso Spine_01 pois no caso do mannequim ele é o osso da cintura que queremos usar como referência para mistura de animações.

15.5. Pose final

Figura: Output Pose.
Figura: Podemos usar várias opções em sequência para construir o estado final da animação.