• Nenhum resultado encontrado

OpenGL – Relação Window x Viewport

N/A
N/A
Protected

Academic year: 2018

Share "OpenGL – Relação Window x Viewport"

Copied!
88
0
0

Texto

(1)

Algoritmos de Recorte em 2D

Computação Gráfica – DCC065

(2)

Sumário

● Conceito de Janela ● Recorte (Clipping)

● Introdução

● Algoritmo simples (Força Bruta) ● Algoritmo de Cohen-Sutherland

● Recorte por área

●Algoritmo de Sutherland-Hodgman

(3)

Janelas

Uma cena é composta por uma série de objetos em “coordenadas do mundo”

Coordenadas do Mundo

(4)

Janelas

Quando apresentamos uma cena, apenas os objetos contidos em uma janela em particular são mostrados

wymax

wymin

wxmin wxmax

(5)

Janelas

Desenhar objetos tem um custo computacional, por isso é necessário recortar tudo que está

fora da janela wymax

wymin

wxmin wxmax

Coordenadas do Mundo Janela

(6)

Recorte

Para a imagem abaixo, considere quais linhas e pontos deveriam estar dentro ou fora da

janela.

wymax

wymin

wx wx

Janela

P1

P2

P3 P6

P5 P7

P10 P9

P4

(7)

Recorte

Para a imagem abaixo, considere quais linhas e pontos deveriam estar dentro ou fora da

janela.

wymax

wymin

wxmin wxmax Janela

P1

P2

P3 P6

P5 P7

P10 P9

P4

P8

(8)

Recorte

Para a imagem abaixo, considere quais linhas e pontos deveriam estar dentro ou fora da

janela.

wymax

wymin

wx wx

Janela

P1

P2

P3 P6

P5 P7

P10 P9

P4

(9)

Recorte

Para a imagem abaixo, considere quais linhas e pontos deveriam estar dentro ou fora da

janela.

wymax

wymin

wxmin wxmax Janela

P1

P2

P3 P6

P5 P7

P10 P9

P4

P8

(10)

Recorte de Pontos

Fácil – um ponto (x,y) NÃO é cortado se: wxmin ≤ x ≤ wxmax E wymin ≤ y ≤ wymax

senão será cortado

wymax

wymin

Window

P1

P2

P5 P7

P10 P9

P4

P8 Cortado

Pontos que não serão cortados

Cortado

(11)

Recorte de linha

Complicado – devemos examinar os extremos de cada linha para avaliarmos se ela está

dentro ou fora da janela de visualização

Situação Ação Ação

Extremos dentro da

janela Não Recortar!

Um extremo dentro e

um fora Recortar!

Extremos fora da janela

(12)

Recorte de linha – Força Bruta

Recorte de linha “forçado” pode ser feito da seguinte forma:

● Não recorte linhas com

extremos dentro da janela

● Para linhas com uma

ponta dentro da janela e outra fora, calcule o ponto de interseção e recorte

(13)

Recorte de linha – Força Bruta

● Para linhas com os

extremos fora da janela devemos testá-las contra todas as bordas da janela e recortar de forma

apropriada.

Entretanto, calcular interseção de linha é

computacionalmente dispendioso. Se a

cena tiver um número grande de segmentos

de reta o método de “força bruta” é muito

(14)

Algoritmo de Cohen-Sutherland

● É um algoritmo clássico

de recorte de linha

● A vantagem chave deste

algoritmo em relação ao anterior é reduzir

drasticamente o número de interseções que

precisam ser calculadas

Dr. Ivan E. Sutherland

auxiliou o desenvolvimento deste algoritmo. Sutherland é uma das referências na área de CG. Ele foi o inventor dos primeiros HMD (Head

(15)

Algoritmo de Cohen-Sutherland

Neste algoritmo, o mundo é dividido em

regiões baseadas nas fronteiras da janela de interesse

● Cada região tem um código único de 4 bits, um

para cada semi-espaço.

● Os bits de cada ponto são classificados como

dentro = 0 e fora = 1 em relação a cada

semi-espaço. 1001 1000 1010

0001 0000Janela 0010

0101 0100 0110

(16)

Cohen-Sutherland: Identificação

Os pontos que compõem cada linha são identificados com códigos de região

apropriados

wymax

wymin

wxmin wxmax

Janela

P3 [0001] P6 [0000] P5 [0000]

P7 [0001]

P10 [0100] P9 [0000]

P4 [1000]

P8 [0010] P12 [0010] P11 [1010]

(17)

Algoritmo de Cohen-Sutherland

Aceitação trivial:

Classif(P1)

OR

Classif(P2) = 0

Rejeição trivial:

Classif(P1)

AND

Classif(P2) ≠ 0

Interseção com quais semi-espaços?

Classif(P1)

XOR

Classif(P2)

(18)

Algoritmo de Cohen-Sutherland

1001 1000 1010

0001 0000 0010

0101 0100 0110 1001 1000 1010

0001 0000 0010

0101 0100 0110

0000 OR 0000 = 0000

0000 AND 0000 = 0000 0000 XOR 0000 = 0000

1010 OR 0110 = 1110

1010 AND 0110 = 0010

(19)

Algoritmo de Cohen-Sutherland

19

1001 1000 1010

0001 0000 0010

0101 0100 0110 1001 1000 1010

0001 0000 0010

0101 0100 0110

0001 OR 0100 = 0101 0001 AND 0100 = 0000

0001 XOR 0100 = 0101

0100 OR 1010 = 1110 0100 AND 1010 = 0000

(20)

Cohen-Sutherland: Outras Linhas

● Como visto, linhas que não podem ser

classificadas como completamente dentro ou fora da janela podem ou não cruzar seu interior

● Podemos usar os códigos de região para

determinar quais semi-espaços devem ser considerados no cálculo de interseção

● Como visto anteriormente, para checar se uma

(21)

Cohen-Sutherland: Outras Linhas

● Estas linhas são processadas da seguinte

forma:

● Compare uma extremidade fora da janela com

uma borda (da janela) e determine quanto pode ser descartado

● Se o restante da linha estiver dentro da janela ou

fora da janela mantenha o segmento ou recorte, respectivamente

● Senão, compare o restante da linha com as outras

bordas da janela

● Continue o processo até que a linha seja

descartada ou um segmento dentro da janela seja encontrado

(22)

Cohen-Sutherland: Exemplos

● Considere a linha (P9, P10)

● Começaremos em P10

● Considerando os códigos

de região dos pontos

sabemos que a linha não cruza as bordas direita e esquerda

● Calculamos a interseção

da linha em relação ao

semi-espaço inferior para gerar o ponto P10

● A linha (P9 ,P10’) está completamente contida na

janela e, desta forma, será mantida

wymax

wymin

wxmin wxmax Janela

P10 [0100] P9 [0000]

(23)

Cohen-Sutherland: Exemplos

● Considere agora a linha (P3, P4 )

● Começaremos em P4

● Considerando os códigos

de região dos pontos sabemos que a linha cruza o semi-espaço

esquerdo. Calculando a interseção da linha com este semi-espaço o ponto P4’ é gerado

● A linha (P3 ,P4’) está completamente fora da

janela e, portanto, será descartada ( a linha (P4 ,P4’) também )

wymax

wymin

wxmin wxmax Janela

P4’ [1001]

P3 [0001]

P4 [1000]

P3 [0001]

(24)

Cohen-Sutherland: Exemplos

● Considere a linha (P7, P8)

● Começaremos por P7

● Considerando os códigos

de região dos pontos sabemos que a linha

cruza a borda esquerda então calcularemos a interseção da linha com esta borda para gerar o ponto P7

wymax

wymin

wxmin wxmax Janela

P7’ [0000]

P7 [0001] P8 [0010]

(25)

Cohen-Sutherland: Exemplos

● Considere a linha (P7’, P8)

● Começaremos de P8

● Calculando a interseção

com a borda direita geraremos P8

● O ponto (P7’ ,P8’)

está dentro da janela e portanto será

mantido

wymax

wymin

wxmin wxmax Janela

P7’ [0000]

P7 [0001] P8 [0010]

P8’ [0000]

(26)

Outros algoritmos

● Outros algoritmos para recorte de linha mais

eficientes foram propostos posteriormente. Entre eles podemos citar:

● Cyrus-Beck ● Liang-Barsky

(27)

Recorte de Polígonos

Polígonos são definidos por arestas

● Por que não utilizar algoritmos de recorte de

linhas?

● Geram segmentos de reta desconexos

● Precisamos de uma área delimitada após o

recorte

● A área deve ser rasterizada posteriormente

● A saída do cortador deve ser uma sequência de

vértices que define as fronteiras cortadas

(28)

Algoritmo de

Sutherland-Hodgman

● Aplicado a cada fronteira separadamente ● Partes visíveis são repassadas ao próximo

cortador

● Começamos com o conjunto inicial de

vértices

● Após cada fronteira, uma nova sequência de

(29)

Algoritmo de

Sutherland-Hodgman

● Este algoritmo utiliza quatro tipos de

transição:

● Fora-dentro ● Dentro-dentro ● Dentro-fora ● Fora-fora

● O tipo de transição determina quais vértices

serão salvos

(30)

Algoritmo de

Sutherland-Hodgman

● Transição “fora-dentro”

v1'

v1 v

2

v3 v4

Vértices salvos: v1’ e v2

(31)

Algoritmo de

Sutherland-Hodgman

● Transição “dentro-dentro”

v1 v

2

v3 v4

Vértices salvos: v3

Janela

(32)

Algoritmo de

Sutherland-Hodgman

● Transição “dentro-fora”

v3'

v1 v

2

v3 v4

Vértices salvos: v3

(33)

Algoritmo de

Sutherland-Hodgman

● Transição “fora-fora”

v1 v

2

v3 v4

Vértices salvos: nenhum

Janela

(34)

Algoritmo de

Sutherland-Hodgman

● Transição “fora-fora”

(35)

Algoritmo de

Sutherland-Hodgman

● Lista de vértices de saída de uma fronteira é

a entrada para o cortador da próxima fronteira

● Como otimizar?

● Processar vértices individualmente

● Vértices são incluídos ou removidos da lista de

saída somente após terem sido classificados com relação a todos planos

● Vértice classificado como exterior é

imediatamente retido

(36)

Algoritmo de

Sutherland-Hodgman

● Exemplo 1

v1

v2

v3

v4

(37)

Algoritmo de

Sutherland-Hodgman

● Exemplo 1

v1

v2

v3

v4

Vértices

v1 OUT v2 IN v3 IN v4 IN Janela

(38)

Algoritmo de

Sutherland-Hodgman

● Exemplo 1

v1

v2

v3

v4

Vértices

v1 OUT v2 IN

v3 IN v4 IN v1

(39)

Algoritmo de

Sutherland-Hodgman

v1

v2

v3

v4

Vértices

v1 OUT

v2 IN v3 IN

v4 IN

v1

v4

Janela

39

(40)

● Exemplo 1

v1

Algoritmo de

Sutherland-Hodgman

v2

v3

v4

Vértices

v1 IN v2 OUT v3 IN v4 IN v4' IN v1

v4

(41)

Algoritmo de

Sutherland-Hodgman

● Exemplo 1

v1

v2

v3

v4

Vértices

v1 IN v2 OUT

v3 IN v4 IN v4' IN v1

v1’’

v4

Janela

(42)

Algoritmo de

Sutherland-Hodgman

● Exemplo 1

v1

v2

v3

v4

Vértices

v1 IN

v2 OUT v3 IN

v4 IN v4' IN v1

v1’’ v2

v4

(43)

Algoritmo de

Sutherland-Hodgman

● Exemplo 1

v1

v2

v3

v4

Vértices

v1 IN v1’’ IN v2' IN

v3 OUT v4 IN v4' IN v1

v1’’ v2’

v4

Janela

(44)

Algoritmo de

Sutherland-Hodgman

● Exemplo 1

v1

v2

v3

v4

Vértices

v1 IN v1’’ IN

v2' IN v3 OUT

v4 IN v4' IN v1

v1’’ v2

v2

v4

(45)

Algoritmo de

Sutherland-Hodgman

● Exemplo 1

v1

v2

v3

v4

Vértices

v1 IN v1’’ IN v2' IN

v3 OUT v4 IN

v4' IN

45

v1

v1’’ v2

v2

v3 v4

(46)

Algoritmo de

Sutherland-Hodgman

● Exemplo 1

v1

v2

v3

v4

Vértices

v1 IN v1’’ IN v2' IN v2'' IN v3' IN

v4 OUT v4' IN v1

v1’’ v2

v2

v4

Janela

(47)

Algoritmo de

Sutherland-Hodgman

● Exemplo 1

v1

v2

v3

v4

Vértices

v1 IN v1’’ IN v2' IN v2'' IN

v3' IN v4 OUT

v4' IN v1

v1’’ v2’

v2

v3 v3’’

v4

Janela

(48)

Algoritmo de

Sutherland-Hodgman

● Exemplo 1

v1

v2

v3

v4

Vértices

v1 IN v1’’ IN v2' IN v2'' IN v3' IN

v4 OUT v4' IN

v1

v1’’ v2

v2’’

v3 v3’’

v4’’ v4

(49)

Algoritmo de

Sutherland-Hodgman

● Exemplo 1

v 1 v 2 v 3 v4 Vértices

v1 IN v1’’ IN v2' IN v2'' IN v3' IN v4' IN v4'' IN v1

v1’’ v2

v2

v3 v3’’

v4’’ v4

Janela

(50)

Algoritmo de

Sutherland-Hodgman

● Exemplo 2

v1

v3

(51)

Algoritmo de

Sutherland-Hodgman

● Exemplo 2

Vértices

v1 OUT v2 IN v3 IN v1

v3

v2

Janela

(52)

Algoritmo de

Sutherland-Hodgman

● Exemplo 2

Vértices

v1 OUT v2 IN

v3 IN v1

v3

v2

v1

(53)

Algoritmo de

Sutherland-Hodgman

● Exemplo 2

Vértices

v1 OUT

v2 IN

v3 IN

v1

v3

v2 v3

v1

Janela

(54)

Algoritmo de

Sutherland-Hodgman

● Exemplo 2

Vértices

v1' IN v2 IN v3 IN v3' IN v1

v3

v2 v3

(55)

Algoritmo de

Sutherland-Hodgman

● Exemplo 2

Vértices

v1' IN v2 OUT v3 IN v3' IN v1

v3

v2 v3

v1

Janela

(56)

Algoritmo de

Sutherland-Hodgman

● Exemplo 2

Vértices

v1' IN v2 OUT

v3 IN v3' IN v1

v3

v2 v3

v1

v1

(57)

Algoritmo de

Sutherland-Hodgman

● Exemplo 2

Vértices

v1' IN

v2 OUT v3 IN

v3' IN v1

v3

v2 v3

v1

v1 v2

Janela

(58)

Algoritmo de

Sutherland-Hodgman

● Exemplo 2

Vértices

v1' IN v1'' IN v2' IN V3 OUT v3' IN v1

v3

v2 v3

v1

v1’’ v2

(59)

Algoritmo de

Sutherland-Hodgman

● Exemplo 2

Vértices

v1' IN v1'' IN

v2' IN V3 OUT

v3' IN v1

v3

v2 v3

v1

v1’’ v2 v2’’

Janela

(60)

Algoritmo de

Sutherland-Hodgman

● Exemplo 2

Vértices

v1' IN v1'' IN v2' IN

V3 OUT v3' IN

v1

v3

v2 v3

v1

v1’’ v2 v3’’ v2’’

(61)

Algoritmo de

Sutherland-Hodgman

● Exemplo 2

Vértices

v1' IN v1'' IN v2' IN v2'' IN v3' IN v3'' IN v1

v

3

v

2

v3

v1

v1’’ v2 v3’’ v2’’

Janela

(62)

Algoritmo de

Sutherland-Hodgman

● Exemplo 3

v

v

2

v2

v3

v5

v v1

(63)

Algoritmo de

Sutherland-Hodgman

● Exemplo 3

Vértices

v1 IN v2 OUT v3 OUT v4 IN v5 IN v

v

2

v2

v3

v5

v4 v1

Janela

(64)

Algoritmo de

Sutherland-Hodgman

● Exemplo 3

Vértices

v1 IN v2 OUT

v3 OUT v4 IN v5 IN v

2

v2

v3

v5

v4 v1

v1

(65)

Algoritmo de

Sutherland-Hodgman

● Exemplo 3

Vértices

v1 IN v2 OUT

v3 OUT v4 IN

v5 IN v

v

2

v2

v3

v5

v4 v1

v1

v3

Janela

(66)

Algoritmo de

Sutherland-Hodgman

● Exemplo 3

Vértices

v1 IN v1' IN v3' OUT

v4 OUT v5 IN v

v

2

v2

v3

v5

v4 v1

v1

v3

(67)

Algoritmo de

Sutherland-Hodgman

● Exemplo 3

Vértices

v1 IN

v1' IN v3' OUT

v4 OUT v5 IN v

v

2

v2

v3

v5

v4 v1

v1

v3 v3

Janela

(68)

Algoritmo de

Sutherland-Hodgman

● Exemplo 3

Vértices

v1 IN v1' IN v3' OUT

v4 OUT v5 IN

v

v

2

v2

v3

v5

v4 v1

v1

v3

v1’’ v

4’

(69)

Algoritmo de

Sutherland-Hodgman

● Exemplo 3

Vértices

v1 IN v1' IN v1'' IN

v4' OUT v5 OUT v v 2 v2 v3 v5 v4 v1

v1

v3

v1’’ v

4’

Janela

(70)

Algoritmo de

Sutherland-Hodgman

● Exemplo 3

Vértices

v1 IN v1' IN

v1'' IN v4' OUT

v5 OUT v v 2 v2 v3 v5 v4 v1

v1

v3

v1’’ v

4’

(71)

Algoritmo de

Sutherland-Hodgman

● Exemplo 3

Vértices

v1 IN

v1' IN v1'' IN

v4' OUT

v5 OUT

v v 2 v2 v3 v5 v4 v1

v1

v3

v1’’ v

4’

v1’’’ v5

Janela

(72)

Algoritmo de

Sutherland-Hodgman

● Exemplo

Vértices

v1 OUT v1' OUT v1'' IN v1''' IN

v5' OUT v v 2 v2 v3 v5 v4 v1

v1

v3

v1’’ v4

v1’’’ v5

(73)

Algoritmo de

Sutherland-Hodgman

● Exemplo 3

Vértices

v1 OUT

v1' OUT v1'' IN

v1''' IN v5' OUT v v 2 v2 v3 v5 v4 v1

v1

v3

v1’’ v4

v1’’’ v5

v1’’’’

Janela

(74)

Algoritmo de

Sutherland-Hodgman

Vértices

v1 OUT v1' OUT v1'' IN

v1''' IN v5' OUT

v v 2 v2 v3 v5 v4 v1

v1

v3

v1’’ v

4’

v1’’’ v5

v1’’’’ v1’’’’’

(75)

Algoritmo de

Sutherland-Hodgman

Vértices

v1'''' IN v1'' IN v1''' IN v1''''' IN v 1 v 3 v 2 v 2 v 3 v 5 v4 v 1 v1

v1’’ v

4

v1’’’

v5

v1’’’’ v1’’’’’

Janela

75

(76)

Algoritmo de

Sutherland-Hodgman

● Este algoritmo recorta corretamente qualquer

polígono, mas somente contra janelas convexas!

● Existem algoritmos mais genéricos, que

podem ser utilizados para recorte contra janelas côncavas, mas possuem um custo computacional maior. Exemplo:

(77)

Recorte – Aplicação

● Normalmente cenas são renderizadas em uma

janela retangular

● Neste cenário, os algoritmos vistos nesta aula

podem ser aplicados para remover objetos ou parte de objetos que estiverem fora desta

janela

● Após o recorte, o próximo passo na

visualização dos objetos em uma cena é

definir em que parte da janela (física) estes objetos serão representados

● Essa porção da janela é chamada Viewport

(78)

Entidades de Visualização

Window (Janela de Recorte)

● É área do mundo a ser visualizada e é definida em

coordenadas do mundo

● Exemplo de comando: glOrtho

Viewport

● Área a ser visualizada na janela do dispositivo ● É a área onde a window definida é mapeada. ● Exemplo de comando: glViewport

Janela

● Janela do dispositivo de saída (janela física)

(79)
(80)
(81)

81

Saiba mais!

Computer Graphics, C Version

Capítulo 7

Este capítulo trata dos algoritmos de recorte visto nesta aula

acrescidos de uma visão detalhada de outros algoritmos correlatos. Há também uma explicação teórica

(82)

Saiba mais!

OpenGL Programming Guide

Seventh Edition

Capítulo 3

Você encontrará muita informação a respeito da criação de janelas e

(83)

Resumo

Nesta aula vimos

Algoritmos de recorte de linhas.

Algoritmos de recorte de polígonos.

Entidades de visualização em OpenGL.

(84)

Exercício – Relação Window x Viewport

● Para os exercícios a seguir, utilize como base o

projeto Viewport

● Verifique o código e entenda o seu funcionamento

(85)

Exercício – Relação Window x Viewport

1. Desenvolva um programa que crie a ilustração do

slide a seguir. Nesse programa, serão desenhadas 4 viewports, e para cada viewport será projetada uma Window com parâmetros diferentes.

Desenvolva uma função para criar a ilustração do canto superior esquerdo desta janela e visualize

esta ilustração por esses quatro pontos de vista

diferentes. Lembre-se de criar uma window e uma

viewport para cada um dos quadrantes da imagem ao lado. Utilize as constantes GL_PROJECTION (para utilizar o comando glOrtho) e

GL_MODELVIEW (para viewport e desenhos) corretamente.

(86)
(87)

Exercício – Relação Window x Viewport

2. Baseado no exercício anterior faça uma modificação na

qual as viewports sejam visíveis e selecionáveis. A ideia encontra-se ilustrada no próximo slide. Basicamente as viewports passarão a estar visíveis por uma caixa envoltória branca (os parâmetros dos comandos glOrtho utilizados em cada ilustração podem ajudar a definir essas caixas). Deve-se criar um código que identifique qual viewport foi clicada. Para essa identificação, faça uso das coordenadas das viewports. Ao clicar e arrastar dentro da viewport selecionada com o botão esquerdo do mouse, a representação do mundo visualizado por ela mudará de posição (Essa mudança será realizada através de modificações do comando glOrtho correspondente).

(88)

Referências

Documentos relacionados

Atividade de n°2: A bolsista utilizará o álcool gel para realizar a higiene das mãos, em seguida organizará os alunos em volta da mesa já juntas, para todos fiquem ao redor de

Apenas foram submetidos aos protocolos de provocação e/ou dessensibilização com AAS, os pacientes com asma controlada e, portanto, os pacientes que tinham asma grave não

Anexo 1 – Classificação Geral no Processo Seletivo 2016 C L A S S IF IC A Ç Ã O F IN A L NOME DO CANDIDATO ETAPA 1 PROVA ESCRITA (Eliminatória) RESULTADO

A vacina contra a influenza, de acordo com Yano et al (2013) vem sendo apontada pela Organização Mundial da Saúde (OMS) como umas das principais formas de redução da

Sede bendito, Senhor Deus de nossos pais.. No templo santo onde refulge a

Fonte: Baseado nas respostas dos países da OCDE à questão 5 da Base de Dados da OCDE sobre Práticas e Procedimentos Orçamentários – 2007.. Tendências na reforma do

16 - Requisitos técnicos e procedimentos administrativos para registro, pós-registro, cadastro ou notificação de Produtos de Higiene Pessoal, Cosméticos e Perfumes. 17.2

Dentre essas PANC têm-se o feijão andu (Cajanus cajan) e o feijão mangalô (Phseolus lunatus), que são leguminosas de valor nutricional reconhecido e são cultivadas, amplamente,