|
Neste artigo vamos ver as técnicas mais comuns para geração de animações em modelos usados em jogos 3d. Para começar vamos primeiro definir o que é animação para o contexto desse artigo. Inicialmente, podemos dizer que tudo que se move em um jogo é algum tipo de animação. Sendo assim, se considerarmos um jogo de primeira pessoa temos os personagens, portas, elevadores, veículos, etc. Mas existem algumas diferenças entre esses objetos e a forma que o motor do jogo cuida de cada um deles.
A animação que vamos tratar aqui é aquela gerada pelos artistas em alguma ferramenta de edição 3d, como Blender ou 3D Studio Max. Nestas ferramentas o artista cria um modelo 3d (uma pessoa por exemplo) e cria animações para este, animações onde o modelo parece estar caminhando, correndo ou até mesmo uma animação para o modelo parado, onde o personagem costuma ter um leve movimento, apenas para demonstrar que esta “vivo”.
As outras “animações” que vemos em um jogo nem sempre são geradas por um artista. As portas, por exemplo, costumam apenas subir e descer uma distância equivalente a sua altura (no caso de portas do estilo Doom), já no caso de portas de folha, elas fazem uma rotação de 90 ou 180 graus, dependendo do caso, todos esses movimentos são facilmente implementados no motor 3d e não há necessidade do artista animar cada porta, ele precisa apenas posicionar a porta no editor de cenários e dizer como ela vai se comportar.
No caso de um elevador, novamente não é necessário que o artista anime o mesmo. O elevador pode ser feito de forma similar as portas, a diferença é que como o movimento deste é mais longo, o artista usando o editor de níveis do jogoprecisa colocar pontos para indicar ao elevador onde ele deve ir quando se movimenta, mas todo o movimento é gerado pelo motor 3d.
Técnicamente a “animação” feita por portas e elevadores é considerada como um movimento e não uma animação, então não é comum ver um desenvolvedor dizer que implementou a “animação” da porta, mas sim o movimento. Isso se aplica também a outras funcionalidades dos jogos como sistemas de partículas.
Outro efeito nos jogos que pode ser confundido com animação são os efeitos criados pelo motor de física, como caixas caindo, objetos quebrando, etc. Esses efeitos na sua maioria são feitos de maneira procedural, ou seja, são programados e quem toma conta destes é o motor de física do jogo. Alguns jogos mais antigos devido a falta de motores de física (ou hardware que desse conta desses) usavam animações para simular estes efeitos.
Voltando a falar sobre a animação de modelos 3d, podemos destacar um item importante: ela é a única que afeta a malha dos modelos 3d, enquanto as outra técnicas geralmente afetam apenas a posição ou orientação dos modelos (alguns motores de física também afetam a malha dos modelos, mas para simplificar ignoremos estes).
As animações de modelos 3d podem ser separadas em dois tipos principais: Animação por vértices e animação por ossos (bone animation). Vamos ver cada uma em detalhes a seguir, mas primeiramente vamos ver os conceito básicos de qualquer animação.
Funcionamento de uma Animação
Animação em jogos funciona pelo mesmo principio que temos em filmes ou desenhos animados, a tela é desenhada uma certa quantidade de vezes por segundo (geralmente em jogos o minimo aceitável é de 30 vezes por segundo) e cada novo desenho temos uma imagem um pouco diferente. Cada vez que a tela é desenhada temos um novo quadro (ou frame) e como nosso olho não consegue perceber que as imagens estão sendo trocadas a cada quadro nosso cérebro é enganado e encara aquelas mudanças como movimento.
No caso da animação de modelos 3d, a técnica é a mesma, o artista vai criar para cada animação diversos quadros, onde em cada quadro o modelo esta de uma forma e o jogo vai se encarregar de desenhar cada quadro no momento certo criando o efeito.
Perceba que cada modelo pode ter varias animações diferentes, no caso de um inimigo é comum termos:
- parado: animação de quando o inimigo esta parado, geralmente é apenas um leve balançar do corpo
- andando
- correndo
- morrendo
- atacando
Claro que outras animações podem existir e além destas podem existir varias versões de algum tipo (como, por exemplo, três animações de morte). Criadas as animações na ferramenta de arte, o artista vai exportar estas para um formato usado pelo jogo e isto pode ser feito usando-se um plugin especifico criado para o motor do jogo ou um formato genérico como Collada.
Velocidade da Animação
Vimos que para criar uma animação o artista precisa criar vários quadros, onde cada quadro representa o modelo em uma nova posição, esses quadros vão descrevendo todas as mudanças que o modelo sofre durante a passagem do tempo, mas como controlar esse tempo?
O artista cria os quadros utilizando intervalos regulares, ou seja, o tempo entre um quadro e outro é sempre o mesmo durante toda a animação (mas costuma ser diferente de uma animação para outra). O interessante é que a taxa de quadros usadas pela animação dificelmente vai coincidir com a taxa de quadros usada pelo jogo, dessa forma para controlar a animação o motor do jogo precisa executar ela com base no tempo, usando técnicas semelhantes as discutidas no artigo “Animação Baseada em tempo”.
O motor do jogo pode simplesmente ir trocando os quadros da animação conforme o tempo passa, mesmo o efeito final desta técnica não sendo dos melhores, consegue-se obter assim uma animação. Um jogo que utilizava essa técnica é o Quake 1, onde em alguns momentos era possível notar pequenos “trancos” nas animações. Esse tipo de técnica é quase idêntica a utilizada em jogos 2d, onde simplesmente as imagens vão sendo trocadas para realizar uma animação.
Mas como estamos lidando com gráficos 3d é possível melhorar esse efeito, como na maioria das vezes um quadro de animação não vai coincidir com um quadro do vídeo, podemos suavizar isso calculando quadros intermediários. Vamos supor que um determinado jogo esta rodando a 30 quadros por segundo e que todas as animações tenham sido feitas com 15 quadros por segundo. Dessa forma, a cada dois quadros que o jogo renderiza temos apenas um quadro de animação, visualmente a animação vai parecer mais lenta ou que esta rodando em câmera lenta. Para suavizar isso o motor do jogo pode gerar então quadros intermediários para minimizar o problema, isto pode ser feito com o uso de técnicas de interpolação.
Na figura ao lado temos um exemplo de interpolação para um ponto, a curva verde representa o movimento do ponto com o passar do tempo, já as linhas vermelhas representam os valores que o motor do jogo interpolou. Note que a interpolação (linear nesse caso) não acompanha com exatidão o movimento do ponto, mas como ela segue bem próxima o resultado final é muito melhor do que o resultado sem interpolação. Esse tipo de técnica não foi utilizada no Quake 1 devido as limitações de hardware da época, mas a sua continuação já fazia isso para todas as animações (incluindo movimento de portas e elevadores). Outra utilidade da interpolação é reduzir o consumo de memória, pois como o motor do jogo pode calcular quadros intermediários, o artista pode exportar apenas uma quantidade miníma de quadros de forma a encontrar um equilíbrio entre erro de interpolação e consumo de memória.
Animação por Vértices
A animação por vértices é a técnica mais simples de se implementar. Nesta técnica o artista ao animar o modelo cria diversas cópias do modelo original, sendo cada cópia um novo quadro da animação.
Esta técnica foi muito utilizada nos primeiros jogos 3d devido a sua simplicidade de implementação e baixo custo computacional, que em compensação acaba causando um alto consumo de memória, pois é preciso duplicar o modelo para cada quadro de animação.
Outro fato interessante desta técnica é que apesar dela ser baseada no movimento dos vértices para a animação, nada impede o artista de criar os modelos com outra técnicas de animação, por exemplo, usando um sistema de esqueletos, pois o exportador pode processar e calcular a nova malha para cada quadro e exportar apenas os triângulos do modelo 3d, eliminando completamente o esqueleto no arquivo final utilizado pelo jogo.
Animação por Ossos
A animação por ossos ou usando esqueletos tem sido a técnica usada em praticamente todo jogo 3d da atualidade, pois esta possui inúmeras vantagens sobre a animação por vértices, podendo-se destacar:
- Consome muito menos memória, pois não é preciso armazenar uma malha para cada quadro
- Permite o uso de interpolações mais precisas
- Pode ser usada como base para criação de efeitos como Ragdolls, Inverse Kinematics, etc.
A animação por ossos é feita criando-se um esqueleto virtual para o modelo 3d, sendo que este esqueleto apenas representa a estrutura do modelo e não é relacionado ao esqueleto da biologia além de que um modelo 3d tem um numero de ossos muito inferior do que o ser que este representa (no caso de um modelo que represente algo real, é claro).
Os ossos do modelo são conectados de forma hierárquica, por exemplo, em um modelo que representa um ser humano, o osso do pé vai ser conectado ao osso da canela, que é conectado ao osso da coxa, esse pode estar conectado ao osso do tronco do corpo. Podem existir mais ou menos ossos, de acordo com a necessidade das animações. O fato é que nesse caso, quando é movimentado o osso da coxa, este movimenta junto o osso da canela e do pé, pois estão todos conectados. Este efeito é o similar a aquele que podemos observar em um braço mecânico.
Cada osso precisa armazenar apenas a sua posição em relação ao osso pai, qual seu osso pai (que pode não existir) e sua rotação, (que pode ser uma matriz ou um quaternio), geralmente ossos possuem uma escala própria, mas nem todo motor 3d leva a escala em consideração.
Criada a hierarquia dos ossos, o artista passa então a associar cada vértice com um ou mais ossos, sendo que nas ferramentas de edição não costuma existir limite e um vértice pode ser afetado por quantos ossos o artista desejar, mas os motores 3d de jogos costumam limitar isso a quatro ossos no máximo e limitam os modelos a 256 ossos. Com esses limites, é possível utilizar um único valor de 32 bits por vértice para se armazenar o índice de cada osso que influencia o vértice, além do índice de cada osso é armazenado o quanto cada osso influencia um vértice, que é um valor de 0 a 1, onde 0 um osso não influência em nada e 1 indica que o osso tem total controle sobre o vértice, note que a soma das influências deve ser sempre 1. Por fim, para se armazenar uma animação por ossos é preciso:
- Um modelo 3d, sendo que cada vértice deve possui os índices dos ossos que o influenciam
- A hierarquia, que possui o esqueleto inicial com todos os seus ossos e a relação de pai e filho entre eles (uma árvore)
- Para cada quadro de animação, é necessário armazenar as transformações de cada osso
Exercitando a matemática básica, podemos calcular a diferença de tamanhos entre um modelo animado por vértices e outro por ossos, assumindo um modelo com 1000 vértices e 100 quadros de animações, este precisa de no mínimo: 1,14 Megabytes (considerando apenas as coordenadas x, y e z de cada vértice e 4 bytes por coordenada). Já um modelo por ossos, precisaria de no mínimo: 0,17 Megabytes (assumindo apenas coordenadas x, y e z, 3 pesos por vértice, sendo que o quarto peso pode ser calculado dos outros 3. Para cada osso uma matriz de 9 elementos float, coordenadas x, y e z e um inteiro com o índice do pai).
Para se renderizar um modelo que utiliza animação por ossos o motor 3d precisa primeiramente calcular qual o quadro vai ser usado, feito isso, este calcula a transformação de cada vértice por cada um dos ossos que o influência, levando em conta o peso da influência de cada um, feito isso para cada vértice tem-se um novo modelo 3d transformado e pronto para ser renderizado.
Caso interpolação esteja sendo utilizada, é calculada a interpolação no esquelelo e não no modelo 3d. Neste método, determina-se quais os dois quadros que vão ser considerados na interpolação e calcula-se um novo quadro (ou novo esqueleto) para um quadro interpolado, depois transforma-se os vértices por esse novo esqueleto. Note aqui que como o numero de ossos costuma ser bem baixo (algo em torno de 20 a 100 para um modelo bem complexo), não é precisa usar o calculo de interpolação (que geralmente é bem complexo) com cada um dos vértices.
Efeitos com Animação por Ossos
Além das vantagens quanto a desempenho e consumo de memória, a técnica de animação por ossos permite criar alguns efeitos que são complicados ou impossíveis com a animação por vértices, alguns exemplos:
- Pode-se criar um osso que conecte todos os vértices da cabeça de um modelo, dessa forma, se durante o jogo é necessário que o modelo vire a cabeça, não é preciso criar uma animação para isso, bastando apenas rotacionar o osso da cabeça para se obter o efeito.
- Pode-se usar um osso extra nas mãos de um personagem e usar este como transformação a ser aplicada em um objeto que o modelo 3d precise segurar, bastando transformar o objeto pela transformação do osso, note que o objeto acaba sendo animado automaticamente
- Um outro recurso é que modelos diferentes podem utilizar o mesmo esqueleto, assim, animando-se um modelo os demais já são animados automaticamente, esta técnica é especialmente útil quando um modelo possui diversos acessórios, como armaduras, escudos, etc.
Considerações Finais
Vimos neste artigo os métodos mais comuns de animação usados em jogos, futuramente iremos ver como cada uma destas técnicas podem ser implementadas para um melhor entendimento das mesmas.
Referências
The Quake II's MD2 file format
The Bitsquid Low Level animation system
Fontes
Modelo 3d: http://planethalflife.gamespy.com/
Visualizador: http://chumbalum.swissquake.ch/
-
31/03/2010 20:36:14 |187.90.207.xxx| Neto - Rox

Ótimo artigo, gostei muito. Finalmente entendi como funciona as animações 3D!
-
01/04/2010 10:19:05 | Bruno Crivelari Sanches

opa! que bom!
nos próximos artigos vou mostrar como implementar as duas técnicas.
Abraços
-
25/12/2010 23:45:31 |189.71.26.xxx| Allender - Exelente

Muito bom, estou iniciando e me serviu muito.
ainda estou iniciando e estou em dúvida sobre 3d ou programação, e
estou aprendendo a usar o 3d studio e programar em c++, você poderia me indicar a sua linguagem de programação e sua ferramenta de 3d.Obrigado!
-
26/12/2010 00:20:40 | Bruno Crivelari Sanches

Linguagem principal que trabalho é C++, mas a linguagem depende muito do que se pretende fazer.
Ferramenta 3d não tenho, uso as vezes o 3d studio para gerar alguma malha para testes ou o sketchup, mas meu foco mesmo é programação.
T+
-
25/09/2011 12:08:39 |200.192.240.xxx| Carlo - Dúvida

Eu tenho uma dúvida, como é carregado aqueles maps 3D eles são carregados de uma só vez ou parte por parte e mais ou menos como seria isso na teoria?
-
25/09/2011 13:25:33 | Bruno Crivelari Sanches

Não existe regra. Depende muito do jogo.
Tem jogo que carrega tudo de uma única vez, já tem jogos que carregam aos poucos.
Quake & cia carregam tudo de uma única vez.
Um jogo como God of War vai carregando aos poucos, existem pontos no mapa com gatilhos onde o motor descarrega um cenário e carrega outro.
-
25/08/2012 15:16:02 |177.98.164.xxx| João - Animação

Olá bruno tudo bem
meu amigo eu estou com uma duvida com um tipo de animação e queria saber se você sabe me dizer QUE TIPO DE ANIMAÇÃO É ESSA
é uma animação muito parecia com o desenho DRAGON BALL Z mas é como os personagens fossem desenhos só que em 3D
adoro esse tipo de animação
Aqui esta um Video:
http://www.youtube.com/watch?v=p84nBxAwQOs
http://www.youtube.com/watch?v=i3CXaSZMtRUespero que me respoda breve
Abraços
-
26/08/2012 18:36:21 |177.98.172.xxx| João - animação

Muito obrigado amigo sua resposta me ajudou bastante faz tempo que eu estava pesquisando sobre isso mas graças a você eu encontrei Obrigado e um Abraço
-
29/09/2012 04:38:34 |189.35.138.xxx| Marcos Vinicius Pereira Marque

Kara, eu estou vendo o trabalho de vcs e parei nesse tópico que eu nem sei qual é por que eu vi que vcs fazem um trabalho muito bom!!! Então meus parabens!!! concerteza esta ajudando muitas pessoas!!!
Muito Obrigado.
-
15/10/2012 22:08:12 |187.66.200.xxx| Matheus - Dúvida

Entendi bastante coisa com esse post só que agora me veio uma duvida.
O motor grafico 3d ele tem que ter um sistema de esqueleto para esses tipos de animaçoes ? Tipo os modeladores ?
-
15/10/2012 22:09:28 |200.206.254.xxx| Anônimo

Se o motor for suportar animação esqueletal, ele no minimo vai ter que implementar um sistema de transformações hierárquicas para fazer os sistema funcionar.
-
15/10/2012 23:03:01 |187.66.200.xxx| Matheus - Dúvida

vlw cara muito obrigada mais uma coisa para ler um collada é muito complexo ?
-
15/10/2012 23:15:51 |200.206.254.xxx| Anônimo

Nunca fiz um leitor, então não sei dizer. A alguns anos estava pesquisando e sinceramente não gostei muito, principalmente por não gostar de XML. Se não me engano tem bibliotecas prontas para ler collada. Se não usar, basta pegar uma biblioteca qualquer de XML e usar, por ser XMl essa parte é simples.
A ultima vez que pesquisei formatos, me animei com o FBX é binário e suportado pelos modeladores mais usados, além de vir com uma API da discreet que faz a parte suja do trabalho.
Hoje se eu fosse trabalhar em um motor do zero iria considerar usar openassim e converter para um formato próprio: http://assimp.sourceforge.net/index.html
T+
-
15/10/2012 23:23:08 |187.66.200.xxx| matheus - Dúvida

Eu vi esse assimp parece ser bom. Mas estou desenvolvendo engine para android e acho que essa biblioteca é para windows.
-
15/10/2012 23:25:44 |200.206.254.xxx| Anônimo

A plataforma não importa para o formato que você usa, o motor não deve depender internamente de um formato especifico, como eu disse no meu comentário, iria usar assimp para converter para um formato interno do motor e pronto.
Como essa parte de formatos é absurdamente instável e muito dependente do projeto, é quase um suicídio atrelar o motor a determinado formato ou então, ao menos não cogitar o uso de conversores.
Outro detalhe que COLLADA não é recomendado como formato final, apenas como formato intermediário para ser usado pelas ferramentas.
-
15/10/2012 23:28:46 |187.66.200.xxx| matheus - Dúvida

Cara muito obrigada cara , já estava frustado com tanta pesquisa ate achar esse site , muito bom.
Vlw por tirar minhas duvidas.











Mais um excelente artigo Bruno.
Parabéns.