Funções para serem usadas no exercício de Lab Explicação mais Detalhada // Especifica a projeção perspectiva(angulo,aspecto,zMin,zMax) GLvoid gluPerspective( GLdouble fovy, GLdouble aspect, GLdouble nearClip, GLdouble farClip ) •Um Grande fovy é como olhar através de uma lente grande •Um pequeno fovy é como olhar através de um telescópio •O aspecto é a largura/altura do plano de projeção • Nome gluLookAt — define a viewing transformation • Especificação em C • void gluLookAt ( GLdouble eyeX , GLdouble eyeY , GLdouble eyeZ , GLdouble centerX , GLdouble centerY , GLdouble centerZ , GLdouble upX , GLdouble upY , GLdouble upZ ); • • • • Parametros eyeX, eyeY, eyeZ especificam a posição do observador CenterX, CenterY, CenterZ especificam a posição do alvo upX, upY, upZ especificam a direção da câmera • Description • gluLookAt cria uma matriz de visualização a partir de um visualizador em um ponto, um ponto de referência indicando um alvo na cena e um vetor indicando para onde a câmera está apontada. Objetos Pré-definidos no OpenGL • Nome: glutSolidSphere, glutWireSphere – renderiza uma esfera sólida ou wireframe • SYNTAX: void glutSolidSphere(GLdouble radius, GLint slices, GLint stacks); void glutWireSphere(GLdouble radius, GLint slices, GLint stacks); • ARGUMENTOS: radius -> raio da esfera; slices -> número de subdivisões em torno do eixo Z (similar a linhas de longiture); stacks -> númeero de subdivisões no eixo Z (similar a linhas de latitude). • DESCRIÇÃO: renderiza uma esfera no centro do sistema de coordenadas. Objetos Pré-definidos no OpenGL • NOME: glutSolidCube, glutWireCube – renderiza um cubo sólido ou wireframe • SYNTAX void glutSolidCube(GLdouble size); void glutWireCube(GLdouble size); • ARGUMENTS size largura do lado do cubo. Objetos Pré-definidos no OpenGL • NOME: glutSolidTorus, glutWireTorus – renderiza um sólido ou wireframe em forma de torus; • SYNTAX void glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint nsides, GLint rings); void glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint nsides, GLint rings); • ARGUMENTS innerRadius -> raio interno; outerRadius -> raio externo; nsides -> número de lados para cada raio; rings -> número de aneis Objetos Pré-definidos no OpenGL • NOME: glutSolidTorus, glutWireTorus – renderiza um sólido ou wireframe em forma de torus; • SYNTAX void glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint nsides, GLint rings); void glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint nsides, GLint rings); • ARGUMENTS innerRadius -> raio interno; outerRadius -> raio externo; nsides -> número de lados para cada raio; rings -> número de aneis Escopo das Transformações • glPushMatrix (void): Função utilizada para empilhar a matriz de transformação corrente; • glPopMatrix (void): Função utilizada para desempilhar a matriz de transformação corrente. Exercício 1 • Fazer um programa em OpenGL usando as funções de Transformações de Escopo. O programa deve conter o seguinte (Veja o Demo Na página da Disciplina): …. void Desenha() { //limpa a janela de visualização com cor de fundo definida previamente glClear(GL_COLOR_BUFFER_BIT); // empilha a matriz de tranformação corrente // translada e rotaciona // desenha um Torus, Cubo ou qualquer outro Objeto Geométrico Pré-definido na OpenGL // Desempilha a Matriz de Tranformação Corrente } Desenha (continuação..) // empilha a matriz de tranformação corrente // translada e rotaciona // desenha um Torus, Cubo ou qualquer outro Objeto Geométrico Pré-definido na OpenGL // Desempilha a Matriz de Tranformação Corrente // empilha a matriz de tranformação corrente // translada e rotaciona // desenha um Torus, Cubo ou qualquer outro Objeto Geométrico Pré-definido na OpenGL // Desempilha a Matriz de Tranformação Corrente // executa os comando OpenGL glFlush(); } Exercício 1 • Fazer um programa em OpenGL usando as funções de Transformações de Escopo. O programa deve conter o seguinte: void EspecificaParametrosVisualizacao(void) { // especifica sistema de coordenadas de projeção // inicializa sistema de coordenadas de projeção // Espeficica a Projeção perspectiva gluPerspective(45,fAspect,0.5,500); // Especifica sistema de coordenadas do modelo // Iniciaiza sistema de coordenadas no modelo gluLookAt(0,60,150,0,0,0,0,1,0); } Exercício 1 (continuação …) void AlteraTamanhoJanela (Glsizei w, GLSizei h) { if (h == 0) h = 1; // Especifica as dimensoes da ViewPort glViewPort(0, 0, w, h); // Calcula a correção do aspecto fAspect = (GLfloat) w/ (GLfloat) h; // Chama a funcao para definir parâmetros de Visualização EspecificaParametrosVisualizacao(); } void Teclado(unsigned char key, int x, int y) { // permite encerrar o programa caso seja apertada a tecla ESC if (key == 27) exit(0); } void Inicializa(void) { // define a cor corrente como preta glClearColor(1.0f, 1.0f, 1.0f,1.0f); } Exercício 1 (continuação …) void main (void) { Aqui é feita a programação padrão … } Exercício 2 • Fazer um programa que dê a idéia de um Sistema Solar, só que com apenas 1 Sol e 1 Planeta pelo menos (Veja o Demo na Página da Disciplina): // Funções que devem ter Desenha() // Para desenhas os sistema solar usando funções de Escopo de Transformações glPushMatrix e glPopMatrix para cada objeto que desenhar. Lembre-se que o Sol e os Planetas podem ser desenhados com objetos pré-definidos glutSolidSphere No final da função deve chamar a função glutSwapBuffers(); Exercício 2 void Reshape(int w, int h) { glViewPort(… glMatrixMode(… glLoadIdentity(… gluPerspective(60.0, (GLfloat) w/ (GLfloat) h, 1.0, 20.0); glMatrixMode(GL_MODEVIEW); glLoadIdentity(); gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); } KeyBoard() para rotacionar o planeta em torno do Sol e o Planeta em Torno dele mesmo Main()