Algoritmos de Recorte em 2D Computação Gráfica DCC065 Prof. Rodrigo Luis de Souza da Silva, D.Sc.
Sumário Conceito de Recorte (Clipping) Introdução Algoritmo simples (Força Bruta) Algoritmo de Cohen-Sutherland Recorte por área Algoritmo de Sutherland- OpenGL Relação Window x Viewport 2
s Uma cena é composta por uma série de objetos em coordenadas do mundo Coordenadas do Mundo 3
s Quando apresentamos uma cena, apenas os objetos contidos em uma janela em particular são mostrados wy max wy min wx min wx max Coordenadas do Mundo 4
s Desenhar objetos tem um custo computacional, por isso é necessário recortar tudo que está fora da janela wy max wy min wx min wx max Coordenadas do Mundo 5
Recorte Para a imagem abaixo, considere quais linhas e pontos deveriam estar dentro ou fora da janela. P 4 wy max P 3 P 6 P 2 P 7 P 5 P 1 wy min P 9 P 8 P 10 wx min wx max 6
Recorte Para a imagem abaixo, considere quais linhas e pontos deveriam estar dentro ou fora da janela. P 4 wy max P 3 P 6 P 2 P 7 P 5 P 1 wy min P 9 P 8 P 10 wx min wx max 7
Recorte Para a imagem abaixo, considere quais linhas e pontos deveriam estar dentro ou fora da janela. P 4 wy max P 3 P 6 P 2 P 7 P 5 P 1 wy min P 9 P 8 P 10 wx min wx max 8
Recorte Para a imagem abaixo, considere quais linhas e pontos deveriam estar dentro ou fora da janela. P 4 wy max P 3 P 6 P 2 P 7 P 5 P 1 wy min P 9 P 8 P 10 wx min wx max 9
Recorte de Pontos Fácil um ponto (x,y) NÃO é cortado se: wx min x wx max E wy min y wy max senão será cortado wy max wy min Cortado P 7 P 5 Window P 9 P 4 Cortado P 1 Pontos que não serão cortados Cortado P 2 P 8 Cortado P 10 wx min wx max 10
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 Extremos fora da janela Recortar! Necessário fazer outros testes!
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 deste ponto para fora. 12
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 lento 13
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 mounted display) na década de 60. 14
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 0000 0010 0101 0100 0110 15
Cohen-Sutherland: Identificação Os pontos que compõem cada linha são identificados com códigos de região apropriados P 4 [1000] P 11 [1010] wy max wy min P 3 [0001] P 7 [0001] P 6 [0000] P 5 [0000] P 9 [0000] P 12 [0010] P 8 [0010] P 10 [0100] P 13 [0101] P 14 [0110] wx min wx max 16
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) 17
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 1010 XOR 0110 = 1100 18
Algoritmo de Cohen-Sutherland 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 0100 XOR 1010 = 1110 19
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 linha atravessa um semi-espaço em particular podemos utilizar o operador XOR 20
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 21
Cohen-Sutherland: Exemplos Considere a linha (P 9, P 10 ) Começaremos em P 10 Considerando os códigos wy max de região dos pontos sabemos que a linha não P cruza as bordas direita e 9 [0000] wy min esquerda Calculamos a interseção wx da linha em relação ao min semi-espaço inferior para gerar o ponto P 10 P 10 [0000] P 10 [0100] A linha (P 9,P 10 ) está completamente contida na janela e, desta forma, será mantida wx max 22
Cohen-Sutherland: Exemplos Considere agora a linha (P 3, P 4 ) Começaremos em P 4 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 P 4 é gerado wy max wy min P 4 [1001] P 3 [0001] wx min P 4 [1000] A linha (P 3,P 4 ) está completamente fora da janela e, portanto, será descartada ( a linha (P 4,P 4 ) também ) wx max 23
Cohen-Sutherland: Exemplos Considere a linha (P 7, P 8 ) Começaremos por P 7 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 P 7 wy max wy min wx min P 7 [0000] P 7 [0001] P 8 [0010] P 8 [0000] wx max 24
Cohen-Sutherland: Exemplos Considere a linha (P 7, P 8 ) Começaremos de P 8 Calculando a interseção com a borda direita geraremos P 8 O ponto (P 7,P 8 ) está dentro da janela e portanto será mantido wy max wy min wx min P 7 [0000] P 7 [0001] P 8 [0010] P 8 [0000] wx max 25
Outros algoritmos Outros algoritmos para recorte de linha mais eficientes foram propostos posteriormente. Entre eles podemos citar: Cyrus-Beck Liang-Barsky Nicholl-Lee-Nicholl 26
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 27
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 vértices é gerada 28
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 29
Transição fora-dentro v 2 Vértices salvos: e 30
Transição dentro-dentro Vértices salvos: 31
Transição dentro-fora Vértices salvos: 32
Transição fora-fora Vértices salvos: nenhum 33
Transição fora-fora 34
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 35
Exemplo 1 36
Exemplo 1 Vértices 37
Exemplo 1 Vértices 38
Exemplo 1 Vértices 39
Exemplo 1 Vértices 40
Exemplo 1 Vértices 41
Exemplo 1 Vértices 42
Exemplo 1 Vértices 43
Exemplo 1 Vértices 44
Exemplo 1 Vértices 45
Exemplo 1 Vértices 46
Exemplo 1 Vértices 47
Exemplo 1 Vértices 48
Exemplo 1 v 2 Vértices v 1 v 3 49
Exemplo 2 50
Exemplo 2 Vértices 51
Exemplo 2 Vértices 52
Exemplo 2 Vértices 53
Exemplo 2 Vértices 54
Exemplo 2 Vértices 55
Exemplo 2 Vértices 56
Exemplo 2 Vértices 57
Exemplo 2 Vértices V 3 58
Exemplo 2 Vértices V 3 59
Exemplo 2 Vértices V 3 60
Exemplo 2 v 3 v 2 Vértices 61
Exemplo 3 v 5 v 2 v 62
Exemplo 3 v 2 v 5 Vértices v v 5 63
Exemplo 3 v 2 v 5 Vértices v 5 64
Exemplo 3 v 2 v 5 Vértices v v 5 65
Exemplo 3 v 2 v 5 Vértices v v 5 66
Exemplo 3 v 2 v 5 Vértices v v 5 67
Exemplo 3 v 2 v 5 Vértices v v 5 68
Exemplo 3 v 2 v 5 Vértices v v 5 69
Exemplo 3 v 2 v 5 Vértices v v 5 70
Exemplo 3 v 5 v 2 v 5 Vértices v v 5 71
Exemplo v 5 v 2 v 5 Vértices v v 5 72
Exemplo 3 v 5 v 2 v 5 Vértices v v 5 73
v 5 v 2 v 5 Vértices v v 5 74
v 1 v 2 v 3 v 5 v 2 v 5 Vértices v 1 v 1 v 3 75
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: Algoritmo de Weiler-Atherton 76
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 77
Entidades de Visualização Window ( 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 do dispositivo de saída (janela física) Exemplo de comando e criação: glutcreatewindow 78
79
Entidades de Visualização 80
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 sobre as entidades de visualização. 81
Saiba mais! OpenGL Programming Guide Seventh Edition Capítulo 3 Você encontrará muita informação a respeito da criação de janelas e viewports neste capítulo (página 134 a 160). 82
Resumo Nesta aula vimos Algoritmos de recorte de linhas. Algoritmos de recorte de polígonos. Entidades de visualização em OpenGL. 83
Exercício Relação Window x Viewport Para os exercícios a seguir, baixe o código 08_viewport.cpp para utilizar como base. Verifique o código e entenda o seu funcionamento antes de prosseguir. 84
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. 85
Exercício Relação Window x Viewport 86
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). 87
Exercício Relação Window x Viewport 88