Computação Gráfica::Trabalhando com Captura de Movimentos

A captura de movimentos (motion capture – MoCap) é uma técnica de aquisição de dados hierárquicos de movimentação 3D que podem ser utilizados em Computação Gráfica para modelagem e animação. A captura de movimento é realizada utilizando-se um conjunto de equipamentos:

  1. Uma roupa especial;
  2. Um conjunto distribuído pelo ambiente de câmeras infravermelho com holofotes infravermelhos;
  3. Marcadores em posições definidas, especialmente juntas do corpo, constituídos por refletores infravermelho;
  4. Software de tracking.

Atividade Prática da Turma: Visita aos Estúdios de Animação/Captura de Movimentos da UFSC

Todo semestre planejamos uma visita aos Estúdios do DesignLab da UFSC para a captura de dados de movimentação de alguns dos alunos da turma. Adiante algumas cenas de 2017.1:

mocap-estudio

A Aula de Motion Capture (MoCap) para a turma 2018.1 de INE 5420 – Computação Gráfica ganhou um post próprio. Dê uma olhada!

Como usar dados de MoCap para Modelagem de Seu Personagem

Dados de MoCap podem ser empregados diretamente em um modelador 3D para serem usados como o rigging de seu personagem. Para importar e usar dados de MoCap faça primeiro um experimento com os dados disponibilizados nesta página, carregando-os no Blender e visualizando a movimentação.

Dados de Captura de Movimento para seu Experimento (a partir de 2016.1)

Criando um Esqueleto a partir de um Arquivo de MoCap

Abra um novo projeto com File -> New e apague o cubo padrão para ele não incomodar. O mais fácil é você selecioná-lo na hierarquia à direita e deletar:

mocap1

Vá para importação de arquivos XBF, com File -> Import -> XBF files:

mocap2

Importante: Se a opção de importar arquivos XBF não aparecer, é porque você não habilitou o plugin de importação de XBF. Vá para File -> Preferences e, na janela que abrir, selecione o plugin de importação/exportação de XBF (ele vem pré-instalado por default no Blender, só que tem de ser ativado):

mocap5

Em seguida carregue o arquivo .xbf desejado. Se você está usando o nosso dataset, sugerimos começar com o primeiro arquivo: Luca Acao 02.fbx.

Garanta que os ossos estarão na orientação correta e com a hierarquia certa: No Blender, antes de carregar um .fbx de MoCap, você tem de habilitar a opção de seleção automática de orientação de ossos, como mostra a figura: no file browser de importação de .xbf do Blender, selecione o painel Armatures, embaixo à direita, e depois selkecione a caixa Automatic Bone Orientation:

mocap4

Vai levar um tempo para o Blender montar o esqueleto. Dê clique duplo no nome do arquivo e aguarde…..

Importante:  o modo Automatic Bone Orientation não fica automaticamente selecionado. Toda vez que você carregar um .fbx novo, você tem de re-selecionar a caixinha.

Fazendo o Rigging andar

Depois que abrir, você pode dar zoom na figura e ativar a animação no botão de play no editor de linha do tempo que deve ter aberto na parte de baixo do Blender para fazê-la andar:

mocap3

Observe que você pode inspecionar toda a hierarquia de ossos no painel da direita.

Agora é só achar um boneco legal para colocar esse esqueleto dentro. Vamos voltar ao nosso exercício de criação de um personagem Pokèmon?

Lembrete: Para animar em Blender, um painel importante é o Editor de Linha do Tempo:

editors_timeline

Você pode selecioná-lo na lista de painéis, clicando no ícone do relógio. Olhe com atenção a página de manual do Timeline Editor antes de seguir adiante.

Cuidados ao Criar Personagens Animados usando Modelos Prontos da Internet

Se você quer poupar trabalho e vai usar um modleo pronto da Internet junto com dados importados de MoCap, você tem de tomar alguns cuidados além dos problemas de orientação explicados ni vídeo de Hugo Boehs acima. O principal é que modelos na Internet não necessariamente são pensados para animação e podem estar desconectados. Isso significa que o modelo é bontio d eolhar, mas nem todas as pertes são conexas: quando você for animar, ele vai se desmontar.

Problemas com Modelos Desconexos

Para ver o que contece ao se associar um esqueleto com um modelo desconexo, carrege o nosso Steve-padrão em seu Blender. Se você clicar com o botão direito do mouse em qualquer de suas partes em Object Mode, vai ver que é só um braço ou a cabeça que é selecionada. Isso parece fácil de resolver: é só selecionar todas as partes e juntá-las com [CTRL]+[J], não?

Não. Isso vai fazer com que todas as partes façam parte do mesmo objeto, mas não significa que as bordas dos sólidos que o compõem vão ficar conectadas e passar a ser consideradas como uma borda só.  Ao deformar o objeto com o esqueleto, as bordas vão se separar.

Faça o experimento: depois que carregou o Steve-padrão, carregue um esqueleto de MoCap da nossa coleção, por exemplo Luca2 do Arquivo de MoCap da Turma de INE 5420 de 2017.1 e  escalone e rotacione o Steve até estar adaptado ao esqueleto em Edit Mode:

steve-blocos-desligados1

Agora, em Object Mode, associe selecione ambos e esqueleto e boneco em Obect -> Parent e anime para ver o que acontece:

steve-blocos-desligados2

Você vai ver a animação toda desengonçada. É que cada braço e cada perna é uma peça que faz parte do boneco e está na sua hierarquia, mas suas bordas não estão conectadas. Então quando o boneco se mexe, as bordas se soltam umas das outras como mostra a figura acima.

Como conectar um Objeto Pronto para usar em Animação?

Se ao invés de construir um boneco, você baixou alguma coisa da Internet e quer usar para a animação mas, ao fazer um teste, comportou-se como o Steve acima, o que fazer?

Conecte-a!

Vamos mostrar o processo usando o Steve-padrão,  mostrando, passo-apasso como conectar um braço.  Inicie carregando o boneco, indo para modo de seleção de vértices e selecionando um vértice da parte do corpo que você quer conectar ao tronco:

steve2

Em seguida use a seleção de partes conectadas com [Ctrl]+[L] para selecionar toda a parte do corpo:

steve3Empurre a parte selecionada para longe do corpo clicando no eixo de coordenadas (no nosso caso o eixo verde) e empurrando um pouco. Assim você vai ter aceso melhor ao corpo. Empurra pelo eixo de coordenadas vai facilitar depois empurrar de volta. Não coloque a peça em qualquer lugar, você vai passar trabalho para alinhar depois!

Agora vá para modo de seleção de superfícies, selecione a superfície (faceta ou facetas)  que estáva sendo tocada pelo membro que você quer fundir (no nosso caso o braço) e sundivida-a para criar novas arestas internas com Mesh -> Edges -> Subdivide ou [Ctrl]+[E] -> Subdivide:

steve5

Agora foram criados novos vértices. Vamos transformá-los em arestas?

Crie as Arestas que faltam no Corpo para Conectar os Membros

Em seguida retorne ao modo de seleção de vértices, selecione os dois vértices criados com a subdivisão e conecte-os com Mesh -> Vertices -> Connect Vertices ou, simplesmente [Ctrl]+[V] -> Connect Vertices:

steve6

Isto vai criar uma nova aresta que pode ser usada como a nova parte de baixo do retângulo do braço, quando você conectá-lo. Empurre a aresta para cima clicando no vetor azul (Eixo Z) e empurrando com o mouse até estar alinhada à mesma altura com a parte de baixo do braço.

Agora empurre o braço de volta, selecionando algum vértice no braço e, em seguida, selecionando todos os vértices conectados com [Ctrl]+[L] como fizemos anteriormente, e aí empurrando o braço pelo eixo verde (Y): 

steve7

A parte de baixo do braço deveria estar alinhada com a nova aresta que você criou.  Se não estiver, vá para o modo de seleção de arestas, selecione-a e empurre-a para cima e para baixo até o alinhamento estar bom:

steve8

Funda Vértices para unir Partes em um único Mesh

Agora você vai fazer as duas arestas paralelas que se tocam transformarem-se em uma só. Você vai fazer isto aresta-a-aresta.  Comece selecionando uma extremidade da aresta, indo para modo de seleção de vértices, selecionando um vértice e, usando [Shift]+[botão direito do mouse], selecione o segundo vértice também (basta clicar com o mouse perto):

steve9

Em seguida funda os vértices usando Mesh -> Vertices -> Merge ou [Ctrl]+[V] -> Merge ou então o atalho [Alt]+[M].

Vai aparecer o menu abaixo, para você escolher o ponto de referência da fusão. No exemplo abaixo estamos escolhendo At last (na posição do último vértice) para deixar o braço alinhado com a superfície onde selecionamos o ponto por último (no nosso caso o lado do corpo). Fica a seu gosto. Se tiver dúvidas, pegue o ponto médio entre os dois vértices (At center):

steve10

Como eu continuo?

Repita esse processo para todos os vértices correspondentes de cada parte do corpo do seu boneco que se toca. Assim você estará fundindo esta fronteira em um único meshe e vai ocorre uma deformação homogênea quando os ossos forem mover esta parte.

Exercício Simples em Sala: Animando o Steve com MoCap

Vamos animar o Steve do Minecraft? Preparamos um Steve sem os problemas do arquivo acima: ele é todo conexo e possui suficientes “dobras” para se comportar direito. O objetivo é aprender a ajustar um rigging obtido através de MoCap a um boneco.  Comece então baixando o nosso Steve5.  Depois de pronta, a animação deve ficar como abaixo:

steve-subdividido-em-acao

 

Para ver como se faz, olhe as instruções do Pokèmon Golduck abaixo:
 

Outro Exercício em Sala: Animando o Pokèmon Golduck

Carregue e ajuste o Golduck

Abra o nosso dataset de Pokèmon para Blender e encontre o Pokèmon chamado Golduck. Ele é representado de pé e de braços abertos, facilitando a integração dele ao esqueleto do arquivo inicial do dataset de MoCaps de 2017.1. Carregue-o e faça algumas pequenas modificações no arquivo de projeto dele:

  1. Ilumine-o: vários Pokèmons desse dataset vêm sem iluminação. Crie uma fonte de luz e posicione-a de forma a iluminar bem o Pokèmon. No exemplo abaixo criamos um Sol. Também mudamos a visualização para perspectiva.
  2. Crie mais painéis para facilitar a visualização: criamos um segundo painel com uma visão simpes em projeção paralela (vai ajudar a poscionar o esqueleto, depois) e uma visualzação da hierarquia de objetos.
  3. Junte tudo do Pokèmon em um único mesh hierárquico: vários Pokèmons desse dataset vêm divididos em meshes que não estão conectados. Se você deixar assim, na hora em que for conectar o esqueleto com o mesh, você só vai animar um dos meshes e a movimentação vai fazer o Pokèmon se dividir.  O Golduck é um desses Pokèmons que vêm divididos em partes: há dois meshes, um para os olhos e outro para o corpo.Você têm de conectá-los da maneira que ensinamos para esqueletos no tutorial de animação do cilindro, de forma que o corpo seja o pai dos outros, como mostra o painel herárquico da figura abaixo:

mocap6.1

Carregue o Esqueleto do MoCap

Agora você está pronto para importar o esqueleto a partir do arquivo XBF. Vá para importação de arquivos XBF, com File -> Import -> XBF files:

mocap7

Carregue o arquivo  inicial do dataset de MoCaps de 2017.1.Lembre de habilitar a opção de seleção automática de orientação de ossos, como mostra a figura: no file browser de importação de .xbf do Blender, selecione o painel Armatures, embaixo à direita, e depois selecione a caixa Automatic Bone Orientation, só então carregue o arquivo:

mocap8

Ajuste o Esqueleto

Agora você tem de:

  1. Achar o esqueleto: descubra onde foi parar o esqueleto, indo para o modo de visualização de meshes com [Z] ou pelo menu de visualização como mostra a figura abaixo;
  2. Ajustar o esqueleto ao Pokèmon: Movê-lo com [G] e escaloná-lo com [S] [fator de escala] para que se ajuste dentro do boneco.

Assista o vídeo abaixo, feito para nós por Gustavo Boehs do Design Lab da UFSC, para ver detalhes do que você vai fazer a seguir:
 

 

A imagem abaixo mostra os resultados da carga e visualização:

mocap9

Depois da carga e da mudança para visualização em modo de meshes, dê um [A] para selecionar tudo. Você vai enxergar o boneco (1) (em laranja na figura) e o esqueleto (2) (em amarelo na figura).  Ficou claro que os dois possuem escalas diferentes e temos de ajustá-los um ao outro.

Selecione agora apenas o esqueleto, des-selecionando tudo novamente com [A]  e selecione apenas o esqueleto com o botão direito do mouse:

mocap9.1

Agora, mova e escalone o esqueleto para ocupar o “interior” do boneco. Primeiro mova para o centro do boneco. Dê um grab [G] e use a rotação de sua visão com o botão do meio do mouse (aperte a rodinha) tanto no painel de visualização da direita (em projeção paralela) quanto no painel da esquerrda (em perspectiva) para visualizar o posicionamento:

mocap9.2

Depois, escalone com [S] [fator de escala] até ficar do tamanho certo. Sugerimos ir em passos pequenos, primeiro [S][2] e depois de [S] [1.2] em [S] [1.2]:

Se necessitar de mais algum ajuste, use grab [G] novamente até o ajuste fino ficar perfeito.

Cuidados a Tomar

Observe que o Golduck é um exemplo de um boneco pronto da Internet onde há partes inadequadamente conectadas. Se você animá-lo sem conectar tudo primeiro, a animação vai ficar assim:

golduck-desconexo

Veja nossas instruções acima para saber como conectar.

Mais um Exercício: Anime o Pokèmon Heracross usando MoCap

Este exercício é um pouco mais difícil: Vais exigir de você adaptar mais do esuqeleto para que ele possa se encaixar ao Pokèmon. Veja o vídeo abaixo:

Quais dados usar?

O Heracross original da coleção Pokèmon tem alguns problemas de conexão. Use nosso Heracross2 que é bastante conectado.

heracross4

Do que eu preciso cuidar aqui?

Observe que este Pokèmon, apesar de ser bípede e ter uma estrutura corporal que pode ser considerada humanóide, possui proporções corporais bem diferentes das de um humano. Para adaptar dados de MoCap de um humano a ele, você vai ter de editar o seu esqueleto de forma a deixá-lo adaptado às dimensões do Heracross. Para isso você pode:

  • Em EditingMode, usar o comando Circle Select [C] do Blender para selecionar grupos de ossos e, depois de selecionados (não esqueça de terminar a seleção com um clique do botão direito do mouse):
    • Deslocá-los ao longo dos eixos X, Y, e Z, mudando as relações de posição
    • Escaloná-los ao longo dos eixos X, Y e Z de forma a modificar suas proporções

heracross2

Divirta-se!

heracross3

Exportando seu Modelo para Unity3D

É simples. Aqui há uma explicação do lado do Unity. Leia-a e você comprenderá: https://docs.unity3d.com/Manual/HOWTO-ImportObjectBlender.html.

Para facilitar a sua vida criamos uma página especial com um exemplo detalhado utilizando a animação do Pokèmon Heracross que você vai fazer em aula. Olhe aqui: Computação Gráfica::Exportando o seu Modelo para Unity3D.

Ferramentas Alternativas

Você pode usar também Autodesk Maya para carregar arquivos de MoCap. Na figura adiante um exemplo usando os mesmos dados das figuras acima:

maya-esqueleto1

Links Úteis

Dados

Dados de Captura de Movimento para seus Experimentos

Arquivos de Modelos em Blender

Obs.: Se você for usar os humanos-padrão em seu trabalho, vista-os com roupas que você deve fazer ou buscar de uma fonte na Internet.

Enunciados e Resultados de Trabalhos de Animação e Games com Modelos  Hierárquicos:

  1. Trabalho de Animação com Modelos Hierárquicos, Motion Capture e Game Engines::Jogo de Pokèmon em Unity ou UE4
  2. Trabalho de Animação com Modelos Hierárquicos, MoCap e Game Engine::Jogo de Pokèmon Ciclista em Unity ou UE4

Software

Páginas de Manual do Unity3D relacionadas ao Tema Animação

Sobre o Autor

possui graduação em Ciências da Computação pela Universidade Federal de Santa Catarina (1989) e Doutorado Acadêmico (Dr. rer.nat.) em Ciências da Computação pela Universidade de Kaiserslautern (1996). Atualmente é professor Titular da Universidade Federal de Santa Catarina, onde é professor do Programa de Pós-graduação em Ciência da Computação e dos cursos de graduação em Ciências da Computação e Sistemas de Informação. Tem experiência nas áreas de Informática em Saúde, Processamento e Análise de Imagens e Engenharia Biomédica, com ênfase em Telemedicina, Telerradiologia, Sistemas de Auxílio ao Diagnóstico por Imagem e Processamento de Imagens Médicas, com foco nos seguintes temas: analise inteligente de imagens, DICOM, CBIR, informática médica, visão computacional e PACS. Coordena o Instituto Nacional de Ciência e Tecnologia para Convergência Digital - INCoD. Foi o criador e primeiro Coordenador do Núcleo de Telessaúde de Santa Catarina no âmbito do Programa Telessaúde Brasil do Ministério da Saúde e da OPAS - Organização Pan-Americana de Saúde e criador do Núcleo Santa Catarina da RUTE - Rede Universitária de Telemedicina.