Uso de Dispositivos de Realidade Virtual


Para saber nais sobre o funcionamento de rastreadores de posição e suas características, você pode consultar a página da disciplina de Tópicos Especiais e Computação Gráfica da PUCRS.

A utilização de um dispositivo de realidade virtual é feita através da classe  SmVR_CDevice. Cada dispositivo a ser usado deverá possuir uma classe específica, derivada da SmVR_CDevice.
Na versão atual SmallVR possui drivers para três dispositivos:

A idéia central por trás do uso de um rastreador de posição é a criação de um obeto O da classe SmVR_CGeometricObject que reproduza o movimentos do rastreador e a posteriro adição de outros obejtos como filhos deste objeto O.
As novas versões dos rastreadores utilizam threads para a leitura dos dados, uma vez que os dados são lidos da porta serial e isto acabava comprometendo o desempenho das aplicações quando utilizavam os dispositivos.

1. Rastreador de Orientação do Óculos IGlasses

No caso de um  Iglasses a classe derivada que o controla chama-se SmVR_CIGlasses. A seguir apresenta-se um exemplo de utilização desta classe.

Inicialização

Primeiramente deve-se incluir o header file correspondente ao driver do dispositivo que se deseja utilizar:

#include "Devices\IGlasses\SmVR_CIGlasses.h"

A partir disto, cria-se um objeto da classe SmVR_CDevice e inicializá-lo com um objeto da classe SmVR_CIGlasses.
 

// Create an object to represent the device
SmVR_CDevice *Iglasses;

 // initialize the tracker device
Iglasses = new SmVR_CIGlasses();
Iglasses->Init("COM1");   // defines the serial port to
                           // be used to read the object

1.1 Ligação de um objeto com o dispositivo

A seguir deve-se criar um objeto SmVR_CGeometricObject que irá ser afetado pelo tracker dentro do programa.
Este objeto deve ser tratado como um objeto qualquer do SmallVR. Entretanto, não se deve aplicar a ele transformações geométicas que sobreponham as transformações a serem lidas do dispositivo. No caso do Iglasses, não se deve aplicar rotações pois estas são geradas pelo equipamento.
Para efetivar a ligação entre o objeto e o dispositivo deve-se usar o método Bind da classe SmVR_CDevice. Neste método informa-se o número do tracker a ser usado e o nome do objeto que irá ser controlado por este dispositivo.
 
 // Create an object to be BIND to the tracker
 TrackerObject = new SmVR_CGeometricObject("TrackerObject");
 RootObject->AddChild(TrackerObject);

 // Bind it to Iglasses tracker number 0
 Iglasses->Bind(0, TrackerObject);


A partir deste momento o objeto recém "ligado" ao tracker pode ser usado como outro objeto qualquer da classe SmVR_CGeometricObject.

 SmVR_CGeometricObject *temp1;
 temp1 = new SmVR_CGeometricObject("Cubo UM", DesenhaCubo);

 // make an object child of the tracked object
 TrackerObject->AddChild(temp1);
 

1.2 Atualização dos dados do Tracker

Periodicamente é necessário realizar a leitura do dispositivo a fim de manter atualizadas as informações geradas por ele. Para tanto usa-se o médodo UpdateAllSensors() do objeto que representa o dispositivo.
Uma possibilidade para manter uma atualização satisfatório dos dados do dispositivo é chamar este método na rotina de redesenho da tela, um pouco antes da chamada do método que redesenha os objetos. Também é possivel a atualização de apenas uma das cordenadas por vez, isto é feito através do método UpdateAllSensors(int x, int y, int z) onde são passados como parâmetro quais cordenadas devem ser atualizadas.

No exemplo a seguir, o dispositivo é lido a cada frame. Se for constatado que, em face da velocidade de leitura do dispositivo, a taxa de atualização das imagens tem uma queda muito grande quando se insere o disppsitivo, pode-se controlar da leitura a fim de realizá-la com menos freqüência.
Isto pode ser feito por meio de um contador ou de um relógio que controla quando se deve ou não ler o dispositivo.
 

void display( void )
{
 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

 PosicUser();

 glMatrixMode(GL_MODELVIEW);

 // Atualiza a orientação do objeto preso ao óculos
 // neste caso o update atualiza as informações correspondentes
 // a todos os eixos de coordenadas
 // pode ser do interesse do usuario impedir que o usuario olhe
 // para cima ou para baixo, sendo assim ele chamaria o update
 // da seguinte forma: Iglasses->UpdateAllSensors(0, 1, 1);
 // ignorando assim as rotações feitas no eixo X

 Iglasses->UpdateAllSensors(); 

 RootObject->Render();

 glutSwapBuffers();
}

1.3 Resetando a posição do tracker

Para resetar a posição do Iglasses usa-se o método Reset, conforme o exemplo a seguir. Este procedimento toma como posição-zero a atual posição do rastreador.

    case 'r':
        Iglasses->Reset(NULL);
        break;

No programa apresentado neste link tem-se um exemplo de um ambiente virtual em que o usuário pode "olhar para os lados" usado um óculos Iglasses.
 
 

2. Rastreador de Posição e Orientação Isotrack II

A utlização do rastreador Isotrack é idêntica a do IGlasses. A classe que o representa na SmallVR é a SmVR_CIsotrack. O trecho
 
 
 SmVR_CDevice *Isotrack; // define the tracker object

// Initialize the tracker device
 Isotrack = new SmVR_CIsotrack();
 Isotrack->Init("COM1");

 // Create an object to be BIND to the tracker
 TrackerObject = new SmVR_CGeometricObject("TrackerObject");
 RootObject->AddChild(TrackerObject);

 // Bind it to Isotrack tracker number 1
 Isotrack->Bind(0, TrackerObject);
 Isotrack->Reset(NULL);

 Hand = new SmVR_CGeometricObject("Hand", DesenhaCubo);
 Hand->SetRenderFunctionData(Verde);
 Hand->TranslateBy(0,0,0);

 // Make the 'Hand' object child of the tracked object
 TrackerObject->AddChild(Hand);


No programa apresentado neste link tem-se um exemplo de um ambiente virtual em que o usuário pode manipular um bastão usado o rastreador Isotrack. Para realizar a atualização dos dados do tracker pode-se, alem de se atualizar todas as rotações e translações, atualizar separadamente cada uma das rotações e translaçoes nos eixos desejados com o metodo UpdateAllSensors(int tx,int ty,int tz,int rx,int ry,int rz), onde tx, ty e tz controlam as translações nos eixos e rx, ry e rz as rotações.

Note que o referencial do rastreador deve ser posicionado conforma a figura abaixo.

3. FakeTracker

O FakeTracker é uma aplicação que simula o uso de um Rastreador de Posição e serve para se testar aplicações que fazem uso de algum dispositivo de rastreamento quando o mesmo não está disponivel.
Sua utlização é idêntica a do IsoTrack. A unica modificação que deve ser feita para se utliza-lo é a mudança do construtor do objeto que representa o rastreador na aplicação.
A classe que o representa na SmallVR é a SmVR_CFakeTracker. O trecho de código abaixo exemplifica a inicialização do FakeTracker.

 
 
 SmVR_CDevice *FakeTracker; // define the tracker object

// Initialize the tracker device
 FakeTracker = new SmVR_CFakeTracker();
 FakeTracker->Init("COM1");

Após a inicialização de um programa com o FakeTracker, sera iniciada, junto a aplicação principal, uma aplicação que é a interface do FakeTracker. Esta interface serve para controlar até dois sensores,

 

Os botões de scrool servem para realizar as rotações nas coordenadas, e os botões do tipo slider servem para realizar as translações.