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,
&centerx,&centery,&centerz, &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();
Download

DicasTrabRROGL - PUC-Rio