Visão Computacional
e Realidade Aumentada.
Objetivo: Implementação de um programa que insira objetos 3D animados num vídeo através da combinação do ARToolKit e do IrrLitch Engine.
Justificativa: Apesar de o Artoolkit ser uma ótima biblitoca para uso em realidade aumetada ele é feito para trabalhar com openGL puro. Assim sendo complica-se par uso de efeitos mais elaborados e carga de objetos 3D.
Funcionamento:
O Artoolkit nos proporciona uma interface para interagir com a câmera, pegar as suas imagens, detectar os marcadores e achar a sua matriz de posicionamento espacial, por isso ele irá tratar da parte relacionada ao mundo real e sua correspondência com o mundo virtual. Já o Irrlitch por ser um engine gráfico e portanto também um grafo de cena será responsável por lidar com a carga de objetos completos, as transformações 3D necessárias, animações e iluminação.
Para se fazer a interface entre os dois segue-se um fluxo, mas a idéia principal é bastante simples. Pega-se imagem a imagem do stream de vídeo e aplica-se numa textura que funciona como background da cena exibida. Depois acha-se os marcadores, e a cada marcador se acha a matriz que o posicionará na tela. Com esses dados associa-se a matriz a um nó da e insere-o na cena.
Captura da imagem pela câmera
Detecção dos marcadores Calculo da matriz Adição da imagem como background Associação dos nós aos marcadores Renderização dos nós
Para exemplificar o funcionamento vou mostrar um exemplo de código altamente comentado:
bool fullscreen = false;
MyEventReceiver
receiver;
//Criação
da tela de exebiçao
device = createDevice(
video::EDT_OPENGL, dimension2d<s32>(WIN_WIDTH, WIN_HEIGHT), 16,
fullscreen, false, false,
&receiver);
// Inicio
da captura de vídeo
driver = device->getVideoDriver();
// Criação do gerente da cena
smgr = device->getSceneManager();
// Definindo um títuo para a janela
device->setWindowCaption(L"Exemplo");
// Abrindo um objeto 3D
IAnimatedMesh* mesh =
smgr->getMesh("media\\sydney.md2");
// Atrelando
o objeto a um nó
IAnimatedMeshSceneNode*
node = smgr->addAnimatedMeshSceneNode(mesh);
if (node)
{
// Definindo propriedades do nó como textura e iluminação
node->setMaterialTexture(
0, driver->getTexture( (BaseDir + "media\\sydney.bmp").c_str())
);
node->setMaterialFlag(EMF_LIGHTING,
false);
node->setMD2Animation(scene::EMAT_POINT);
node->setPosition(vector3df(0,50,0));
node->setScale(vector3df(2,2,2));
}
//camera
vector3df camera_pos = vector3df(0,0,0);
vector3df camera_target = vector3df(0,0,1);
// Criando a camera
ICameraSceneNode* camera = smgr->addCameraSceneNode(0,
camera_pos, camera_target);
//AR
IARManager* armgr = new
IARManager(device);
//iniciando a camera
armgr->beginCamera( "ardata\\camera_para.dat",
"ardata\\WDM_camera_flipV.xml", "-dev=/dev/video0");
//Atrelando um nó a um marcador
armgr->addARSceneNode("ardata/patt.hiro",
node);
//Ajuste da camera utilizando uma
matrix geral
armgr->fixCamera(camera);
while(device->run())
{
//Define a cor padrao da cena
driver->beginScene(true, true,
SColor(255,100,101,140));
// Inicia a
captura de video e reconhecimento de padroes
armgr->run();
// Desenha o fundo
armgr->drawBackground();
// Desenha tudo (os objetos após o fundo)
smgr->drawAll();
driver->endScene();
// Busca
Marcadores.
verifyMarkers(armgr);
}
device->drop();
Resultado do programa:
Exemplo de funcionamento interno:
A próxima função é o que faz a integração com a engine:
ARUint8 *dataPtr;
//busque a próxima imagem da câmera
dataPtr = (ARUint8
*)arVideoGetImage();
arVideoCapNext();
if(!dataPtr) return
0;
//enviar para o irrlitch como uma textura
this->update_ITexture(this->cam_texture,
dataPtr);
//Ache os marcadores e faça as mudanças aproriadas aos nós ligados ao ele.
this->translate_nodes(dataPtr);