Ponto V!

Home Arquitetura Programação Técnicas de animação para jogos 3D
Bruno Crivelari Sanches
Técnicas de animação para jogos 3DImprimir
Escrito por Bruno Crivelari Sanches

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.

interpolacao

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.

bones2 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

    Basic Bone System

    The Bitsquid Low Level animation system

    Fontes

    Modelo 3d: http://planethalflife.gamespy.com/

    Visualizador: http://chumbalum.swissquake.ch/


    Comentários (29)
    • Vitor Almeida da Silva  - Excelente
      avatar

      Mais um excelente artigo Bruno.

      Parabéns.

    • Bruno Crivelari Sanches
      avatar

      Vitor, muito obrigado!

    • Neto  - Rox
      avatar

      Ótimo artigo, gostei muito. Finalmente entendi como funciona as animações 3D!

    • Bruno Crivelari Sanches
      avatar

      opa! que bom!

      nos próximos artigos vou mostrar como implementar as duas técnicas.

      Abraços

    • Allender  - Exelente
      avatar

      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!

    • Bruno Crivelari Sanches
      avatar

      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+

    • Carlo  - Dúvida
      avatar

      :0 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?

    • Bruno Crivelari Sanches
      avatar

      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.

    • Anônimo
      avatar

      :whistle: no vaco

    • João  - Animação
      avatar

      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 :cheer:

      Aqui esta um Video:
      http://www.youtube.com/watch?v=p84nBxAwQOs
      http://www.youtube.com/watch?v=i3CXaSZMtRU

      espero que me respoda breve :unsure: :unsure:
      Abraços :cheer:

    • Vinícius Godoy de Mendonça
      avatar

      O nome dessa técnica é Cell Shading.

    • João  - animação
      avatar

      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 :cheer: :cheer:

    • Marcos Vinicius Pereira Marque
      avatar

      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.

    • Matheus  - Dúvida
      avatar

      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 ?

    • Anônimo
      avatar

      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.

    • Matheus  - Dúvida
      avatar

      vlw cara muito obrigada mais uma coisa para ler um collada é muito complexo ?

    • Anônimo
      avatar

      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+

    • matheus  - Dúvida
      avatar

      Eu vi esse assimp parece ser bom. Mas estou desenvolvendo engine para android e acho que essa biblioteca é para windows.

    • Anônimo
      avatar

      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.

    • matheus  - Dúvida
      avatar

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

    • Raissa  - Ola Bruno
      avatar

      Eu jogo Second Life, e queria aprender a criar animação, ja baixei um progama mas ficaram roboticas as animações, e ele tambem e muito simples não meche os feições dos avatares, você tem algum progama que pode me indicar? Eu adorei o artigo.

    • Anônimo
      avatar

      Oi Raissa, não sou artista, então não sei recomendar programas 3d. O que vejo o pessoal usando mais é 3d Studio Max, Maya e Blender (esse ultimo é free).

      T+

    • Samuel  - Excelente
      avatar

      Excelente artigo, praticamente sanou todas as minhas dúvidas.

    • Samuel
      avatar

      Ótimo artigo, sanou todas minhas dúvidas.

    • Isaac Carvalho  - Uma dúvida
      avatar

      Como você disse, um modelo 3d pode ter várias animações diferentes.
      Minha pergunta é como fazer isso?

      Tenho o modelo 3D com os bones e tudo, mas só sei renderizar a animação.

      Não deveria ter uns layers para guardá-las?

      eu uso o Blender.

    • Anônimo
      avatar

      Se usa layers no blender não sei dizer.

      Tem alguma info aqui: http://eelstork.deviantart.com/art/Multiple-animations-in-the-same-fil e-Blender-Tut-321883259

    • Flávio Monteiro
      avatar

      Muito bom o seu artigo. Gostaria de saber se possivel, que tipo de linguagem de programação é usada após a criação de personagens e/ou cenários no 3D Studio Max para poder fazer a interação dos comando no jogo . Se ele proprio possui ou tem que importa-lo para outra plataforma? desde já agradeço.

    • Guilherme O. G.  - pornozao
      avatar

      eu adoro pornozao htftfygggugderrdtftgnyghuihuopohujgy huhhuhhkkkggfgffrdgyuhiojojiggy7guj :evil: B) :D :whistle: :woohoo: :P :lol:

    Escrever um comentário
    Your Contact Details:
    Gravatar enabled
    Comentário:
    [b] [i] [u] [url] [quote] [code] [img]   
    :angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
    :X:side::):P:unsure::woohoo::huh::whistle:;):S:!::?::idea::arrow:
    Security
    Por favor coloque o código anti-spam que você lê na imagem.
    LAST_UPDATED2  

    Busca

    Linguagens

    Twitter