Trabalho 3 Navegador de cenas com openGL e rastreamento de raios Objetivos • Mudar o programa do trabalho 2 para renderizar utilizando o OpenGL (o TAD zbuffer dá uma dica de como fazer isto). • Colocar na interface IUP um botão que quando acionado re-calcula a cor de cada pixel da tela através do algoritmo de Rastreamento de Raios. • Mudar a interface do programa para aceitar comandos de movimentação de câmera a partir do teclado segundo o seu modelo preferido de comando de jogos. Espaço de coordenadas Detalhes da implementação Inicializando o OpenGL • Habilita o teste de profundidade glEnable (GL_DEPTH_TEST); • Menor z signfica mais próximo glDepthFunc (GL_LESS); • Ativa os cálculos de iluminação glEnable (GL_LIGHTING); • Posição do observador: local ou no infinito A localização do observador pode ou não influenciar no cálculo da iluminação. O default é o observador no infinito. Para mudar a configuração, considerando-se a iluminação conforme o observador utilize: glLightModeli (GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); Esta função modifica o cálculo dos ângulos de reflexão especular. • Suaviza as diferenças de cores entre os objetos glShadeModel (GL_SMOOTH); • Normaliza os vetores normais antes de utilizá-los glEnable (GL_NORMALIZE); • Limpa o buffer de profundidade glClear (GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT ); Define a matriz de projeção glMatrixMode(GL_PROJECTION); glLoadIdentity(); glViewport(0,0,winW,winH); /* mapeamento */ camGetOGLPerspective (camera, &fovy, &aspect, &zNear, &zFar); /* pega os parâmetros da cena */ gluPerspective (fovy, aspect, zNear, zFar); /* Permite definir uma perspectiva equivalente a glFrustum */ /* aspect = largura / altura */ Viewport – transformação de mapeamento glViewport (x, y, width, height); GLUT & IUP: • A função default de “resize” define a viewport como sendo a área total do canvas. Define a matriz do modelo e da transformação para a câmera glMatrixMode (GL_MODELVIEW); glLoadIdentity(); camGetOGLLookAt(camera, &eyex,&eyey,&eyez, ¢erx,¢ery,¢erz, &upx,&upy,&upz); gluLookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz); /* gera a matriz de view */ Define as luzes no sistema de eixos dos modelos globais for( i = 0; i < numberOfLights; ++i ) { Light light = sceGetLight( scene, i ); Vector lightPosition = lightGetPosition(light); Color lightColor = lightGetColor(light); Color ambientLight = sceGetAmbientLight(scene); float tmp[4]; colorGetOGLVector(ambientLight,tmp); glLightfv(GL_LIGHT0+i, GL_AMBIENT, tmp); /* Define parâmetros de uma determinada luz. */ colorGetOGLVector(lightColor,tmp); glLightfv(GL_LIGHT0+i, GL_DIFFUSE, tmp); glLightfv(GL_LIGHT0+i, GL_SPECULAR,tmp); algGetOGLVector(lightPosition,tmp); glLightfv(GL_LIGHT0+i, GL_POSITION,tmp); glEnable(GL_LIGHT0+i); } Desenha os objetos for (i=0;i < numberOfObjects; i++ ) { Object object = sceGetObject(scene,i); Material material = sceGetMaterial(scene,objGetMaterial(object)); Color diffuseColor = matGetDiffuse(material, algVector(0,0,0,1)); Color specularColor = matGetSpecular(material); double specularExpoent = matGetSpecularExponent(material); float tmp[4],zero[]={0.0,0.0,0.0,1.0}; colorGetOGLVector(diffuseColor,tmp); glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, tmp); colorGetOGLVector(specularColor,tmp); glMaterialfv(GL_FRONT, GL_SPECULAR, tmp); /especifica as propriedades de um material/ glMaterialf(GL_FRONT, GL_SHININESS, specularExpoent ); glMaterialfv(GL_FRONT, GL_EMISSION, zero); glColor4f(1.0f,1.0f,1.0f,material->opacityFactor); /* Transparência – Pode ser feita aqui */ glPushMatrix(); objDraw(object); glPopMatrix(); } Pilha de matrizes • void glPushMatrix(void); Faz o empilhamento do estado atual do objeto na pilha. A pilha corrente é determinada pelo comando glMatrixMode(). • void glPopMatrix(void); Desempilha o topo da pilha, destruindo o conteudo retirado da matriz. A pilha corrente é determinada por glMatrixMode(). … glMatrixMode(GL_MODELVIEW); glLoadIdentity( ); glPushMatrix( ); // duplica topo glRotate(30,0,0,1); glTranslate(10,0,0); draw_object_1( ); glPopMatrix( ); // restaura estado ... Transparência if(object->blend) { glEnable(GL_BLEND); // Liga o Blending glDisable(GL_DEPTH_TEST); // Desliga o teste de profundidade } else { glDisable(GL_BLEND); // Desliga o Blending glEnable(GL_DEPTH_TEST); // Liga o teste deprofundiade } Tipos de primitivas gráficas do OpenGL Especificação de primitivas glBegin(tipo_de_prim); …define atributo de vértice …define vértice glEnd( ); DrawObject • Esfera glutSolidSphere(radius, slices, stacks); • Cubo seqüência de QUADS • Triângulo glBegin(GL_TRIANGLES); glNormal3f( normal.x,normal.y,normal.z); /* normal unitária */ glVertex3f(vertice1.x, vertice1.y, vertice1.z); glVertex3f(vertice2.x, vertice2.y, vertice2.z); glVertex3f(vertice3.x, vertice3.y, vertice3.z); glEnd();