O que é o V-ART?

A utilização de humanos virtuais está cada vez mais presente no cotidiano sendo observada em filmes, jogos e telejornais, tornando-se assim aliada importante em diversas áreas, como na psicologia (tratamento de fobias), na educação física (reprodução dos movimentos dos atletas) e na educação.

Muitas vezes o espectador tem que "enxergar" os movimentos gerados por esse humanos virtuais como sendo reais, tendo então a impressão de que os mesmos são realmente humanos. Imagine, por exemplo, alguém com problemas de socialização usando uma ferramenta para tratamento de fobias. Esta deve inserí-lo em um ambiente aonde o mesmo é obrigado a interagir com outras "pessoas" (humanos virtuais). Os gestos executados pelos mesmo devem ser, portanto, os mais próximos de movimentos reais, para que o paciente possa acreditar na simulação e assim poder tratar de forma efetiva seus medos.

Mas fazer animações que se baseiam em gestos humanos é uma atividade muito complicada, haja visto que o corpo humano é uma estrutura complexa geralmente representado por um objeto articulado num programa de computador. Este objeto deve possuir várias juntas, com vários graus de liberdade (DOF), onde cada DOF representa um eixo de rotação.

Para que toda essa complexidade de uma aplicação envolvendo movimentação semelhante à dos seres humanos seja tratada, é desenvolvido pelo grupo de Computação Gráfica da UFRGS o framework V-ART (Virtual Articulations for Virtual Reality). Este framework provê a visualização de objetos 3D, com tratamento de objetos articulados (modelagem e animação). Com relação aos movimentos humanos, V-ART é desenvolvido para gerar movimentos humanos que sejam biologicamente corretos, levando em conta os limites de movimentação das juntas de um humano. Cabe ressaltar, porém, que o V-ART não serve apenas para humanos virtuais, e sim para qualquer estrutura articular hierárquica, como um robô industrial, entre outros.

A base para a criação do V-ART vêm do trabalho de Maciel et al. http://www.inf.ufrgs.br/cg/publications/amaciel/ca2002.pdf, aonde é proposto um modelo de junta, a qual é descrita como uma coleção de DOFs (graus de liberdade, ou seja dado um sistema de coordenadas cartesianas XYZ, definir em quais eixos a junta pode sofrer rotação e quais os seus limites (ângulos mínimo e máximo)). Esta abordagem baseada no DOF permite tratar a animação como uma função do tipo c = f(n), onde c é a configuração de um DOF e n é o tempo da animação normalizado (porcentagem do tempo total da animação, no qual o DOF em questão irá ser modificado). Com isso composição de funções pode ser usada, criando assim funções para manipular tanto a entrada quanto a saída de funções (c = g(f(h(n)))) modificando assim efetivamente a animação de cada junta.

Para que um sistema gere uma determinada animação de um objeto articulado (um humanóide, por exemplo), deve-se passar por algumas etapas: modelagem do objeto, geração das ações, carregamento da cena e geração dos movimentos. A modelagem do objeto envolve a determinação das articulações (ou juntas), juntamente com seus graus de liberdade, ou seja, dado um sistema de coordenadas cartesianas XYZ, definir em quais eixos a junta pode sofrer rotação e quais os seus limites (ângulos mínimo e máximo). O modelo gerado é incluído na cena e usado para gerar as ações a serem animadas. As geração das ações é feita definindo-se o tempo de execução da ação, bem como o tipo de interpolação da movimentação dos DOFS, além do tempo inicial e final da execução do movimento dos DOFS.

Estrutura do corpo articulado

Como dito anteriormente, juntas nada mais são que coleções de DOFS, ou graus de liberdade. Estes DOFS trabalham em um espaço normalizado, ou seja, quando um DOF é criado e seu intervalo de movimentação (limites) definido, sua configuração é um valor no intervalo entre 0 e 1, onde 0 é o limite mínimo e 1 o limite máximo. Estes limites podem ser modificados em tempo de execução, porém os mesmos serão sempre normalizados e seus valores estarão entre 0 e 1.

Corpos articulados são, por sua vez, definidas por uma hierarquia de juntas, com objetos gráficos (primitivas ou malhas) como filhos, conforme figura abaixo.

estArtBody.png

Arquitetura da animação

A animação é feita através de ações que nada mais são que conjuntos de posições e tempos alvo para determinados DOFs. As ações trabalham com um tempo absoluto e passam tempos normalizados de acordo com a velocidade da ação. Quando uma ação é definida, um tempo, que é o tempo total da animação é especificado em segundos. Sendo 0 o tempo inicial da ação e 1 o tempo final, cada dof tem seus tempos (inicial e final) setados neste intervalo. Por exemplo, se há uma ação que dure dois segundos e a flexão do ombro direito move-se de um tempo inicial 0,5 até um tempo final 1,0 tem-se que quando a animação estiver sendo executada há 1 segundo, o DOF que representa a flexão do ombro direito começará seu processo de modificação, até que se dê os dois segundos, haja visto que o tempo final é de 1.

Ações também têm prioridades, as quais são armazenadas ou consultadas quando a configuração de um DOF é modificada. Assim ações com prioridade maior se sobrepõem sobre as menores. Imagine que o humano está caminhando (movendo braços e pernas) e "resolve" dar tchau. Se a ação tchau tiver uma prioridade maior que a ação caminhar, os DOFS que fazem parte do tchau se movem, independente de fazerem ou não parte do caminhar, de acordo com a configuração da ação tchau. Os Dofs que não fazem parte do tchau continuam a executar o caminhar e ao término do tchau os dofs que também fazem parte do caminhar, continuam a execução do caminhar, se esta ainda estiver ativa.

Se na descrição de uma ação há só as juntas participantes da mesma, além de seus dofs, com posições finais e tempos inicial e final, como então a animação se dá de forma suave, ou seja, como o humano virtual sai de uma determinada posição e vai para outra, passando por posições intermediárias? Isso é feito pelos interpoladores, que nada mais são que equações que, dadas duas posições, inicial e final, e um tempo, definem quais as posições intermediárias devem ser alcançadas até a posição final.

A cena

Para que uma cena seja renderizada devem existir objetos, pelo menos uma câmera e uma fonte de luz. V-Art, por sua vez, tem as classes prontas para a criação e exibição da cena e o melhor é que o usuário tem apenas que se preocupar com a programação de alto nível. Por exemplo, uma cena pode ser definida da seguinte forma:

static Scene scene; // create a scene
static ViewerGlutOGL viewer; // create a viewer (application window)
// create a camera (scene observer)
Camera camera(Point4D(-5,0,3.5,1),Point4D(0,0,1.5,1),Point4D(0,0,-1,0));
clVigilanceCamera vgCamera; // create a vigilance camera (scene object)

// Build up the scene
scene.AddObject(&vgCamera);
scene.AddLight(Light::BRIGHT_AMBIENT());
scene.AddCamera(&camera);

e o resultado disso é:

camera.png


Existem algumas formas de se definir objetos (através de primitivas ou malhas) e também a animação, mas isso ficará para uma próxima oportunidade.