computação gráfica - opengl 02 - início — univasf...

31
Computação Gráfica - OpenGl 02 Prof. Jorge Cavalcanti [email protected] www.univasf.edu.br/~jorge.cavalcanti www.twitter.com/jorgecav Universidade Federal do Vale do São Francisco Curso de Engenharia da Computação

Upload: lamhanh

Post on 08-Oct-2018

223 views

Category:

Documents


0 download

TRANSCRIPT

Computação Gráfica - OpenGl 02

Prof. Jorge [email protected]

www.univasf.edu.br/~jorge.cavalcanti

www.twitter.com/jorgecav

Universidade Federal do Vale do São FranciscoCurso de Engenharia da Computação

30/01/2018Página 2Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

Primitivas Gráficas

• São elementos básicos que compõem um desenho;

• Em OpenGL são definidas em um sistema de coordenadasbidimensionais por meio de vértices;

• A partir de primitivas simples é possível criar estruturas maiscomplexas.

• Objetos e cenas criados usando OpenGl consistem em umconjunto de primitivas gráficas simples que são combinadas paraformar os modelos.

• OpenGL fornece ferramentas para desenhar pontos, linhas,"polilinhas" e polígonos, que são formados por um ou maisvértices.

30/01/2018Página 3Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

• OpenGL possui 10 primitivas geométricas

– um tipo de ponto

– três tipos de linhas

– seis tipos de polígonos.

• Os vértices são definidos pelo comando Vertex

glVertex2f( float x, float y); //vértice para um eixo 2D

glVertex3d(double x,double y, double z); //vértice para um exixo 3D

• As primitivas precisam ser delimitadas através de Begin ... Endconforme abaixo:

Begin (nome da primitiva);

... // aqui serão colocados comandos Vertex.

End ();

Primitivas Gráficas

30/01/2018Página 4Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

• Ponto– a primitiva responsável em desenhar pontos na tela é

GL_POINTS

– O código no exemplo abaixo desenha 3 pontos na tela. Cada vértice torna-se um ponto

glBegin( GL_POINTS );

glVertex2f( xf, yf);

glVertex2f( xf, yf);

glVertex2f( xf, yf);

glEnd();

– O tamanho do ponto pode ser modificado através do comando glPointSize (GLint tamanho), bastando passar como parâmetro o tamanho do ponto.

Primitivas Gráficas

30/01/2018Página 5Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

Primitivas Gráficas

• Exemplo para desenhar três pontos pretos na tela:

glBegin(GL_POINTS);

glColor3f(0.0f, 0.0f, 0.0f);

glVertex2i(100, 50);

glVertex2i(100, 130);

glVertex2i(150, 130);glEnd()

30/01/2018Página 6Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

• Linhas– GL_LINES : O terceiro ponto é ignorado pois a linha é formada por

dois vértices.

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

– GL_LINE_STRIP: cria linhas consecutivas, ligando o primeiro vértice com o segundo, o segundo com o terceiro e assim por diante

– 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 nome.

– O espessura de uma linha pode ser modificada através do comando glLineWidth (GLint espessura), bastando passar como parâmetro a espessura da linha

Primitivas Gráficas

30/01/2018Página 7Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

• Polí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

Primitivas Gráficas

30/01/2018Página 8Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

• Polígonos– GL_TRIANGLES: Desenha triângulos a cada 3 vértices fornecidos;

– GL_TRIANGLE_STRIP: Uma série de triângulos conectados. Após o desenho do primeiro triângulo, cada vértice adicional forma um novo triângulo com dois últimos pontos fornecidos;

– GL_TRIANGLE_FAN: Uma série de triângulos com um único vértice em comum. O vértice comum é o primeiro vértice fornecido;

– GL_QUADS: Desenha um quadrilátero a cada 4 vértices fornecidos;

– GL_QUAD_STRIP: Desenha uma série de quadriláteros. Após o primeiro, apenas mais 2 vértices precisam ser fornecidos para o desenho do segundo quadrilátero;

– GL_POLYGON: Desenha polígonos convexos simples com um número arbitrário de vértices

Primitivas Gráficas

30/01/2018Página 9Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

Primitivas Gráficas

GL_LINES

0

1

2

3 5

4

GL_LINE_STRIP

0

1

2

3

GL_LINE_LOOP

0 1

234

GL_POLYGON

(convexo)

04

3

2

1

GL_QUADS

03

21

4 7

65

GL_QUAD_STRIP

0

31

2 4

5

GL_TRIANGLES

0

1

2

34

5

GL_TRIANGLE_STRIP

1

02

3

4

5

GL_TRIANGLE_FAN

0

1

2 3

4

GL_POINTS

01

2

30/01/2018Página 10Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

Primitivas Gráficas

30/01/2018Página 11Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

Primitivas Gráficas

30/01/2018Página 12Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

Primitivas Gráficas

30/01/2018Página 13Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

Primitivas Gráficas

30/01/2018Página 14Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

Primitivas GráficasExercícios – Reproduzir as seguintes figuras:

Obs:

1 - Considere a janela de visualização (gluOrtho2D) com 20 X 20 e a janela da aplicação com 400 x 400.

2 - A ordem dos vértices é no sentido anti-horário

21 3

30/01/2018Página 15Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

Visualização

• Temos que definir nosso espaço de desenho. Chamamos esse espaço de volume de visualização .

• Esse volume pode ter a principio as seguintes formas – De um paralelepípedo – projeção ortográfica.

– De um tronco de pirâmide – projeção perspectiva.

• Para permitir a visualização de objetos tridimensionais é necessário usar projeção para converter as coordenadas 3D em coordenadas 2D que correspondem a uma visão específica do objeto.

30/01/2018Página 16Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

Visualização• Projeção em perspectiva: é a que acontece no processo de

formação de imagens em nossos olhos ou numa câmera fotográfica, por isso é a que gera imagens mais realistas.

30/01/2018Página 17Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

Visualização• Projeção paralela ou ortogonal : é a forma mais simples de

projeção. Nela a imagem de um ponto é definida como a projeção normal deste ponto no plano de projeção. A projeção paralela pode ser vista como uma projeção perspectiva onde o centro de projeção está no infinito.

30/01/2018Página 18Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

Visualização• Projeções em OpenGl

– O OpenGL mantém três matrizes de transformação ModelView, Projection e ViewPoint, que são usadas para transformar um ponto qualquer dado em um ponto da janela de visualização.

– Cada ponto especificado é multiplicado por essas matrizes.

– O comando glMatrixMode deverá ser utilizado antes dos comandos que especificam as formas de projeção, que são definidas com os comandos: glOrtho, glFrustum ou gluPerpective.

• Ex.: Projeção Ortogonal

glMatrixMode( GL_PROJECTION );glLoadIdentity();glOrtho(X min, X max, Y min, Y max, Near, Far);

30/01/2018Página 19Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

Visualização• Projeções em OpenGl

• (GL_PROJECTION) – avisa a OpenGL que todas as futuras alterações, tais como operações de escala, rotação e translação, irão afetar a "câmera" (ou observador).

• (GL_MODELVIEW) - avisa a OpenGL que todas as futuras alterações, tais como operações de escala, rotação e translação, irão afetar os modelos da cena (=o que é desenhado).

– As transformações geométricas aplicadas usando comandos OpenGL do tipo glTranslate, glRotate ou glScale, são sempre armazenadas em uma matriz MODELVIEW.

• A função glLoadIdentity(); chamada em seguida, faz com que a matriz corrente seja inicializada com a matriz identidade (nenhuma transformação é acumulada).

• Caso você faça a projeção com os comandos glOrtho ou glFrustum, o OpenGL especifica uma matriz default, na qual a câmera está alinhada com o eixo z.

30/01/2018Página 20Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

Visualização

• Projeção ortogonal:

glMatrixMode( GL_PROJECTION );glLoadIdentity();glOrtho(X min, X max, Y min, Y max, Near, Far);

Obs: Qualquer coordenada fora desses limites faz com que o ponto são seja visualizado na tela.

30/01/2018Página 21Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

Visualização• Projeção em perspectiva:

glMatrixMode( GL_PROJECTION );glLoadIdentity(); glFrustum(X min, X max, Y min, Y max, Near, Far);

Obs: Qualquer coordenada fora desses limites faz com que o ponto são seja visualizado na tela.

Os parâmetros Near e Far são sempre coordenadas positivas de Z.

30/01/2018Página 22Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

Visualização

•Projeção em perspectiva:

• Existe uma função presente na GLU que fornece uma outra maneira de se realizar um projeção perspectiva em OpenGL. Ela permite que seja especificado o ângulo de visão (ou field of vision) da projeção

• Esta função recebe como uns dos parâmetros o valor do ângulo de visão. Sua sintaxe é descrita abaixo:

gluPerspective (ângulo, aspecto, near, far), onde:ângulo -> é o ângulo de visão, usado para determinar a “altura”do volume de visualizaçãoaspecto -> Tamanho (w na figura) / Altura (h na figura) da janela de visualização.near e far -> idênticos aos parâmetros do comando Frustum.

Ir ao Programa de Demonstração de Parâmetros e Perspectivas

30/01/2018Página 23Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

Projeções

30/01/2018Página 24Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

Projeção Ortogonal

30/01/2018Página 25Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

Projeção Perspectiva

30/01/2018Página 26Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

Projeção Perspectiva

30/01/2018Página 27

• Janela de Seleção (window)– Área de trabalho da aplicação com a qual se deseja

trabalhar;

– Área do universo de interesse;

– Porção visível do universo;

– Coordenadas do SRU.

• Janela de exibição (viewport)– Área de exibição, dentro de tela;

– Área da tela para onde o conteúdo da window será mapeado;

– Região de desenho na tela;

– Coordenadas do SRD.

Definição do Espaço de Trabalho

Computação Gráfica OpenGl– Parte 02 – Prof. Jorge Cavalcanti

30/01/2018Página 28

Definição do Espaço de Trabalho

Zoom?

Computação Gráfica OpenGl– Parte 02 – Prof. Jorge Cavalcanti

30/01/2018Página 29Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

Definição do Espaço de Trabalho

• Window X Viewport

30/01/2018Página 30Computação Gráfica OpenGl– Parte 02

– Prof. Jorge Cavalcanti

Definição do Espaço de Trabalho

• Window X Viewport

• Ver demo e infograph 3D

30/01/2018Página 31

• Definindo a window– Em 2D – gluOrtho2D(left, right, bottom, top)

– Em 3D:

– Projeção Ortogonal - glOrtho(X min, X max, Y min, Y max, Near, Far)

– Projeção Perspectiva - glFrustum(X min, X max, Y min, Y max, Near, Far)

– Projeção Perspectiva - gluPerspective (ângulo, aspecto, near, far)

• Definindo a viewport– glViewport(X, Y, largura, altura);

– X e Y inteiros – coordenada do canto inferior esquerdo da janela.

– Normalmente delimitada pela janela GLUT.

– Código Exemplo 1 – Casa simples, com recurso de alteração de tamanho da janela.

– Código Exemplo 2 – 02 viewports

Definição do Espaço de Trabalho

Computação Gráfica OpenGl– Parte 02 – Prof. Jorge Cavalcanti