Sistemas Gráficos 3D

Luiz Velho -Impa - 2009


Projeto de curso

Criando uma animação 3D

Alexandra Camargo Alves


Resumo


Este trabalho estuda a produção de uma animação 3D.
O estudo envolve modelagem de personagem, hierarquia, animação procedural, visualização de câmera e interação.
No desenvolvimento foi utilizado a linguagem de programação python e o motor Panda 3D.

<voltar>

Introdução


O objetivo deste trabalho foi desenvolver uma ferramenta minimalista para a criação de uma animação 3D.
É disponibilizado ao usuário um personagem bípede animado e um ambiente 3d com alguns objetos. Com o mouse o usuário pode desenhar um caminho a ser percorrido por este personagem, que deverá seguir este caminho e realizar as transformações necessárias para percorrê-lo.
Após fornecer o caminho, o usuário pode iniciar a cena, visualizando a partir de uma câmera pré-programada a animação.
<voltar>

Animação


A palavra animação vem do latim  animare, que quer dizer, dar vida, movimento, alma. Seu surgimento está relacionado às pinturas egípcias feitas nas paredes que datam de 2000 a.C.
A percepção da imagem em movimento se da por uma característica da visão humana, a persistência da visão, demonstrada por Paul Roget Frenchman. Utilizando a persistência humana como recurso, Frenchman inventou o thaumatrope (Figura01), um disco com desenhos diferentes em cada lado que que ao ser girado criava a sensação de movimento (Figura02).

Figura01: Thaumatrope
Fonte: http://education.eastmanhouse.org
                    

Figura02: Disco em movimento

Fonte:http://www.geocities.com/animajar/thauma.html

Desde seu surgimento até hoje, a animação está presente em um grande número de aplicações da computação gráfica, em áreas como engenharia, medicina, entretenimento e educação.
Com a evolução das tecnologias digitais, a animação passou a ser também produzida po computador. A animação por computador pode ser dividida em duas categorias:


Na animação assistida por computador, o computador gera quadros intermediários a partir dos quadros-chave fornecidos pelo animador. Já na animação gerada por computador, o animador pode utilizar diferentes técnicas, como as "técnicas de baixo nível (low level techniques) ou as técnicas de alto nível (high level techniques), que estão associadas ao nível de abstração.
As técnicas de baixo nível auxiliam na especificação dos movimentos e as de alto nível auxiliam na descrição do comportamento do personagem.
Os algoritmos de interpolação que cria os quadros intermediários (inbetweening) são exemplos de técnicas de baixo nível, onde é possível descrever os movimentos do personagem quando estes já são determinados pelo animador.
Neste trabalho foram utilizadas as técnicas de baixo nível, onde os movimentos do personagem são determinados a partir de interpolações.
<voltar>

Técnicas de animação


Podemos classificar uma animação por:

Figura03: Animação por quadro-chave

B = GeoSphere( ); s = sphere( );
animate on
(
        at time 0 ( move b [-100, 0, 0.25]; scale s[1, 1, 0.25])
        at time 35 move b [0, 100, 0]
        at time 100 ( move b [200, 0, 0]; scale s[1, 1, 3])
)

Figura04: Animação por script


Figura05: Morphing


Figura06: Animação estocástica - queda d'água


<voltar>

Hierarquia


A hierarquia nos permite construir objetos a partir da composição ou decomposição desses objetos em partes. Objetos mais complexos, como um esqueleto, pode ser construído a partir da composição de objetos.
Em uma hierarquia, classificamos os objetos em compostos ou articulados.
Os objetos compostos não apresentam movimentos relativos entre os seus sub-objetos. Um exemplo de objeto composto por der uma mesa com seu tampo e as quatro pernas.
No exemplo (Figura07) podemos verificar uma hierarquia com objetos compostos.

Figura07: Exemplo de um objeto composto.
Fonte: http://www.guerrillacg.org

Já os objetos articulados são construídos a partir de sub-objetos rígidos conectados por articulações ou juntas. Estas juntas formam vínculos que permitirão movimentos relativos entre os sub-objetos.

Figura08: Exemplo de um objeto articulado

Para o caso do objeto construído para uma animação, um bípede, devemos construir um esqueleto articulado.
Os vínculos podem ser divididas em duas classes: vínculos geométricos e vínculos físicos.
Os vínculos geométricas são definidos através de uma relação de contato entre os objetos ligados. Já os vínculos físicos representam forças de atração ou repulsão que podem ser aplicadas aos objetos geométricos.
Na área de animação existem os vínculos comportamentais, modelados a partir de vínculos geométricos ou físicos,  que permitem a criação de regras de comportamento definidas a partir da criação de vínculos entre os objetos (atores).
<voltar>

Cinemática Direta (Foward Kinematcs-FK) e Cinemática Inversa (Inverse Kinematics-IK)


Uma hierarquia básica (FK), decrescente (top-down), é definida ao se criar uma árvore de objetos vinculados. Os objetos "filhos" assumem as propriedades de posicionamento, translação e rotação dos objetos "pais".
Neste tipo de cinemática, se você mover o pais todos os filhos o acompanharão, o inverso não acontece.
Em um esqueleto, se você quiser mover a mão deverá primeiro mover o ombro, depois o antebraço e continuar aplicando a transformação até chegar à mão.
A função utilizada para descrever uma FK tem a sua complexidade aumentada proporcional ao número de articulações.
Em uma hierarquia IK, os objetos "filhos" interferem nos objetos "pais", isto é, a posição, translação e rotação dos objetos "pais" são definidas a partir dos objetos "filhos".
A IK é muito utilizada quando um personagem preso em algo pelas suas extremidades, como por exemplo estar em pé sobre o chão.
<voltar>

A hierarquia de objetos articulados


Entre os diversos tipos de articulações existentes, podemos citar duas presentes no esqueleto humano: juntas de revolução e juntas esféricas.
Nas juntas de revolução os objetos são ligados através de um eixo ao redor do qual ele pode ser rotacionado. Já uma junta esférica tem a sua representação feita por uma esfera conectada a uma parte rígida da estrutura. Cada parte rígida pode assumir qualquer posição na esfera, sendo assim, cada parte pode rotacionar ao redor do seu eixo longitudinal.


<voltar>

Articulações


Na criação de personagens, como o bípede, normalmente são utilizadas dois tipos de juntas, as juntas de revolução e as juntas esféricas.
A junta de revolução é a mais utilizada. Permite a rotação do extremo de um osso no extremo de outro osso. Possui apenas um grau de liberdade permitindo rotações apenas em um eixo.
Elas são divididas em:

Figura09: hinge

A junta esférica implementa o conceito de junção ball-and-socket (Figura10), onde uma esfera está livre para executar qualquer movimento de rotação enquanto estiver segura por um encaixe.

Figura10: ball-and-socket

<voltar>

O motor Panda3D

Panda3D é um conjunto de bibliotecas de código livre voltada para o desenvolvimento de jogos e renderização 3D. No desenvolvimento com Panda3D é possível utilizar as linguagens de programação Python ou C++.
Esta biblioteca foi disponibilizada como software livre em 2002 e atualmente é desenvolvida conjuntamente pela Disney e pelo Centro de Entretenimento Tecnológico da Universidade de Carnegie Mellon.


O projeto

Para o desenvolvimento do sistema minimalista de animação foram utilizados modelos prontos disponibilizados pelo Panda3D.
Os modelos são disponibilizados em arquivos .egg. Esses arquivos contém os dados necessários para a descrição da cena, incluindo geometria, colisão, animação entre outros.
Os arquivos .egg são escritos na linguagem entendida pelo Panda3D que disponibiliza ferramentas para converter alguns formatos para .egg.
Estes arquivos possuem uma série de sequências e hierarquias. A sintaxe de cada entrada é:

<Entry-type> Nome (conteúdos)

Que resulta em um código assim:

<Comment> {
  "maya2egg -a chan -cn Eve Eve-Run.mb Eve-Run.egg"
}
<Table> {
  <Bundle> Eve {
    <Table> "<skeleton>" {
      <Table> EveControls {
        <Xfm$Anim_S$> xform {
          <Scalar> fps { 24 }
          <Char*> order { sphrt }
          <S$Anim> y { <V> { -0.273507 } }
        }
        <Table> Skeleton {
          <Xfm$Anim_S$> xform {
            <Scalar> fps { 24 }
            <Char*> order { sphrt }
            <S$Anim> h { <V> { -19.201 } }
            <S$Anim> p {
              <V> {
                10 6.75781 3.4375 0.273437 -2.5 -5.07813 -7.5 -9.29688
                -10 -9.29688 -7.5 -5.07813 -2.5 0.273437 3.4375 6.75781
                10
              }
            }
            ...

Um objeto animado pode possuir mais de uma animação. Estas animações podem estar em diferentes arquivos .egg ou no mesmo arquivo.
A entrada <Blunde> inicia a definição de uma tabela de descrição da animação, que define que o modelo é animado.
Além das animações pré-definidas, é possível desmembrar o esqueleto e aplicar animações em outras sub-partes do modelo.
No projeto foram utilizadas as animações run e walk do modelo eve (Figura11) e foi adicionada uma animação para o pescoço do modelo.


Figura11: Modelo eve

A animação criada para o pescoço do modelo permite que se tenha uma animação onde o personagem olhe em direção ao ponteiro do mouse.
Quanto mais partes forem animadas, mais rico em detalhes e realismo fica a animação. Entretanto, é necessário mais tempo e planejamento para uma animação com muitos níveis de detalhes.
<voltar>

Resultados

A interface (Figura12) desenvolvida apresenta as opções disponibilizadas ao usuário para a produção de uma animação.


Figura12: Interface do Anim

Foram utilizadas teclas para selecionar a função desejada.
ESC - finaliza a aplicação
[1]- permite a criação da animação a partir do caminho definido pelo usuário. Para facilitar o usuário, a câmera oferece uma visão ortogonal do mundo (Figura13), permitindo traçar o caminho em coordenadas x e y. Como resposta ao usuário o personagem percorre os caminhos parciais definidos pelo usuário. Estes caminhos parciais são guardados e animação completa pode ser vista em seguida.
[2] - permite executar a animação criada. Para exibir a animação a câmera muda de posição ficando sempre atrás do usuário (Figura14), seguindo seus passos. Como os caminhos parciais foram gravados, a animação começa a tocar a partir da posição inicial do personagem.
[3, 4 e 5] - permitem ao usuário trocar o objeto posicionado na mão do personagem.
[i] - aumenta a velocidade da animação do personagem. Essa mudança pode ocorrer a qualquer momento anterior a definição de um caminho parcial. Com este recurso o usuário pode definir velocidades variadas em sua animação.
[d] - decrementa a velocidade da animação do personagem, também podendo acontecer a qualquer momento anterior a definição de um caminho parcial.

Figura13: Modo de edição do caminho

Figura14: Modo de visualização




<voltar>

Referências


http://www.siggraph.org/education/materials/HyperGraph/animation/rick_parent/Full.html#TrackBased
http://www.moscovich.net/tomer/papers/anisketch.pdf
http://graphics.stanford.edu/papers/sketch_interface/Davis_149_SketchingAnimation_SCA2003.pdf
[Gomes2003] J. M. Gomes, L. Velho, Fundamentos da Computação Gráfica, IMPA, 2003
[Azevedo2003] E. Azevedo, A. Conci, Computação Gráfica: Teoria e Prática, Editora Campus, 2003
http://en.wikipedia.org/wiki/Skeletal_animation
http://en.wikipedia.org/wiki/3D_projection
http://en.wikipedia.org/wiki/Computer_animation
BARBOSA JUNIOR, Alberto Lucena. Arte da animação. Técnica e estética através da História. São Paulo: Senac, 2002. In http://books.google.com.br/books.


<voltar>