Realidade Virtual
Prof. Márcio Sarroglia Pinho


Trabalho Prático
2011/2


Objetivo deste trabalho é desenvolver uma aplicação de realidade aumentada em que o cenário real é captado por uma câmera real e sobre estas imagens são acrescentados objetos virtuais.

O trabalho está dividido em duas partes. Na primeira, sobre o ambiente real são exibidas imagens de objetos virtuais. Na segunda, os objetos reais devem rastreados e interagir com os objetos virtuais.

Parte I
Entrega: 22/10/2012
Valor: 3.5


Nesta primeira etapa o objetivo é exibir objetos virtuais registrados ao cenário real.

O cenário real deve ser composto por objetos de formas simples(cubos, pirâmides, esferas, cilindros) que caibam em cima de uma mesa quadrada de, no máximo, 0.5m de lado. O cenário deve ter, pelo menos 4 objetos.

As imagens do cenário real devem ser gerado por uma webcam.

Para cada objeto real, o programa deverá exibir um objeto virtual de mesma forma, ao qual chamaremos de "fantasma".

Posicionamento da Câmera Virtual

O cenário real deve ser filmado por uma webcam, que além de gerar a imagem deste cenário, deverá prover informações que permitam gerar a posição da câmera virtual a ser usada para exibir os objetos virtuais.

A posição da câmera real pode ser obtida de duas formas:
Cópias locais do Artoolkit podem ser obtidas nestes links:
Para Visual Studio pode ser obtida em http://www.inf.pucrs.br/~pinho/CGII/Aulas/ARToolkit/ARToolKit.zip
Para Code::Blocks ARToolKitCB.zip

Caso haja a intenção de usar uma ferramenta diferente, o professor deve ser consultado.

O ângulo de visão da webcam deve ser calculado com base na imagem de um quadriculado
, de dimensões conhecidas, posicionado perpendicularmente à câmera.

Após a obtenção da posição da câmera real, um novo programa deve entrar em execução a fim exibir o cenário virtual sobreposto ao real.

Captura das Imagens da Webcam

Para capturar imagens da webcam, sugere-se utilizar a bibblioteca CameraClass. Esta biblioteca utiliza duas outras bibliotecas, uma para capturar a imagem da webcam e outra para permitir o processamento de cada frame obtido.

Para capturar a imagem da webcam é utilizada a biblioteca IM, desenvolvida no TecGraf da  PUC-Rio.

Para permitir o acesso aos pixels de cada frame do vídeo e assim prossibilitar que se processe a imagem é utilizada a biblioteca ImageClass, desenvolvida no Grupo de Realidade Virtual da PUCRS.

As imagens também podem ser obtidas de um vídeo pré-gravado com uma webcam. Neste caso, sugere-se utilizar a classe VideoClass.

Para corrigir eventuais distorções radiais nas imagens, sugere-se utilizar o código disponível neste exemplo.

Posicionamento do Objetos Reais

A posição(e orientação) dos objetos reais no cenário devem ser informada para o programa por meio de um arquivo texto. Este arquivo poderá ser modificado pelo professor e o programa deve funcionar sem a necessidade de se recompilar o código. Neste caso, o programa deverá ser reiniciado para que a nova posição de cada objeto virtual seja lida pelo programa.

Exemplo de aquivo com os fantasmas do cenário:


2 << número de objetos no cenário
CUBO.OBJ << nome do arquivo que contém o objeto
POS 10 15.5 2
ROTX  0
ROTY 90
ROTZ  0
PIRAMIDE.OBJ
POS 0 -5 2
ROTX 90
ROTY 0
ROTZ 0

Veja neste vídeo um exemplo de um cenário real.

Objetos Virtuais

Para completar o cenário, pelo menos 3 objetos virtuais devem ser exbidos 'passeando' pelo cenário. Dois destes objetos devem se mover de forma autônoma e devem passar na frente e atrás dos objetos reais, em relação à câmera que visualiza o cenário. Um dos objetos deve poder ser controlado pelo usuário com 6 DOFs.
Os objetos virtuais podem ser desenhados com as primitivas da GLUT ou de OpenGL.

Fantasmas dos Objetos Reais

O programa deverá ser capaz de exibir ou esconder os fantasmas a qualquer momento, por um comando do usuário, sem a necessidade de recompilar o código.

Para a utilização dos fantasmas dos objetos reais, estes devem ser desenhados com a função de mascaramento cores do OpenGL.

Os fantasmas dos objetos reais podem ser desenhados com as primitivas da GLUT ou de OpenGL.



Parte II

Entrega: 26/11/2012
Valor: 3.5

Objetivo

Nesta segunda etapa o objetivo é fazer o rastreamento de um objeto real em movimento e usá-lo para interagir com objetos virtuais. O programa deverá:
- calcular a posição do objeto real em movimento;
- simular a colisão deste objeto real com objetos  virtuais colocados no cenário;
- simular a colisão dos objetos virtuais com objetos fixos do cenário.

Descrição

O programa deve processar uma sequência de quadros de aproximademente 1 minuto. Esta sequência pode tanto ser um vídeo, quanto uma sequência de imagens captadas de uma câmera e processada em tempo real.

Nesta sequência deve haver um cenário com objetos estáticos e "no meio" deste cenário deve aparecer um objeto móvel, como por exemplo uma esfera rolando, um objeto "puxado por uma corda", ou um pequeno carro de brinquedo em movimento. O objeto deve passar mais de uma vez pelo cenário, e colidir com objetos virtuais.

O programa deve identificar o objeto móvel em cada frame e substituir este objeto pois um objeto virtual de tamanho e forma equivalentes, em 3D.

Posição da Câmera Real

A câmera real deve ser posicionada, em relação ao cenário, de maneira semelhante à posição de uma pessoa que observa objetos sobre uma mesa, estando afastada da mesa, de maneira semelhante à figura a seguir.




Figura - Posicionamento para a Câmara
Posição da Câmera Virtual

A posição de câmera virtual deve ser a mesma da câmera real. A posição (e o alvo) da câmera real deve ser obtida usando o ARToolkit. Após esta obtenção, o uso do ARToolKit não é mais permitido.

Rastreamento da Posição do Objeto Móvel

Para rastrear o objeto móvel sugere-se o uso de algum método de segmentação por cor. Para tanto, o piso do cenário pode ser monocromático, assim como o objeto móvel.

Para obter a posição do objeto móvel no cenário, é preciso "desfazer" a perspectiva obtida pela câmera. Para tanto, o programa deve usar o código disponível nos fontes Warp.h e Warp.c. Este código permite que, ao se obter as coordenadas de um ponto em uma imagem em perspectiva, se possa converter esta coordenada para um cenário retangular, como na figura a seguir.

Algumas instruções sobre o uso deste deste código podem ser obtidas neste arquivo.



Figura 1 - Mapeamento de Coordenadas

Posição dos Objetos  Fixos
 

Os objetos (reais) fixos devem ser posicionados no cenário e devem existir equivalentes virtuais, posicionados como na primeira parte do trabalho.


Objetos Virtuais
O cenário deve conter pelo menos 10 objetos virtuais, inicialmente parados.
À medida em que o movimento do objeto real o fizer colidir com um objeto virtual, estes objetos virtuais deverão mover-se respondendo à colisão. Ao se mover, um objeto virtual pode colidir com outros objetos virtuais e/ou reais. Este outros objetos virtuais deverão seguir respondendo corretamente a colisã˜.

Tratamento de colisões

Para tratar as colisões de objetos reais com objetos virtuais e de objetos virtuais com virtuais deve ser utilizada a biblioteca Box2D.
Para cada objeto real(fixo ou móvel) deverá haver um objeto virtual equivalente na Box2D. Isto permitirá que ao mover-se o objeto real colida com objetos virtuais e provoque seu movimento.

Links de OPENGL

            OpenGL (Introdução)
            OpenGL (Transformações Geométricas)
            OpenGL (Visualização 3D)
            OpenGL (Carga de Objetos 3D)

MATERIAL DE APOIO     

Material de Computação Gráfica Básica
        OpenGL
                    Arquivo de Help
                    
Tutorial da Profa. Isabel Manssour
        SmallVR