SmallVR - Virtual Reality Toolkit
Prof. M�rcio Sarroglia Pinho
Quick Start

Primeiro Programa

A SmallVR � um biblioteca que implementa um grafo de cena.

Para test�-la, abra o projeto que corresponde a seu compilador e insira o arquivo Cubo.cpp em seu projeto.
Este arquivo est� no diret�rio TestFiles.


Compile rode o programa, observando o resultado. Isto deve exibir na tela um cubo vermelho.

No in�cio do fonte h� uma declara��o na forma

// Root Object to represent the entire scene
SmVR_CGeometricObject *RootObject;

A classe SmVR_CGeometricObject define os objetos na SmallVR. Para criar uma cena, � preciso ter um objeto desta classe que defina o nodo inicial do grafo de cena, comumente chamado de raiz do grafo. Neste exemplo, a vari�vel RootObject representa este nodo.


Analise o programa principal. Nele voc� pode ver inicializa��o da biblioteca

    // initialize the library
    RootObject = SmVR_Init(NULL);

e a
cria��o de um objeto da SmallVR.

    // Create a new object
    TestObject = new SmVR_CGeometricObject("Cubo", DrawTest);


O primeiro par�metro da construtora da classe
SmVR_CGeometricObject  especifica o nome do objeto e o segundo a rotina que ir� desenh�-lo.

A seguir, � necess�rio adicionar o objeto rec�m criado ao grafo, atrav�s do m�todo AddChild.

      // Add the object to the scene
    RootObject->AddChild(TestObject);


Na fun��o que faz a exibi��o da cena OpenGL, voc� pode observar a forma usada para exibir a cena. Isto � feito atrav�s da chamada do m�todo Render, a partir do objeto que representa o in�cio do grafo.


void display( void )
{

    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    PosicUser();
    glMatrixMode(GL_MODELVIEW);
    RootObject->Render();
    glutSwapBuffers();
}




Aplicando Transforma��es Geom�tricas

Para aplicar transforma��es geom�tricas em um objeto da SmallVR � preciso antes obter um ponteiro para este objeto atrav�s do m�todo FindChildObject
, conforme o exemplo a seguir.

    SmVR_CGeometricObject *temp;
    temp = RootObject->FindChildObject("Cubo");


Copie este trecho de c�digo para o in�cio da fun��o void specialFunc (int key, int x, int y) que trata os eventos de teclas especiais.

A seguir, � preciso aplicar a transforma��o desejada, utilizando o ponteiro para o objeto e um dos m�todos de transforma��es geom�tricas dispon�veis na SmallVR.
 
        case GLUT_KEY_RIGHT:
            temp->RotateBy(10, 0,1,0);
            glutPostRedisplay(); // for�a o redesenho da tela
            break;

Veja na tabela a seguir as outras transforam��es geom�tricas dispon�veis na classe SmVR_CGeometricObject.

M�todo
Funcionalidade
ScaleBy(float ex, float ey, float ez) aplica uma escala (ex,ey,ez) no objeto usando o SCL do objeto
ScaleBy(SmVR_CPoint p) aplica uma escala no objeto usando o SCL do objeto. As componentes X,Y,Z do ponto 'p' definem os fatores de escala a serem aplicados
RotateBy(float angle, float ax, float ay, float az) aplica uma rota��o de "angle" graus ao redor do vetor definido por (ax,ay,az), no SCL do objeto
RotateBy(float angle, SmVR_CPoint p) aplica uma rota��o de "angle" graus ao redor do vetor definido por p, no SCL do objeto

As transla��es, por sua vez, s�o sempre aplicadas no sistema de coordenadas do pai do objeto, conforme a tabela abaixo.

M�todo
Funcionalidade
TranslateBy(float tx, float ty, float tz) aplica uma transla��o(tx,ty,tz) no objeto usando como refer�ncia o sistema de coodenadas do pai do objeto
TranslateBy(SmVR_CPoint p) aplica uma transla��o no objeto usando como refer�ncia o sistema de coodenadas do pai do objeto. O ponto P funciona como um vetor que define a transla��o

Veja na p�gina sobre a montagem de cen�rios, outros detalhes sobre as transforma��es geom�tricas dispon�veis na SmallVR.

Criando Novos Objetos

Adicione um novo objeto na cena colocando o trecho abaixo logo ap�s a cria��o do primeiro cubo.
Note que estamos utilizando a mesma rotina de desenho para os dois objetos.

    // Create a new object
    TestObject = new SmVR_CGeometricObject("Cubo2", DrawTest);
    // Add the object to the scene
    RootObject->AddChild(TestObject);




Para evitar a sobreposi��o dos dois objetos, aplique uma transla��o no segundo objeto criado, logo ap�s a chamada no m�todo AddChild.

    TestObject->TranslateBy(1.5,0,0);

Montando Hierarquia


Uma das funcionalidades mais �teis de um grafo de cena � a cria��o de hieraquias de objetos. Com este recurso � poss�vel fazer com que um objeto seja "filho" de outro e com isto o objeto filho acompanha todas as transforma��es do objeto "pai". O m�todo AddChild realiza esta opera��o.
No trecho a seguir, o objeto  "Cubo2" passa a ser filhos do objeto "Cubo" quando o usu�rio pressiona a tecla 'f'.

        case 'f':
            SmVR_CGeometricObject *filho;
            filho =  RootObject->FindChildObject("Cubo2");
            temp->AddChild(filho);
            break;

Copie este trecho de c�digo para a fun��o void keyboard ( unsigned char key, int x, int y ) e recompile seu programa.
Gire novamente o primeiro objeto e a qualquer momento pressione a tela 'f'. A seguir gire novamente o obejto.

Para fazer o segundo cubo deixar de ser filho do primeiro, adicione-o novamente ao RootObject. Coloque isto em outra tecla.

Carregando Objetos 3D


Remova o arquivo Cubo.cpp de seu projeto e adicione o arquivo LoadOBJ.cpp. Compile e rode seu programa. Deve aparecer um sof� no centro da janela.

Repita os testes realizados acima, aplicando transforma��es geom�tricas no objeto rec�m criado.

Experimente carregar outros objetos que est�o no diret�rio Objetos3D



FIM.