41
Hugo Siqueira (hlfs) Hugo Siqueira (hlfs) Lauro Mafra Lauro Mafra Rafael Correa Rafael Correa Rosana Silva Matos (rsm2) Rosana Silva Matos (rsm2)

Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

Embed Size (px)

Citation preview

Page 1: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

Hugo Siqueira (hlfs)Hugo Siqueira (hlfs)Lauro MafraLauro MafraRafael CorreaRafael CorreaRosana Silva Matos (rsm2)Rosana Silva Matos (rsm2)

Page 2: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

RoteiroRoteiro

O que é OpenGLO que é OpenGLGLUTGLUTConfigurando GLUTConfigurando GLUTPrimitivas GeométricasPrimitivas GeométricasCoresCoresTransformações Geométricas Transformações Geométricas IluminaçãoIluminaçãoReferênciasReferências

Page 3: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

O que é OpenGLO que é OpenGL

Open Graphics LibraryOpen Graphics LibraryAPI para renderização gráfica 3D API para renderização gráfica 3D Adotado por diversas plataformas de hardware Adotado por diversas plataformas de hardware (microcomputadores, estações de trabalho,computadores de médio (microcomputadores, estações de trabalho,computadores de médio e grande porte)e grande porte)Bem como em diversos sistemas operacionais como Windows, Bem como em diversos sistemas operacionais como Windows, Linux, entre outrosLinux, entre outrosAmplamente utilizada no desenvolvimento de vários tipos de Amplamente utilizada no desenvolvimento de vários tipos de aplicações aplicações

facilidade de aprendizado, fornece estabilidade das rotinas e facilidade de aprendizado, fornece estabilidade das rotinas e

possui resultados visuais consistentespossui resultados visuais consistentes As aplicações que mais utilizam OpenGL têm sido as de jogos, As aplicações que mais utilizam OpenGL têm sido as de jogos,

científicas e comerciaiscientíficas e comerciais

Page 4: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

O que é OpenGLO que é OpenGL

Pode ser visto como uma máquina de estadosPode ser visto como uma máquina de estados

mantém as variáveis de estadomantém as variáveis de estado Cor, visualização e transformações correntesCor, visualização e transformações correntes Padrões de tracejado de linhas e polígonosPadrões de tracejado de linhas e polígonos Modos de desenho de polígonosModos de desenho de polígonos Convenções de empacotamento de pixel [pixel packing]Convenções de empacotamento de pixel [pixel packing] Posições e características de luzesPosições e características de luzes Propriedades do material dos objetos que estão sendo desenhadosPropriedades do material dos objetos que estão sendo desenhados

Cada variável de estado possui um valor default que pode ser lido e/ou Cada variável de estado possui um valor default que pode ser lido e/ou alteradoalterado

Algumas variáveis de estado podem ser habilitadas ou desabilitadasAlgumas variáveis de estado podem ser habilitadas ou desabilitadas

Page 5: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

GLUTGLUT

OpenGL Utility ToolkitOpenGL Utility Toolkit Sistema de Janelas independente de plataforma para desenvolvimento Sistema de Janelas independente de plataforma para desenvolvimento

de aplicações OpenGLde aplicações OpenGL Possui funções para:Possui funções para:

Criar/Destruir janelasCriar/Destruir janelas

Tratar entradas de teclado, mouse e joysticksTratar entradas de teclado, mouse e joysticks

Baseado em funções de callback para tratamento de eventosBaseado em funções de callback para tratamento de eventos

API simples, não possuindo recursos diretos para criação de GUI'sAPI simples, não possuindo recursos diretos para criação de GUI's

GLUT é um projeto descontinuadoGLUT é um projeto descontinuado Aplicações devem utilizar o FreeGLUT ou OpenGLUT, versões open Aplicações devem utilizar o FreeGLUT ou OpenGLUT, versões open

source e com muitos bugs do GLUT corrigidossource e com muitos bugs do GLUT corrigidos

Page 6: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

Configurando GLUTConfigurando GLUTWindows já possui uma implementação do OpenGLWindows já possui uma implementação do OpenGLNecessário utilizar um sistema de janelas no desenvolvimento das Necessário utilizar um sistema de janelas no desenvolvimento das aplicaçõesaplicações

GLUTGLUT Baixar o GLUT em:Baixar o GLUT em:

http://www.cin.ufpe.br/~rsm2/GLUT.rarhttp://www.cin.ufpe.br/~rsm2/GLUT.rar

Descompactar o GLUT.rar em algum diretórioDescompactar o GLUT.rar em algum diretório C:\Temp\C:\Temp\

Após descompactar, definir os diretórios de include e library no Visual Após descompactar, definir os diretórios de include e library no Visual StudioStudioPara definir tais diretórios, deve-se seguir:Para definir tais diretórios, deve-se seguir:

Menu Tools -> OptionsMenu Tools -> Options Selecionar Projects -> VC++ DirectoriesSelecionar Projects -> VC++ Directories

Page 7: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)
Page 8: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

Configurando GLUTConfigurando GLUT

Para o diretório de include:Para o diretório de include: Selecionar a opção Include filesSelecionar a opção Include files Clicar no ícone do diretório e indicar o diretório include que se encontra Clicar no ícone do diretório e indicar o diretório include que se encontra

abaixo do diretório GLUT, previamente descompactadoabaixo do diretório GLUT, previamente descompactadoPara o diretório de libraries:Para o diretório de libraries:

Selecionar a opção Library filesSelecionar a opção Library files Clicar no ícone do diretório e indicar o diretório lib que se encontra Clicar no ícone do diretório e indicar o diretório lib que se encontra

abaixo do diretório GLUT, previamente descompactadoabaixo do diretório GLUT, previamente descompactadoApós definir os diretórios de include e library, clicar em OKApós definir os diretórios de include e library, clicar em OKGLUT já está devidamente configurado para o desenvolvimento de GLUT já está devidamente configurado para o desenvolvimento de aplicações OpenGL com sistema de janelasaplicações OpenGL com sistema de janelas

Page 9: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)
Page 10: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)
Page 11: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)
Page 12: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

Criando uma aplicação Criando uma aplicação

Criando um projetoCriando um projeto

No menu File -> New -> Project...No menu File -> New -> Project... Escolher Visual C++ Projects -> Win32 -> Win32 -> Console ProjectEscolher Visual C++ Projects -> Win32 -> Win32 -> Console Project Selecionar o nome do projeto, por exemplo,OpenGL CubeSelecionar o nome do projeto, por exemplo,OpenGL Cube Selecionar o nome da solução, por exemplo, OpenGL AppsSelecionar o nome da solução, por exemplo, OpenGL Apps Selecionar o caminho do projeto, por exemplo, C:\Selecionar o caminho do projeto, por exemplo, C:\ Clicar em OKClicar em OK Clicar em Application Setings -> Empty, para criar um projeto vazioClicar em Application Setings -> Empty, para criar um projeto vazio Clicar em FinishClicar em Finish

Page 13: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)
Page 14: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)
Page 15: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)
Page 16: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

Configurando GLUTConfigurando GLUT

Após a criação do projeto, é necessário copiar o arquivo glut32.dll e o Após a criação do projeto, é necessário copiar o arquivo glut32.dll e o freeglut.dll para a pasta do projetofreeglut.dll para a pasta do projeto

baixar em baixar em http://www.cin.ufpe.br/~rsm2/glut2.rarhttp://www.cin.ufpe.br/~rsm2/glut2.rar

Adicionar um arquivo que conterá a função main e o código da Adicionar um arquivo que conterá a função main e o código da aplicação OpenGLaplicação OpenGL

Clicar na pasta de fontes do projeto com o botão direito e seleciona Add Clicar na pasta de fontes do projeto com o botão direito e seleciona Add -> Add New Item...-> Add New Item...

Selecionar a opção C++ File (.cpp) e fornecer o nome do arquivoSelecionar a opção C++ File (.cpp) e fornecer o nome do arquivo

Clicar em Open e o arquivo criado será aberto no editorClicar em Open e o arquivo criado será aberto no editor

Page 17: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)
Page 18: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)
Page 19: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

Primitivas GeométricasPrimitivas Geométricas

OpenGL conta com 10 primitivas geométricas, sendo divididas da seguinte forma:OpenGL conta com 10 primitivas geométricas, sendo divididas da seguinte forma:

um tipo de pontoum tipo de ponto três tipos de linhastrês tipos de linhas seis tipos de polígonosseis tipos de polígonos

Os vértices são definidos pelo comando VertexOs vértices são definidos pelo comando Vertex glVertex2f( float x, float y);glVertex2f( float x, float y); // vértice para um eixo 2D // vértice para um eixo 2D glVertex3d(double x,double y, double z); // vértice para um eixo 3DglVertex3d(double x,double y, double z); // vértice para um eixo 3D

As primitivas precisam ser delimitadas através de Begin ... End conforme abaixo:As primitivas precisam ser delimitadas através de Begin ... End conforme abaixo: Begin ( nome da primitiva);Begin ( nome da primitiva);

... // aqui serão colocados comandos Vertex.... // aqui serão colocados comandos Vertex. End (void);End (void);

Page 20: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

Primitivas GeométricasPrimitivas Geométricas

PontoPonto a primitiva responsável em desenhar pontos na tela é GL_POINTSa primitiva responsável em desenhar pontos na tela é GL_POINTS O código no exemplo abaixo desenha 3 pontos na tela. Cada vértice O código no exemplo abaixo desenha 3 pontos na tela. Cada vértice

torna-se um pontotorna-se um ponto

glBegin( GL_POINTS );glBegin( GL_POINTS );

glVertex2f( xf, yf); glVertex2f( xf, yf);

glVertex2f( xf, yf); glVertex2f( xf, yf);

glVertex2f( xf, yglVertex2f( xf, y f); f);

glEnd(); glEnd();

Page 21: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

Primitivas GeométricasPrimitivas Geométricas

LinhasLinhas GL_LINES --> No caso de serem colocados números ímpares de GL_LINES --> No caso de serem colocados números ímpares de

vértices, o último é ignoradovértices, o último é ignorado

Se houvesse um quarto vértice, uma nova linha entre o terceiro e Se houvesse um quarto vértice, uma nova linha entre o terceiro e quarto vértice seria exibidaquarto vértice seria exibida

GL_LINE_STRIP --> cria linhas consecutivas, ligando o primeiro vértice GL_LINE_STRIP --> cria linhas consecutivas, ligando o primeiro vértice com o segundo, o segundo com o terceiro e assim por diantecom o segundo, o segundo com o terceiro e assim por diante

GL_LINE_LOOP --> Funciona de maneira semelhante ao anterior, GL_LINE_LOOP --> Funciona de maneira semelhante ao anterior, porém o último vértice é ligado a primeira, devido a isso o LOOP no seu porém o último vértice é ligado a primeira, devido a isso o LOOP no seu nome. O espessura de uma linha pode ser modificada através do nome. O espessura de uma linha pode ser modificada através do comando glLineWidth (GLint espessura), bastando passar como comando glLineWidth (GLint espessura), bastando passar como parâmetro a espessura da linhaparâmetro a espessura da linha

Page 22: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

Primitivas GeométricasPrimitivas Geométricas

PolígonosPolígonos Áreas formadas por várias linhas conectadas Arestas do polígono não podem se cruzar Devem ser áreas convexas O número de segmentos do polígono não é restrito OpenGL assume que todos os polígonos são simples

Problema da superfície construída a partir de quadriláteros Quadriláteros são polígonos não planares Caso seja feita alguma transformação, podem deixar de

ser polígonos simples Para evitar que isto aconteça, é sempre bom utilizar

triângulos para compor as superfícies, pois triângulos são

sempre co-planares

Page 23: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

Primitivas GeométricasPrimitivas Geométricas

PolígonosPolígonos GL_POLYGON --> Desenha polígonos convexos de acordo com as GL_POLYGON --> Desenha polígonos convexos de acordo com as

especificações das coordenadas.especificações das coordenadas. É semelhante ao LINE_LOOP no fato de ligar a última coordenada É semelhante ao LINE_LOOP no fato de ligar a última coordenada a primeiraa primeira

GL_TRIANGLE_STRIP --> Desenha uma série de triângulos que são GL_TRIANGLE_STRIP --> Desenha uma série de triângulos que são conectados uns aos outros ao longo dos lados que podem ser conectados uns aos outros ao longo dos lados que podem ser compartilhadoscompartilhados

GL_TRIANGLE_FAN --> Funciona de forma semelhante ao anterior , GL_TRIANGLE_FAN --> Funciona de forma semelhante ao anterior , mas os triângulos criados possuem a mesma origemmas os triângulos criados possuem a mesma origem

GL_TRIANGLES --> Gera como resultado triângulos independentes. GL_TRIANGLES --> Gera como resultado triângulos independentes. Ela ignora os dois últimos vértices, pois cinco vértices não formam dois Ela ignora os dois últimos vértices, pois cinco vértices não formam dois triângulos independentestriângulos independentes

GL_QUAD_STRIP --> Desenha uma série de quadriláteros entre os GL_QUAD_STRIP --> Desenha uma série de quadriláteros entre os lados compartilhadoslados compartilhados

GL_QUADS --> Desenha quadriláteros independentes. Ela ignora os GL_QUADS --> Desenha quadriláteros independentes. Ela ignora os dois últimos vértices, pois 6 vértices não formam dois quadriláteros dois últimos vértices, pois 6 vértices não formam dois quadriláteros independentesindependentes

Page 24: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

CoresCoresAs cores em OpenGL são determinadas pelo comando ColorAs cores em OpenGL são determinadas pelo comando Color

Seguem o padrão RGB (Red Green Blue) adotados em diversos sistemasSeguem o padrão RGB (Red Green Blue) adotados em diversos sistemas

Em OpenGL: Em OpenGL:

Color3 {f,d} ( XRed, XGreen, XBlue), onde :Color3 {f,d} ( XRed, XGreen, XBlue), onde :

XRed: porcentagem de vermelho (variando de 0.0 a 1.0)XRed: porcentagem de vermelho (variando de 0.0 a 1.0) XGreen: porcentagem de verde (variando de 0.0 a 1.0)XGreen: porcentagem de verde (variando de 0.0 a 1.0) XBlue: porcentagem de azul (variando de 0.0 a 1.0)XBlue: porcentagem de azul (variando de 0.0 a 1.0)

Page 25: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

Exercício Exercício

Criar um cubo colorido, usando Criar um cubo colorido, usando GL_QUADS e GL_TRIANGLES cujo GL_QUADS e GL_TRIANGLES cujo centro encontra-se na origem e possui centro encontra-se na origem e possui lado igual a 2flado igual a 2f

Page 26: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

Transformações GeométricasTransformações Geométricas

Em muitas aplicações de computação gráfica, há a necessidade de alterar Em muitas aplicações de computação gráfica, há a necessidade de alterar e manipular o conteúdo de uma cenae manipular o conteúdo de uma cena

Animações, por exemplo, são produzidas pelo movimento da câmera ou Animações, por exemplo, são produzidas pelo movimento da câmera ou dos objetos presentes na cenados objetos presentes na cena

Mudanças em orientação, tamanho e formato estão ligadas às Mudanças em orientação, tamanho e formato estão ligadas às transformações geométricastransformações geométricas

São cumulativas, ou seja, podem ser aplicadas umas sobre as outrasSão cumulativas, ou seja, podem ser aplicadas umas sobre as outras

Uma transformação geométrica de OpenGL é armazenada internamente Uma transformação geométrica de OpenGL é armazenada internamente em uma matrizem uma matriz

A cada tranformação esta matriz é alterada e usada para desenhar os A cada tranformação esta matriz é alterada e usada para desenhar os objeto a partir daquele momento, até que seja novamente alteradaobjeto a partir daquele momento, até que seja novamente alterada

Page 27: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

Transformações GeométricasTransformações Geométricas

TranslaçãoTranslação

Quando aplicada a um objeto, reposiciona o mesmo mudando suas Quando aplicada a um objeto, reposiciona o mesmo mudando suas coordenadas (x,y,z) no espaço tridimensional, por fatores Tx, Ty e Tz, coordenadas (x,y,z) no espaço tridimensional, por fatores Tx, Ty e Tz, respectivamente. Dessa forma, considerando, inicialmente, um objeto respectivamente. Dessa forma, considerando, inicialmente, um objeto com coordenadas espaciais (x,y,z), sua nova posição (x',y',z') após uma com coordenadas espaciais (x,y,z), sua nova posição (x',y',z') após uma operação de translação será: operação de translação será:

x‘ = x + Tx x‘ = x + Tx

y‘ = y + Ty y‘ = y + Ty

z‘ = z + Tz z‘ = z + Tz

Page 28: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

Transformações GeométricasTransformações Geométricas

• TranslaçãoTranslação

Em OpenGL:Em OpenGL: Translate {f,d} ( Tx, Ty, Tz ), onde:Translate {f,d} ( Tx, Ty, Tz ), onde:

Tx: é o quanto se quer transladar o objeto em relação ao eixo X Tx: é o quanto se quer transladar o objeto em relação ao eixo X Ty: é o quanto se quer transladar o objeto em relação ao eixo YTy: é o quanto se quer transladar o objeto em relação ao eixo Y Tz: é o quanto se quer transladar o objeto em relação ao eixo ZTz: é o quanto se quer transladar o objeto em relação ao eixo Z

exemplo:exemplo: glTranslatef(xf, yf, zf); glTranslatef(xf, yf, zf);

glBegin(GL_POLYGON); glBegin(GL_POLYGON); glVertex2f( xf, yf); glVertex2f( xf, yf); glVertex2f( xf, yf); glVertex2f( xf, yf); glVertex2f( xf, yf); glVertex2f( xf, yf);

glEnd(); glEnd();

Page 29: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

Transformações GeométricasTransformações Geométricas

RotaçãoRotação Rotacionar um objeto significa girar o mesmo em torno de um eixo de Rotacionar um objeto significa girar o mesmo em torno de um eixo de

acordo com determinado ânguloacordo com determinado ângulo

Em OpenGL:Em OpenGL: Rotate {f,d} (Angulo, x, y, z ), onde:Rotate {f,d} (Angulo, x, y, z ), onde: Angulo -> é o angulo de rotaçãoAngulo -> é o angulo de rotação

x,y,z -> definem o eixo onde o objeto será rotacionadox,y,z -> definem o eixo onde o objeto será rotacionado

exemplo:exemplo: glRotatef(45.0f,0.0f,0.0f,1.0f);// roda 45 graus no eixo z glRotatef(45.0f,0.0f,0.0f,1.0f);// roda 45 graus no eixo z

glBegin(GL_POLYGON); glBegin(GL_POLYGON); glVertex2f( xf, yf); glVertex2f( xf, yf); glVertex2f( xf, yf); glVertex2f( xf, yf);

glVertex2f( xf, yf); glVertex2f( xf, yf); glEnd();glEnd();

Page 30: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

Transformações GeométricasTransformações GeométricasEscalaEscala

O escalamento altera o tamanho dos objetos, multiplicando as O escalamento altera o tamanho dos objetos, multiplicando as coordenadas (x,y,z,) usadas para defini-los, por fatores Sx, Sy e Sz, coordenadas (x,y,z,) usadas para defini-los, por fatores Sx, Sy e Sz, respectivamente. Supondo, por exemplo, um vértice de um polígono respectivamente. Supondo, por exemplo, um vértice de um polígono definido pelas coordenadas (x,y,z), as novas coordenadas (x',y',z') definido pelas coordenadas (x,y,z), as novas coordenadas (x',y',z') deste vérticedeste vértice

após uma operação de escalamento seria: após uma operação de escalamento seria: x‘ = x.sx x‘ = x.sx y‘ = y.sy y‘ = y.sy z‘ = z.sz z‘ = z.sz

Os fatores Sx, Sy e Sz podem assumir quaisquer valores positivos, Os fatores Sx, Sy e Sz podem assumir quaisquer valores positivos, sendo que para valores menores que 1, o tamanho do objeto é sendo que para valores menores que 1, o tamanho do objeto é reduzido, para valores maiores que 1, o aumenta-se o tamanho do reduzido, para valores maiores que 1, o aumenta-se o tamanho do objeto e para valores iguais a 1, o tamanho original do objeto é mantidoobjeto e para valores iguais a 1, o tamanho original do objeto é mantido

Page 31: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

Transformações GeométricasTransformações Geométricas

EscalaEscala Em OpenGL:Em OpenGL:

Scale {f,d} ( Sx, Sy,Sz ), onde:Scale {f,d} ( Sx, Sy,Sz ), onde: Sx: é o fator de escala em relação a X.Sx: é o fator de escala em relação a X. Sy: é o fator de escala em relação a Y.Sy: é o fator de escala em relação a Y. Sz: é o fator de escala em relação a Z.Sz: é o fator de escala em relação a Z.

exemplo:exemplo:

glScalef(1.0f,1.3f,1.0f); // aumenta o tamanho do objeto numa glScalef(1.0f,1.3f,1.0f); // aumenta o tamanho do objeto numa escala escala // de 1.3 em relação a Y// de 1.3 em relação a Y glBegin(GL_POLYGON); glBegin(GL_POLYGON); glVertex2f( xf, yf); glVertex2f( xf, yf); glVertex2f(xf, yf); glVertex2f(xf, yf); glVertex2f(xf, yf); glVertex2f(xf, yf);

glEnd(); glEnd();

Page 32: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

Exercício Exercício

Alterar o comportamento do cubo fazendo Alterar o comportamento do cubo fazendo com que ele se movimente no sentido com que ele se movimente no sentido positivo e negativo do eixo z quando positivo e negativo do eixo z quando forem pressionadas as teclas : seta para forem pressionadas as teclas : seta para cima e seta para baixo.cima e seta para baixo.

Page 33: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

IluminaçãoIluminaçãoEm OpenGL a cor de uma fonte de luz é caracterizada pela Em OpenGL a cor de uma fonte de luz é caracterizada pela quantidade de vermelho (R), verde (G) e azul (B) que ela emitequantidade de vermelho (R), verde (G) e azul (B) que ela emite

E o material de uma superfície é caracterizado pela porcentagem E o material de uma superfície é caracterizado pela porcentagem dos componentes R, G e B que chegam e são refletidos em várias dos componentes R, G e B que chegam e são refletidos em várias direções direções

No modelo de iluminação a luz em uma cena vem de várias fontes No modelo de iluminação a luz em uma cena vem de várias fontes de luz que podem ser "ligadas" ou "desligadas" individualmente de luz que podem ser "ligadas" ou "desligadas" individualmente

No modelo de iluminação OpenGL a fonte de luz tem efeito No modelo de iluminação OpenGL a fonte de luz tem efeito somente quando existem superfícies que absorvem e refletem luzsomente quando existem superfícies que absorvem e refletem luz

Assume-se que cada superfície é composta de um material com Assume-se que cada superfície é composta de um material com várias propriedadesvárias propriedades

O material pode emitir luz, refletir parte da luz incidente em todas as O material pode emitir luz, refletir parte da luz incidente em todas as direções, ou refletir uma parte da luz incidente numa única direçãodireções, ou refletir uma parte da luz incidente numa única direção

Page 34: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

IluminaçãoIluminaçãoPara sintetizarmos imagens realistas, precisamos saber a quantidade de luz Para sintetizarmos imagens realistas, precisamos saber a quantidade de luz associada a um ponto qualquer, na face de um objeto a respeito do qual associada a um ponto qualquer, na face de um objeto a respeito do qual queremos gerar a imagemqueremos gerar a imagemEm OpenGL, criamos um modelo de iluminação definindo as características das Em OpenGL, criamos um modelo de iluminação definindo as características das fontes de luz e as propriedades do material do objeto. Aqui veremos três:fontes de luz e as propriedades do material do objeto. Aqui veremos três:

AmbienteAmbiente: resultado da luz refletida no ambiente; é uma luz que vem de todas as : resultado da luz refletida no ambiente; é uma luz que vem de todas as direçõesdireções

DifusaDifusa: luz que vem de uma direção, atinge a superfície e é refletida em todas as : luz que vem de uma direção, atinge a superfície e é refletida em todas as direções; assim, parece possuir o mesmo brilho independente de onde a câmera está direções; assim, parece possuir o mesmo brilho independente de onde a câmera está posicionada; posicionada;

EspecularEspecular: luz que vem de uma direção e tende a ser refletida numa única direção; : luz que vem de uma direção e tende a ser refletida numa única direção;

Basicamente existem dois comandos que serão utilizados na criação de um Basicamente existem dois comandos que serão utilizados na criação de um modelo de iluminação: modelo de iluminação:

LightLight: define as características da fonte de luz: define as características da fonte de luz MaterialMaterial: define as propriedades do material do objeto: define as propriedades do material do objeto

Page 35: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

IluminaçãoIluminação

LightLightglLightfv ( source , parameter , pointer_to_array) glLightfv ( source , parameter , pointer_to_array)

glLightf ( source , parameter , value)glLightf ( source , parameter , value)

A diferença entre as duas está nos parâmetro parameter. Alguns A diferença entre as duas está nos parâmetro parameter. Alguns exigem seus atributos como um ponteiro para um vetor e outros exigem seus atributos como um ponteiro para um vetor e outros exigem um valorexigem um valorsource -> indica qual a fonte de luz que está sendo definidasource -> indica qual a fonte de luz que está sendo definidaEm OpenGL é possível definir até 8 fontes de luzes distintas:Em OpenGL é possível definir até 8 fontes de luzes distintas:

GL_LIGHT0GL_LIGHT0 GL_LIGHT1GL_LIGHT1 ...... GL_LIGHTn >> n máximo = 7GL_LIGHTn >> n máximo = 7

parameter -> especifica as características da fonte de luzparameter -> especifica as características da fonte de luzpointer_to_array -> significa os atributos referentes a característicaspointer_to_array -> significa os atributos referentes a características

Page 36: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

IluminaçãoIluminação

MaterialMaterialglMaterialfv(face, type, pointer_to_array) ; ou glMaterialfv(face, type, pointer_to_array) ; ou

glMaterialf ( face, type, value); onde:glMaterialf ( face, type, value); onde:

face: indica quais as faces (face frontal, face de trás ou ambas)face: indica quais as faces (face frontal, face de trás ou ambas)

type: indica qual propriedade será configuradatype: indica qual propriedade será configurada

pointer_to_array: indica os atributos referentes a propriedadepointer_to_array: indica os atributos referentes a propriedade

Value: atributo referente ao tipo Value: atributo referente ao tipo

As faces podem ser especificadas pelas constantes:As faces podem ser especificadas pelas constantes:

GL_FRONT: somente as faces da frenteGL_FRONT: somente as faces da frenteGL_BACK : somente as faces de trás GL_BACK : somente as faces de trás GL_FRONT_AND_BACK : ambasGL_FRONT_AND_BACK : ambas

Page 37: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

IluminaçãoIluminação

Luz AmbienteLuz Ambiente

ilumina todas as faces do objeto de maneira uniformeilumina todas as faces do objeto de maneira uniforme

Em OpenGL:Em OpenGL:

GLfloat luz_ambiente[] = { XR, XG, XB, X } GLfloat luz_ambiente[] = { XR, XG, XB, X } GLfloat objeto_ambiente[] = { YR, YG, YB, Y}GLfloat objeto_ambiente[] = { YR, YG, YB, Y} glLightfv(GL_LIGHT0, GL_AMBIENT, luz_ambiente)glLightfv(GL_LIGHT0, GL_AMBIENT, luz_ambiente) glMaterialf (GL_FRONT_AND_BACK, GL_AMBIENT,objeto_ambiente)glMaterialf (GL_FRONT_AND_BACK, GL_AMBIENT,objeto_ambiente) glEnable(GL_LIGHTING)glEnable(GL_LIGHTING) glEnable(GL_LIGHT0)glEnable(GL_LIGHT0)

Page 38: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

IluminaçãoIluminação

Reflexão DifusaReflexão Difusa

As faces onde os raios de luz incidem de maneira mais perpendicular As faces onde os raios de luz incidem de maneira mais perpendicular parecem mais brilhantes que aquelas nas quais a luz incide de maneira parecem mais brilhantes que aquelas nas quais a luz incide de maneira mais inclinadamais inclinada

Em OpenGL:Em OpenGL:

GLfloat luz_difusa[] = { XR, XG, XB, X }GLfloat luz_difusa[] = { XR, XG, XB, X } GLfloat objeto_difusa [] = { YR, YG, YB, Y}GLfloat objeto_difusa [] = { YR, YG, YB, Y} glLightfv(GL_LIGHT0, GL_DIFFUSE, luz_difusa)glLightfv(GL_LIGHT0, GL_DIFFUSE, luz_difusa) glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, objeto_difusa)objeto_difusa) glEnable(GL_LIGHTING)glEnable(GL_LIGHTING)

glEnable(GL_LIGHT0)glEnable(GL_LIGHT0)

Page 39: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

IluminaçãoIluminação

Reflexão EspecularReflexão Especular

Em OpenGL:Em OpenGL:

GLfloat luz_especular[] = { XR, XG, XB, X } GLfloat luz_especular[] = { XR, XG, XB, X } GLfloat objeto_especular[] = { YR, YG, YB, Y}GLfloat objeto_especular[] = { YR, YG, YB, Y} glLightfv(GL_LIGHT0, GL_SPECULAR, luz_especular )glLightfv(GL_LIGHT0, GL_SPECULAR, luz_especular ) glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR,

objeto_especular) objeto_especular) glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, n )glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, n ) glEnable(GL_LIGHTING);glEnable(GL_LIGHTING); glEnable(GL_LIGHT0);glEnable(GL_LIGHT0);

GL_SHININESS: define o quanto a superfície é polida, ou seja, o GL_SHININESS: define o quanto a superfície é polida, ou seja, o brilho dessa superfíciebrilho dessa superfícieO intervalo de GL_SHININESS em OpenGL é de 0.0 a 128.0O intervalo de GL_SHININESS em OpenGL é de 0.0 a 128.0

Page 40: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

Exercício Exercício

Alterar a cor da luz, a cor do buffer e a Alterar a cor da luz, a cor do buffer e a intensidade do brilho da esfera do arquivo intensidade do brilho da esfera do arquivo questao_3.cppquestao_3.cpp

Page 41: Hugo Siqueira (hlfs) Lauro Mafra Rafael Correa Rosana Silva Matos (rsm2)

ReferênciasReferências

http://www.opengl.org/http://www.opengl.org/

http://www.inf.pucrs.br/~manssour/OpenGL/http://www.inf.pucrs.br/~manssour/OpenGL/

http://nehe.gamedev.net/http://nehe.gamedev.net/