Trabalho de implementação 2
Autor: Eduarda | Publicado: 2011-05-23T17:06:00-07:00

Descrição O segundo trabalho de implementação da disciplina de Computação Gráfica tem como objetivo fixar os conhecimentos adquiridos sobre o pipeline de visualização do OpenGL. Conforme a especificação do trabalho, foram implementadas as matrizes de translação, rotação em torno dos eixos x, y e z e utilizando quaternion, model view e matriz de projeção.Implementação Durante o processo de desenvolvimento do pipeline, foi desenvolvido diversos métodos auxiliares, tais como:Normalização de vetor;Cross product;Dot product;Multiplicação de matrizes.Matriz de translação  Para realizar a translação dos objetos, foi implementado o método translation. O método recebe dois vetores como parametro, o primeiro contendo os valores que se deseja transladar o objeto e o outro com os valores do ponto que se deseja transladar. Para executar o método, inicialmente é instanciada uma matriz de translação que chamará o método para, depois, atualizar a matriz de visualização, conforme é apresentado a seguir.     matrix matTranslation;  matTranslation.translation(&amp;g_vLook,av);  matTranslation.translation(&amp;g_vUp,av);  matTranslation.translation( &amp;g_vEye,av );Void translation(vector &amp;vet){   vet.normalize();   float ux = vet.x;   float uy = vet.y;   float uz = vet.z;   m[0]=1.0f; m[4]=0.0f; m[8] =0.0f; m[12]=ux;   m[1]=0.0f; m[5]=1.0f; m[9] =0.0f; m[13]=uy;   m[2]=0.0f; m[6]=0.0f; m[10]=1.0f; m[14]=uz;   m[3]=0.0f; m[7]=0.0f; m[11]=0.0f; m[15]=1.0f; }Rotações Para realizar a rotação dos objetos, foram implementados quatro métodos distintos de rotação:Rotação sobre o eixo X;Rotação sobre o eixo Y;Rotação sobre o eixo Z;Quaternion. Para utilizar as matrizes de rotação, inicialmente é instanciada uma matriz de rotação que irá chamar o método de rotação. Depois de calculada a matriz de rotação, os novos valores atualizam os vetores Look Vector e Up Vector da Model View, conforme é apresentado a seguir.  matrix matRotation;  matRotation.rotateX( 1 );  matRotation.transformVector( &amp;g_vLook );  matRotation.transformVector( &amp;g_vUp );Rotação sobre o eixo X Foi implementado o método rotateX para se realizar uma rotação ao redor do eixo x. O método recebe como parâmetro o valor ângulo de rotação e atualiza a Model view, conforme é apresentado a seguir.Void rotateX(const float &amp;angle){ float s = sin(DEGTORAD(angle)); float c = cos(DEGTORAD(angle)); m[0]  = c; m[4] = 0; m[8] = s; m[12] = 0;  m[1]  = 0; m[5] = 1; m[9] = 0; m[13] = 0; m[2]  = -s; m[6] = 0; m[10]= c; m[14] = 0; m[3]  = 0; m[7] = 0; m[11]= 0; m[15] = 1;}Rotação sobre o eixo Y Foi implementado o método rotateY para se realizar uma rotação ao redor do eixo y. O método recebe como parâmetro o valor ângulo de rotação e atualiza a Model view, conforme é apresentado a seguir.Void rotateY(const float &amp;angle){ float s = sin(DEGTORAD(angle)); float c = cos(DEGTORAD(angle)); m[0]  = 1; m[4] = 0; m[8] = 0; m[12] = 0;  m[1]  = 0; m[5] = c; m[9] = -s; m[13] = 0; m[2]  = 0; m[6] = s; m[10]= c; m[14] = 0; m[3]  = 0; m[7] = 0; m[11]= 0; m[15] = 1;}Rotação sobre o eixo Z Foi implementado o método rotateZ para se realizar uma rotação ao redor do eixo z. O método recebe como parâmetro o valor ângulo de rotação e atualiza a Model view, conforme é apresentado a seguir.Void rotateZ(const float &amp;angle){ float s = sin(DEGTORAD(angle)); float c = cos(DEGTORAD(angle)); m[0]  = c; m[4] = -s; m[8] = 0; m[12] = 0;  m[1]  = s; m[5] = c; m[9] = 0; m[13] = 0; m[2]  = -s; m[6] = 0; m[10]= c; m[14] = 0; m[3]  = 0; m[7] = 0; m[11]= 0; m[15] = 1;}Quaternion Quaternions são utilizados para rotacionar objetos no espaço 3D. O método utiliza um quaternion puro para realizar a rotação. O método recebe como parâmetro um vetor e, após o cálculo,  atualiza a Model view, conforme é apresentado a seguir.Void quaternion(vector3f &amp;vet){ float ax = vet.x; float ay = vet.y; float az = vet.z; float x2 = ax*ax; float y2 = ay*ay; float z2 = az*az; float xy = ax*ay; float xz = ax*az; float yz = ay*az; m[0]=1 -2*y2 - 2*z2; m[4]=2 * xy;    m[8] =2 * xz;   m[12]=0.0f; m[1]=2 * xy;   m[5]=1 -2*x2 - 2*z2; m[9] =2 * yz;   m[13]=0.0f; m[2]=2 * xz;   m[6]=2 * yz;    m[10]=1 -2*x2 - 2*y2; m[14]=0.0f; m[3]=0.0f;    m[7]=0.0f;     m[11]=0.0f;   m[15]=1.0f;}Resultados O programa foi desenvolvido de modo que apresentasse os resultados do pipeline utilizando o OpenGL e Close2GL. Close2GL implementa as matrizes do OpenGL. Inicialmente, devesse buscar o arquivo que contém as imagens a serem renderizadas, conforme é apresentado a seguir. Depois de carregado o arquivo, as imagens são projetadas nas duas janelas utilizando os seus respectivos métodos. Depois de carregadas as imagens, é possível testar os métodos implementados, podendo comparar os resultados das duas implementações.Rotação A seguir, são apresentados os resultados da implementação dos métodos de rotação sobre os eixos, rotação de 90 graus, utilizando o OpenGL e o Close2GL.Rotação sobre o eixo X Rotação sobre o eixo YRotação sobre o eixo ZTranslação  A seguir, são apresentados os resultados para a translação em 10, em relaçao a y e z e -10 em relação a x.Translação de -10 em XTranslação de 10 em YTranslação de 10 em ZVisualização Os objetos podem ser visualizados utilizando wireframes, pontos e totalmente cobertos, conforme apresentado a seguir.Totalmente cobertosUsando pontosBackface Culling É possível fazer backface culling utilizando CW e CCW, conforme é apresentado a seguir.Imagem sem backface cullingImagem utilizando CWImagem utilizando CCWHfov e Lfov  Nas imagens a seguir, foram modificados os valores de Hfov e Lfov.        Conclusão O segundo trabalho de implementação foi muito importante, pois com ele foi possível verificar como funciona as matrizes do OpenGL. Durante a implementação do trabalho, encontrei muitas dificuldades para a implementação das matrizes Model View e Projection. O mais complicado da implementação foi centralizar a imagem. Por não ter as facilidades dos métodos do OpenGL, demorei muito tempo para projetar a imagem. As matrizes de rotação, translação, backface e projeção das duas janelas foram mais fáceis de serem implementadas.