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:
#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
// 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);
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 XIglasses->UpdateAllSensors();
RootObject->Render();
glutSwapBuffers();
}
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.
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.
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.