Prévia do material em texto
Técnicas de renderização Apresentação dos conceitos e aplicações de técnicas de renderização com abordagem das representações de modelagem de objetos, algoritmos de rasterização, aspectos de iluminação, além de exemplos práticos com a utilização do software TinkerCad. Prof. Sérgio Assunção Monteiro 1. Itens iniciais Propósito Compreender os conceitos e as aplicações das técnicas de renderização fornecerá a base de conhecimento para o profissional que deseja trabalhar com a área de computação gráfica, modelando objetos e empregando algoritmos de rasterização. Preparação Para executar nossos exemplos, você vai precisar criar uma conta no TinkerCad. Além disso, deverá instalar a IDE PyCharm. Objetivos Descrever as representações para fazer modelagem de objetos. Listar os aspectos relacionados às técnicas de rasterização. Caracterizar os algoritmos de iluminação. Esquematizar um exemplo prático de manipulação de imagens utilizando o Python. Introdução O avanço da tecnologia computacional, tanto em termos de hardware como de algoritmos, está proporcionando novas experiências que aumentam a sensação de realismo na interação com jogos eletrônicos e filmes, por exemplo. Isso se deve à crescente demanda por produtos e soluções confiáveis, que estejam disponíveis mais rapidamente e que sejam mais baratos. Nesse cenário, a computação gráfica evoluiu ao longo dos anos, desenvolvendo técnicas para viabilizar soluções práticas que encontram aplicações em diversas situações, como no entretenimento, nas engenharias (civil, automobilística, aeronáutica), na medicina e em tantas outras áreas. Conhecer os conceitos fundamentais de computação gráfica permite ao estudante ir além de ser um consumidor de soluções e passar a propor soluções. Nesse sentido, é esperado que faça parte dessa formação: Compreender os tipos de modelagem geométrica. Estudar as operações booleanas para gerar objetos geométricos. Aprender sobre a exibição de modelos sólidos. Conhecer os conceitos e algoritmos de iluminação. Ao longo do texto, vamos apresentar conceitos relacionados a cada um destes pontos. Vamos explorar ainda o aplicativo TinkerCad, para modelarmos figuras geométricas tridimensionais. Ao final destes estudos, explicaremos, por meio de um exemplo prático, como você pode modelar e exibir um cubo, usando OpenGL em Phyton. • • • • • • • • 1. Representações de modelagens de objetos Tipos de representação Representação aramada ou por wireframe A representação aramada, também conhecida por modelo wireframe, é a representação visual de um objeto físico tridimensional através de um conjunto de arestas que demarcam as bordas do objeto. Isso significa que para representar um objeto através da representação aramada precisamos especificar cada aresta do objeto físico (BUSS, 2003). Veja um exemplo de representação representada por aramada a seguir. Exemplo da representação por aramada. No caso, tivemos que especificar as coordenadas dos vértices, como podemos ver a seguir: Já a relação entre as arestas é dada da seguinte forma: Número do vértice 1 2 3 4 5 6 7 8 Coordenadas (X,Y,Z) (1, -1, -1) (1, 1, -1) (-1, 1, -1) (-1, -1, -1) (1, -1, 1) (1, 1, 1) (-1, -1, 1) (-1, 1, 1) Aresta 1 2 3 4 5 6 7 8 9 10 11 12 Vértice origem 1 1 1 2 2 3 3 4 5 5 6 7 Vértice destino 2 3 5 4 7 4 6 8 6 7 8 8 Como podemos ver no exemplo, o objeto foi desenhado através de linhas que fazem a conexão local de cada borda. Há vantagens e desvantagens em modelos representados por wireframe. Veja cada uma delas agora: Representação por faces (winged edge) Nessa técnica, um modelo é definido por um conjunto de polígonos que delimitam uma região fechada do espaço. Na imagem a seguir, apresentamos um exemplo de uma subdivisão plana. Exemplo de representação winged edge. Podemos identificar que: As arestas são representadas pelo conjunto A = [a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11]. Os vértices são representados pelo conjunto V = [v1, v2, v3, v4, v5, v6, v7, v8]. As faces são representadas pelo conjunto F = [f1, f2, f3, f4, f5]. Polígonos são figuras geométricas planas fechadas, formadas por segmentos de retas, denominados lados dos polígonos. Se todos os lados forem iguais, diz-se que é um polígono regular. As relações entre vértices, arestas e faces são apresentadas a seguir: Representação parcial de uma winged edge. Na imagem, temos a seguinte interpretação: Ai representa a aresta – por exemplo, a aresta a1. Vantagens Permite a construção e a manipulação de sólidos e de superfícies sólidas. Por se tratar de uma representação simples, ela possui como característica ser veloz na exibição dos modelos. Desvantagens Ambiguidade na representação de sólidos, o que significa que na exibição do modelo podemos ter mais de uma interpretação. Operações como as de determinação de massa e de volume, por exemplo, são bastante difíceis com esse modelo. • • • • • • • • V1 e V2 representam os vértices de uma aresta – por exemplo, a aresta a2 é definida pelos vértices v2 e v3. F1 e F2 são as faces adjacentes a uma aresta – por exemplo, as faces f2 e f5 são adjacentes à aresta a3. A1, A2, A3 e A4 representam as arestas adjacentes a uma determinada aresta. Por exemplo, as arestas a8, a1, a11 e a3 são adjacentes à aresta a2. As faces – que são polígonos – definem o interior do modelo. O objeto obtido por essa representação é chamado de poliedro. As faces, portanto, podem ser representadas através de uma lista cujos elementos são os vértices. Os vértices, por sua vez, podem ser representados por suas coordenadas explícitas, ou como um ponteiro para uma lista de vértices que armazenem detalhes sobre os vértices. A ideia é que a representação pela estrutura de dados contenha informações sobre a topologia da figura. Representação por quadtrees Quadtrees são árvores usadas para armazenar dados de figuras em um espaço bidimensional (BUSS, 2003). A principal característica dessa árvore é que cada nó tem no máximo quatro filhos. Para construir uma quadtree, devemos realizar as seguintes etapas: Primeira etapa Dividir o espaço bidimensional em que a figura está em quatro caixas. Segunda etapa Caso uma caixa contenha um ou mais pontos, devemos criar um objeto filho, armazenando nele o espaço bidimensional da caixa. Terceira etapa Caso uma caixa não contenha ponto algum, o processo de criação de nós filhos para a caixa deve ser interrompido. Quarta etapa O processo deve ser repetido até que o processo de criação de nós filhos seja interrompido para todas as caixas. Apresentamos, a seguir, um exemplo de aplicação de uma quadtree para armazenar uma figura bidimensional. Veja: • • • Exemplo de quadtree. Devemos perceber que a imagem da esquerda é dividida em 4 caixas. Na quadtree, essas caixas estão representadas pela numeração que corresponde às regiões demarcadas da imagem. No caso da região 1, não foi necessário fazer ramificações na caixa 1 da quadtree. No caso da região 3, tivemos que ramificar a respectiva caixa na quadtree de modo a representá-la adequadamente. Algumas das aplicações das quadtrees são: Compressão de imagens As informações sobre cores de um objeto são armazenadas em um de seus filhos (quanto maior for a profundidade da árvore, mais detalhes serão exibidos na imagem). Busca de nós em uma área bidimensional Utilizada para encontrar o ponto mais próximo de determinadas coordenadas. Representação por octrees Uma octree é definida como uma estrutura de dados em árvore na qual cada nó interno está associado a exatamente oito filhos (BUSS, 2003). Elas são utilizadas para representar figuras tridimensionais através de partições, subdividindo-as recursivamente em oito octantes. O comportamento das octrees é semelhante ao das quadtrees. Apresentamos, a seguir, um exemplo de uma octree: Exemplo de octree. No segundo nível da árvore, representamos a primeira partição em oito octantes. Em seguida,precisamos continuar a fazer partições para cada nó até a precisão que desejarmos da representação da imagem original. As octrees são utilizadas em diversas aplicações. Entre elas, podemos destacar: Renderização detalhada em computação gráfica 3D. Indexação espacial. Busca por nós vizinhos mais próximos. Detecção de colisão eficiente em três dimensões. Análise de elementos finitos. Representação por BSP O Binary Space Partitioning (BSP) é uma representação através do particionamento de espaço binário (BUSS, 2003). Ele é implementado para subdividir recursivamente um espaço em dois conjuntos convexos usando hiperplanos como partições. Atenção Uma região é dita convexa quando qualquer segmento de reta que tenha as extremidades dentro da região tem todos os seus pontos dentro da região. Esse processo de subdivisão dá origem à representação de objetos dentro do espaço na forma de uma estrutura de dados em árvore conhecida como árvore BSP. Na imagem a seguir, apresentamos um exemplo de BSP. Exemplo de BSP. A estrutura de uma árvore BSP permite informações espaciais sobre os objetos em uma cena que são úteis na renderização, em que objetos são ordenados da frente para trás em relação a uma visualização em determinado local. O particionamento de espaço binário é tratado como um processo genérico de dividir recursivamente uma cena em duas até que o particionamento satisfaça um ou mais requisitos. Pode ser visto como uma generalização de outras estruturas de árvores espaciais, como árvores octrees. As árvores BSP são usadas na detecção de colisões em videogames 3D e robótica, no traçado de raios (ray tracing) e tratamento de cenas espaciais complexas. Entre as desvantagens do BSP estão: A geração de uma árvore BSP pode ser demorada. O BSP não resolve o problema da determinação da superfície visível. Técnicas de modelagem geométrica matemática Efeitos naturais 1. 2. 3. 4. 5. 1. 2. O método matemático de modelagem usa uma descrição matemática e algoritmos para gerar um objeto. Ela pode ser feita com o auxílio de programas de computador. Nesse caso, temos a chamada Engenharia Assistida por Computador (CAE). Trata-se de um assunto que compreende o Design Auxiliado por Computador (CAD) e a Manufatura Auxiliada por Computador (CAM). Confira um exemplo: Design Auxiliado por Computador. No caso do CAD, ele é subdividido em: Análise de elementos finitos Desenho auxiliado por computador Modelagem geométrica por computador A ideia é de representar a matemática da geometria de um objeto usando software. O modelo geométrico precisa conter a descrição da forma do objeto modelado. As formas geométricas são descritas por superfícies. A modelagem geométrica por computador usa curvas para controlar as superfícies do objeto, pois são fáceis de manipular. As curvas podem ser construídas através de: Funções analíticas. Um conjunto de pontos. Outras curvas e superfícies. Existem vários softwares que permitem que a descrição matemática do objeto seja exibida como uma imagem no monitor, como as aplicações TinkerCAD, FreeCAD, BlocksCAD, Creo, Fusion 360°, Solidworks, AutoCAD, CATIA, OpenSCAD e Rhino. Para criar um modelo geométrico de um objeto em uma aplicação CAD, devemos seguir estes passos: Criar objetos geométricos básicos através de pontos, linhas e círculos. Usar comandos para realizar operações geométricas, tais como escalonamento e rotações para transformar esses elementos geométricos. Combinar os vários elementos do objeto para formar o modelo geométrico final. Algumas técnicas empregadas para modelagem geométrica, segundo BUSS (2003), estão descritas a seguir. • • • • • • • • • 1 Instanciamento de primitivas A partir de um conjunto de formatos sólidos primitivos, podemos gerar uma família de sólidos que variam em relação a alguns parâmetros. Além disso, é possível criar objetos a partir de transformações geométricas aplicadas nas primitivas. 2 Combinação de objetos Essa técnica é empregada para criar objetos a partir da combinação de objetos conhecidos, além de aplicar as operações booleanas de união, intersecção e diferença para combinar objetos. É importante destacar que a aplicação de operações booleanas pode gerar representações inválidas de objetos geométricos. 3 Varredura O objeto sólido é representado por uma região e por um caminho diretor, então o sólido é gerado pela varredura dessa região através do caminho diretor. 4 Varredura por extrusão O objeto é obtido pela translação (deslocamento) por determinada distância em relação a uma superfície específica através de um vetor. 5 Varredura rotacional Descrevemos a superfície do objeto por uma superfície, ou curva, que gira em torno de um eixo. Scanners 3D A modelagem automática é uma técnica sofisticada e rápida. Ela faz uso de equipamentos especiais como scanners 3D, nos quais é possível obter o modelo tridimensional de quase todos os objetos. Scanners 3D É um instrumento que permite reconstruções sem contato, mesmo de objetos de geometrias complexas. Essas reconstruções são geradas na forma de modelos 3D poligonais. Essa técnica possui interessantes aplicações, como a reconstrução e otimização de componentes. No caso da reconstrução poligonal realizada por um scanner 3D, pode ser usado como base para um procedimento denominado engenharia reversa, que permite reconstruir o modelo CAD do componente que estamos analisando. Isso é muito útil para refazer as especificações de um projeto original, quando existem limitações de acesso às especificações originais. A forma mais efetiva dessa técnica é a digitalização 3D usando scanners ópticos 3D sem contato. Scanners ópticos 3D É um instrumento que permite reconstruções de qualquer objeto real. O seu resultado é entregue em termos de modelos digitais poligonais – malhas triangulares ou nuvens de pontos – que representam a superfície do objeto digitalizado. Veremos a seguir algumas aplicações em que as técnicas de modelagem geométrica automática são aplicadas. Indústria da construção e engenharia civil No controle de robôs em que um scanner pode ser usado para fornecer informações sobre o ambiente; desenhos de pontes e instalações industriais; e na documentação de locais históricos. Processo de design Pode ser usado para aumentar a precisão de peças e formas complexas e dar uma visão mais realística de plantas para os engenheiros, por exemplo. Entretenimento Usar scanners 3D para a indústria do entretenimento para criar modelos 3D digitais para filmes e videogames, por exemplo. Análise forense Documentar cenas de crime, refazer trajetórias de balas, analisar padrões de manchas de sangue, entre tantas outras aplicações. Geometria sólida construtiva (CSG) A geometria sólida construtiva (CSG, do inglês, constructive solid geometry) é uma das técnicas para modelagem de sólidos por meio das seguintes operações booleanas (FERGUSON, 2001): União A operação união, representada pelo símbolo, é a combinação de objetos tais que as características predominantes de ambos são mantidas. Na imagem a seguir, apresentamos um exemplo no qual fazemos a união de um objeto quadrado e um círculo e obtemos um novo objeto resultante dessa combinação. Diferença A operação diferença, representada pelo símbolo “ - ”, é a subtração de dois objetos, onde o primeiro objeto é o subtraendo e o segundo é o minuendo. Nesse caso, as características do minuendo são removidas do objeto subtraendo. Na figura a seguir, apresentamos um exemplo no qual fazemos a diferença de um objeto quadrado (subtraendo) e um círculo (minuendo) e obtemos um novo objeto resultante dessa diferença. Interseção A operação de interseção, representada pelo símbolo , é a interseção de objetos tais que apenas as características em comum de ambos são mantidas. Na imagem a seguir, apresentamos um exemplo no qual fazemos a interseção de um objeto quadrado e um círculo e obtemos um novo objeto resultante dessa operação. Portanto, o princípio básico da GSC implicaa construção de um modelo complexo a partir de um conjunto de primitivas através de uma série de operações booleanas. Na imagem a seguir, apresentamos exemplos de primitivas. Exemplos de sólidos primitivos. Da esquerda para a direita, temos um cubo, uma esfera, um cilindro e um cone. Através da aplicação das operações booleanas para esses sólidos primitivos, podemos obter novas figuras geométricas complexas. Técnicas de modelagem geométrica manual A modelagem geométrica manual é um método que representa modelos através das medidas de um modelo real considerando a escala e visão de perspectivas. Essa técnica tem grande dependência das habilidades do modelador, mas, ainda assim, é bastante usada para fazer esboços. Em especial, nas etapas iniciais dos processos de criação de ferramentas, veículos e ambientes. Inicialmente, inclusive, foi bastante usada para conceber e testar novos modelos pelas indústrias automobilística e aeronáutica. Os projetos desenvolvidos por essa técnica são registrados em um esboço que, por sua vez, faz a representação gráfica das ideias do projeto. Portanto, os objetos precisam ter características geométricas bem definidas, tais como altura, largura e profundidade, e demais características relevantes. Um esboço deve: Ser compreensível Ser simples Manter as relações de proporcionalidade entre as dimensões Em projetos de desenho técnico, por exemplo, a representação gráfica do desenho em si deve ser elaborada em conformidade com as recomendações das normas internacionais. No Brasil, há normas específicas editadas pela Associação Brasileira de Normas Técnicas (ABNT), sendo as normas a seguir consideradas as principais: NBR 8403/84 – Aplicações de linhas e tipos de largura. NBR 10068/87 – Folha de desenho – leiaute e dimensões NBR 10126/87 – Cotagem em desenho técnico NBR 6492/94 – Representações de projetos de Arquitetura NBR 8196/99 – Emprego de escalas NBR 13142/99 – Dobramento de cópia Essas normas servem para padronizar a elaboração de desenhos e, desse modo, facilitar o entendimento dos envolvidos no projeto. Exploração de operações e exemplos com TinkerCard (Free on-line) Agora, vamos demonstrar a aplicação das operações booleanas para geometria de sólidos. Para isso, vamos utilizar o TinkerCad para criar projetos. Para conseguir executar os exemplos que vamos apresentar, é necessário criar uma conta gratuita no TinkerCad. Basta acessar o site do TinkerCad e abrir uma conta. Feito isso, agora vamos criar nosso projeto. Primeiro passo Na tela inicial, clique no botão “Criar novo design” para abrir a tela de criação de projetos. • • • • • • • • • Segundo passo Na tela de criação de projetos, a parte apontada por “1” é chamada de plano de trabalho e a parte apontada por “2” é onde podemos selecionar objetos e adicioná-los no plano de trabalho. Agora, selecionamos um cubo e o adicionamos ao plano de trabalho. Terceiro passo Com algumas operações básicas, transformamos o cubo em um paralelepípedo. Clicamos sobre ele para abrir a lista de configurações. Depois, escolhemos o preenchimento do sólido por “orifício” que deixa a figura transparente. Em seguida, configuramos altura, comprimento e largura. Já criamos nosso primeiro projeto. A seguir, vamos apresentar exemplos de aplicação das operações booleanas no TinkerCad. Para isso, utilizaremos um cubo e uma esfera. Seleção dos sólidos primitivos. Vamos começar pela união de dois sólidos. Primeiro passo Nosso primeiro passo é mudar a altura da esfera obtendo um objeto oval chamado de elipsoide. Em seguida, fazemos o alinhamento do elipsoide com o cubo. Segundo passo Depois, combinamos os dois sólidos. Terceiro passo Em seguida, fazemos a união das figuras através da opção de agrupamento. Quarto passo Finalmente, obtemos a união dos dois sólidos. Vamos apresentar, agora, como fazer a interseção entre dois sólidos. Primeiro passo O primeiro passo é adicionar os sólidos ao plano de trabalho. Neste caso, colocamos um cubo e uma esfera. Segundo passo Em seguida, fazemos o alinhamento dos sólidos. Terceiro passo Feito isso, vamos combinar os sólidos. Quarto passo Agora, precisamos desagrupar os sólidos. Para isso, selecionamos a figura geométrica e, no menu, clicamos na opção “desagrupar”. Quinto passo Em seguida, precisamos selecionar a esfera e, após isso, selecionar a opção “orifício. Sexto passo Vamos selecionar novamente os sólidos e agrupá-los. Sétimo passo A ideia, agora, é combinar essa figura com um cubo e, depois, removê-la, obtendo a interseção entre o cubo e a esfera. Então, o próximo passo é adicionar um cubo ao plano de trabalho. Oitavo passo No próximo passo, fazemos o alinhamento entre o sólido da figura anterior e o cubo. Nono passo Então, fazemos a combinação dos sólidos. Décimo passo Precisamos desagrupar os sólidos. Décimo primeiro passo Em seguida, selecionamos qualquer um dos vértices do sólido e a opção “orifício”, para que fique transparente. Décimo segundo passo Novamente, selecionamos os sólidos e fazemos o agrupamento. Décimo terceiro passo Finalmente, temos o resultado da interseção do cubo com a esfera. Agora vamos mostrar como fazer a diferença entre um cubo e uma esfera. Primeiro passo O primeiro passo é adicionar os sólidos ao plano de trabalho. Segundo passo Em seguida, fazemos o alinhamento dos sólidos. Terceiro passo Agora, fazemos a combinação dos sólidos. Quarto passo Devemos selecionar a esfera e a opção “orifício”, para que ela fique transparente. Quinto passo Depois, precisamos selecionar ambos os objetos e agrupá-los. Sexto passo Finalmente, temos a diferença entre o cubo e a esfera. Modelagem de objetos Neste vídeo, abordaremos os elementos da modelagem de objetos e o programa TinkerCad, a partir da abordagem de elementos como aramada, representação por faces e por quadtrees, e muito mais. Conteúdo interativo Acesse a versão digital para assistir ao vídeo. Verificando o aprendizado Questão 1 Uma das representações geométricas de sólidos é a aramada, também conhecida como wireframe. Essa representação é bastante utilizada, pois é simples do ponto de vista computacional e, de fato, bastante útil na modelagem geométrica. A respeito da representação wireframe, selecione a opção correta. A A estrutura de dados para armazená-la precisa lidar com os vértices, ligações entre eles e com os níveis das cores. B A representação aramada utiliza informações sobre vértices e arestas para exibir sólidos. C Por ser simples, a estrutura de dados associada à representação wireframe também é simples, precisando apenas armazenar informações relativas às arestas. D Uma das principais vantagens da representação wireframe é a forma única que ela utiliza para exibir um sólido, evitando, assim, ambiguidades de interpretação. E A representação aramada só deve ser aplicada para descrever objetos sólidos. A alternativa B está correta. A representação de sólidos por wireframe faz uso de uma estrutura de dados que tenha informações sobre vértices e arestas do objeto desenhado. Apesar de sua simplicidade, ela possui problemas relacionados à ambiguidade e determinação de características físicas, tais como massa e volume. Questão 2 Uma das representações de figuras geométricas é a representação por faces ou winged edge. Nessa representação as faces são polígonos. A respeito da representação por faces, selecione a opção correta. A A estrutura de dados que trata dessa representação precisa, obrigatoriamente, representar os polígonos como combinações de triângulos. B A representação por faces é a forma mais eficiente para exibir sólidos. C Na representação por faces é essencial que a estrutura de dados tenha informações que representem os polígonos e a topologia deles. D A principal característica da estrutura de dados associada à representação por faces é de fazer uso apenas de informações posicionais dos pontos das faces, aumentando, assim, sua eficiência computacional. E A representação por faces deve ser utilizadaapenas para representações tridimensionais. A alternativa C está correta. A representação de faces utiliza informações a respeito das ligações entre os vértices das faces da figura sólida. Dessa forma, é essencial que a estrutura de dados tenha informações sobre os vértices e as ligações entre eles, de modo que seja possível reconstruir os polígonos que são as faces. 2. Técnicas de rasterização Exibição dos modelos sólidos O projeto de modelos de geometria sólida (CSG) envolve dois seguintes aspectos (FERGUSON, 2001): A matemática para representação das superfícies e sua especificação. A organização do modelo (questões como a composição e as relações entre os sólidos, conforme especificado por suas dimensões). Além disso, ainda é necessário tratar o melhoramento da qualidade do sólido, o que, normalmente, é chamado de refinamento. Portanto, para tratar essas questões de modelagem, precisamos entender como funcionam os métodos gráficos interativos. Um desses métodos é o de manipulação direta, que permite que o usuário interaja com entidades geométricas por meio de sua representação visual na tela. Os métodos para visualização de sólidos podem ser divididos em duas categorias, a saber: Métodos baseados em avaliação de fronteiras Utilizam algoritmos de visualização aplicáveis a modelos de fronteiras – chamados, normalmente, de B-reps, que é um acrônimo para boundary representation. Para isso, eles aplicam um algoritmo de conversão de representações CSG para obter as respectivas representações B-reps. Esse processo é conhecido por "avaliação de fronteiras" – do inglês: boundary evaluation. Um sólido é representado como uma coleção de elementos de superfície conectados em um modelo que compreende componentes como faces, arestas e vértices e as conexões entre eles, juntamente com definições geométricas, tais como superfícies, curvas e pontos, respectivamente, para esses componentes. Métodos de visualização direta Obtêm uma imagem de um sólido CSG usando apenas as informações que estão contidas na própria representação. Os algoritmos de exibição direta, do inglês direct display algorithms, exibem um modelo CSG sem convertê-lo para um modelo de representação por fronteiras que usa um conjunto de pontos que compõem um sólido para representar seus limites, cuja representação, normalmente, é um conjunto de faces. Rasterização Rasterização de retas A rasterização é a técnica de converter uma imagem representada em um formato de gráfico vetorial em um conjunto de pixels para saída em uma tela (BUSS, 2003). Imagens vetoriais são feitas de pontos, linhas e curvas. Exemplos de programas para esse tipo de representação são o Adobe Illustrator, CorelDRAW e Inkscape. Imagens rasterizadas são formadas de pixels. Cada pixel é responsável por uma cor. As imagens representadas por vetor não dependem da resolução da tela, enquanto imagens rasterizadas têm dependência da resolução. 1. 2. Atenção Quando modificamos o tamanho de uma imagem rasterizada, vamos aumentar ou diminuir os pixels, o que pode significar perda de qualidade. Precisamos estabelecer algumas premissas para aplicar a rasterização com linhas. Veja: A largura de uma linha é de 1 pixel. Cada pixel estará em apenas um dos estados: ativo ou desativado. O sistema de coordenadas que usamos é o de pixels na tela. Na imagem a seguir, apresentamos um exemplo de uma tela com seus respectivos pixels e com o sistema de coordenadas em destaque. Exemplo de pixels. Os símbolos “+” estão no centro de cada pixel e, a cada um deles, associamos valores inteiros. O ponto a é dado aproximadamente por a(1,6;1,2), ou seja, 1,6 na horizontal e 1,2 na vertical, e o ponto b é dado por b(4,9;2,9). Para fazer a rasterização, precisamos encontrar o pixel mais próximo verticalmente da linha em cada coluna de pixels. Na imagem a seguir, mostramos como esse processo funciona. • • • Busca pelo pixel mais próximo. Na imagem podemos observar os passos a seguir: Passo 1 Representado por P1 – o pixel mais próximo da linha é o (2;1). Passo 2 O pixel mais próximo da linha é o (3;2). Passo 3 O pixel mais próximo é o (4;3). Então, podemos ver o resultado da rasterização na imagem que se segue, com os pixels selecionados na rasterização destacados em verde. Resultado da rasterização. Os principais algoritmos para rasterização de retas são: Algoritmo de linha incremental Algoritmo baseado no erro Algoritmo de Bresenham Algoritmo do ponto médio Rasterização de polígonos Polígonos são figuras pertencentes ao espaço bidimensional com as seguintes características: Possuem arestas ou bordas que são segmentos de linha, definidos por dois vértices (pontos finais). São formados por um conjunto de arestas, tal que cada vértice é compartilhado exatamente por duas arestas. São chamados de polígonos simples se as suas arestas não têm interseção entre si. Veja uma comparação entre polígonos: Polígonos simples (sem interseção das arestas) • • • • • • • Polígonos não simples A rasterização de polígonos é o processo de transformação de um polígono – ou seja, uma região plana fechada delimitada por segmentos de retas – em um conjunto de pixels conexos. O algoritmo mais conhecido de rasterização de polígonos é o ScanLine (BUSS, 2003), também conhecido como técnica de varredura. Um conceito importante nesse contexto de rasterização é o de coerência espacial. No trabalho de Sutherland, Sproull e Schumacker (1974), os autores apresentaram diversos tipos de coerências que os algoritmos de visibilidade podem explorar. A seguir, veremos alguns exemplos. Coerência de aresta A visibilidade da aresta muda quando cruza outra aresta ou quando passa por uma aresta visível. Coerência do objeto Os objetos são separados entre si. Coerência de face As propriedades gráficas de uma face devem variar de forma suave, pois transições bruscas são interpretadas como fronteira de duas faces. Coerência de área É usada para agrupar pixels cobertos por uma mesma face visível. Coerência de profundidade A profundidade da superfície em um ponto é calculada, enquanto a profundidade dos demais pontos da superfície pode ser determinada por uma equação de diferença simples. Coerência da linha de varredura Uma determinada linha de varredura (scanline) e a sua linha de varredura sucessora possuem pequena variação das propriedades geométricas. Coerência do quadro É usada para objetos animados, quando há pouca mudança na imagem de um quadro para outro. Coerência de borda implícita Se uma face entra em outra, a linha de interseção pode ser determinada a partir de dois pontos de interseção. O algoritmo ScanLine leva em consideração alguns desses tipos de coerência espacial e, assim, determina, linha por linha, os pixels dentro de uma região – ou seja, faz a varredura dos pixels – com uso dos seguintes fatos: Os pixels das fronteiras – ou seja, das arestas – do polígono podem ser obtidos com uso dos algoritmos de rasterização de linhas (ou retas). Em uma linha de varredura, os pixels podem ser divididos em grupos separados em relação aos pixels que fazem interseção com a fronteira do polígono e os que não possuem interseção. Na mesma linha de varredura, podem existir pixels que pertencem ao interior de um polígono e os que não pertencem. Na próxima imagem, apresentamos um exemplo da aplicação do algoritmo de ScanLine para a rasterização de um polígono. Exemplo de aplicação do algoritmo ScanLine. Como podemos perceber, a imagem rasterizada apresenta bordas serrilhadas – do inglês jagged ou stair step pattern. Esse é um dos principais problemas encontrados nos processos de rasterização. Preenchimento de polígonos • • • Os polígonos são os elementos fundamentais para que possamos representar figuras na tela do computador. Para preenchê-los com cores, temos alguns algoritmos que podemos utilizar. Os mais conhecidos para essa finalidade são os algoritmos de: Preenchimento de bordas Do inglês boundary fill, o algoritmo de preenchimento de borda apresentauso limitado, pois o seu custo computacional, ou seja, de processamento, torna-o inadequado para tratar problemas em tempo real. Preenchimento por varredura Mais conhecido por algoritmo ScanLine, é o algoritmo mais usado para preenchimento de polígonos. Na seção anterior, já fizemos uma introdução sobre o algoritmo ScanLine. Agora, vamos entender melhor alguns dos conceitos que ele utiliza e um exemplo de como é o seu funcionamento. O algoritmo ScanLine faz o preenchimento de polígonos usando linhas horizontais, chamadas de scanlines. O objetivo desse algoritmo é preencher os pixels internos de um polígono. A seguir, apresentamos um exemplo de funcionamento do algoritmo. Exemplo de funcionamento do ScanLine. Na imagem, podemos ver que a scanline é a linha horizontal que passa pelo ponto (0;7) do plano cartesiano. Além disso, os segmentos que vão de x = 2 até x = 4 e os de x = 10 até x = 14 são dos pixels internos ao polígono. O processo de varredura é feito até que todo o polígono seja avaliado. Apresentamos na próxima imagem o resultado do algoritmo. Resultado do ScanLine. A estrutura para esse algoritmo precisa conter as informações descritas a seguir. Tabela da lista de arestas Mantém o registro de todas as arestas, armazenando suas coordenadas. Tabela de arestas ativas Contém todas as arestas (bordas) do polígono que são interceptadas pela scanline atual.As arestas são inseridas na tabela de maneira ordenada (valor crescente de x). Tabela de polígonos Consiste em informações a respeito do polígono, como cor da superfície, por exemplo. Remoção de linhas e superfícies escondidas A remoção de partes ocultas de imagens de objetos sólidos é um desafio da computação gráfica. No mundo físico, os raios de luz são obstruídos por causa do material opaco desses objetos e, assim, não conseguimos visualizar partes deles. No caso do computador, não é feita nenhuma eliminação automática quando os objetos são projetados no sistema de coordenadas da tela. Ao contrário disso, todas as partes dos objetos são exibidas, inclusive as que deveriam estar ocultas. Então, para remover essas partes e criar imagens mais próximas da realidade, devemos aplicar uma linha oculta, ou um algoritmo de superfície oculta, ao conjunto de objetos. Atenção O algoritmo precisa estar habilitado para operar em diferentes tipos de cena, além de ter que gerar várias formas de saída e tratar com imagens de diferentes níveis de complexidade. Algoritmos que tratam da remoção de linhas e superfícies ocultas usam classificação geométrica para distinguir as partes visíveis dos objetos daquelas que estão ocultas. A classificação geométrica localiza objetos próximos ao observador e, portanto, são visíveis. Os algoritmos de remoção de linhas e de superfícies ocultas utilizam várias formas de coerência para minimizar o processamento necessário para gerar uma imagem. As diferentes formas de regularidades nas imagens estão relacionadas aos diferentes tipos de coerência. Buss (2003) apresenta a seguir a classificação de alguns dos algoritmos de detecção de superfícies ocultas. Métodos de espaço de objeto Compara várias partes de objetos. Após a comparação, as superfícies visíveis e ocultas são determinadas. Na representação por wireframe, eles são usados para determinar se uma linha é visível. Portanto, esses algoritmos são baseados em linha, em vez de superfície. Métodos de espaço de imagem Determina as posições dos pixels. É usado para localizar a superfície visível em vez de uma linha visível. Cada ponto é detectado por sua visibilidade. Se um ponto estiver visível, o pixel está ativado, caso contrário, será desativado. Alguns dos principais algoritmos usados para detecção de superfície de linha oculta são: Algoritmo de remoção da face posterior Algoritmo Z-Buffer Algoritmo do Pintor Algoritmo de linha de varredura Algoritmo de subdivisão Algoritmo de horizonte flutuante Rasterização Neste vídeo, abordaremos a exibição dos modelos sólidos e a rasterização de retas e polígonos, além do preenchimento de polígonos. Conteúdo interativo Acesse a versão digital para assistir ao vídeo. Verificando o aprendizado Questão 1 • • • • • • Os algoritmos de rasterização têm como objetivo fazer a conversão de uma imagem vetorial para uma representação por pixels. Uma das importantes características que eles exploram é a da coerência que trata de diversos aspectos. Em relação à coerência aplicada ao contexto de computação gráfica, selecione a única opção correta. A Quando uma aresta cruza com outra aresta, é necessário tratar, explicitamente, se ela será visível ou não. É um caso de coerência de visibilidade. B A coerência do objeto afirma que os objetos são separados. C Quando a face de um objeto sólido varia de forma brusca, sabemos que a coerência de face foi contemplada. D Quando uma área é coberta, não é necessário guardar seus pixels, o que otimiza bastante o processo de renderização. Trata-se de um caso de coerência de área. E A coerência de profundidade trata do cálculo de todos os pontos de uma superfície. A alternativa B está correta. A coerência do objeto trata das relações entre objetos distintos ou entre partes separadas dos mesmos objetos. Questão 2 Os métodos para visualização de sólidos podem ser divididos nos métodos baseados em avaliação de fronteiras e os de visualização direta. Ambos os métodos possuem pontos fortes e fracos. Em relação a esses métodos, selecione a opção correta. A Os métodos baseados em avaliação de fronteiras (B-reps) representam os sólidos através dos pontos, arestas e superfícies. B Os métodos de avaliação de fronteiras, também conhecidos com B-reps, que significa representação do espaço binário, usam uma árvore binária para representar a topologia de um sólido. C Os métodos de visualização direta utilizam de informações do ambiente em que o sólido está para representá- lo com mais detalhes. D Os algoritmos de exibição direta fazem primeiro a conversão de uma imagem de um sólido para um modelo de representação por fronteiras. E Nos métodos de avaliação de fronteiras, um sólido é representado como um conjunto de expressões booleanas de objetos sólidos primitivos. A alternativa A está correta. Os métodos de avaliação de fronteiras representam os sólidos através da descrição da superfície deles como uma estrutura de dados composta de vértices, arestas e faces. 3. Algoritmos de iluminação Emissores A iluminação e o sombreamento são ferramentas importantes para fazer com que as imagens gráficas pareçam mais realistas e mais compreensíveis. Eles podem fornecer informações sobre a curvatura e a orientação das superfícies e são importantes para tornar a tridimensionalidade aparente em uma imagem gráfica. Modelos de iluminação em computação gráfica são baseados em uma abordagem modular. Dessa forma, podemos especificar: As posições e propriedades das fontes de luz. As propriedades de superfície dos materiais. As propriedades das luzes e os materiais interagem para criar iluminação, cor e sombreamento observados de determinado ponto de vista. A natureza da luz emitida por uma fonte e sua interação com todos os objetos de uma cena são definidos por um modelo de iluminação de computação gráfica. Precisamos, agora, apresentar a classificação da emissão de luz e dos tipos de iluminação. Em relação à emissão de luz, podemos classificar os objetos das maneiras apresentadas a seguir. Fontes de luz própria O sol e as lâmpadas, por exemplo. Refletores Objetos com cores e propriedades ao longo da sua superfície. Agora, em relação aos tipos de iluminação, podemos classificar as luzes das formas indicadas a seguir. Ambiental Em que todas as superfícies do ambiente são iluminadas da mesma forma, portanto, a posição da câmera não é relevante. Direcional Onde os raios de luz são paralelos e de mesma intensidade. É uma simulação da emissão dos raios solares. Dependendo da orientação da superfície, é possível perceber seus efeitos. PontualOs raios de luz são emitidos em todas as direções. Nesse caso, os objetos são atingidos com diferentes direções e intensidades. Isso significa que há uma variação da iluminação nas diversas partes do objeto, dependendo da direção e da distância da fonte de luz. Refletora Aqui a emissão dos raios de luz ocorre na forma de um cone apontado para uma direção. Conforme o raio de luz se distancia da fonte, a intensidade da luz diminui. • • O modelo de iluminação e sombreamento para computação gráfica tridimensional mais popular é o de Phong (BUSS, 2003). Isso ocorre por ele ser aplicável para obter diversos efeitos visuais e devido à facilidade de implementá-lo de forma eficiente em software e hardware. É o principal modelo de iluminação para todos os hardwares gráficos de computadores pessoais, consoles de jogos e outros aplicativos em tempo real. Ele trata o modo como a luz é refletida nas superfícies. Nele, todas as fontes de luz são modeladas como fontes de luz pontual. Além disso, a luz é modelada em três componentes de cores discretas: Vermelho Verde Azul Isso significa que o modelo assume que toda luz consiste de um componente vermelho puro, um componente verde puro e um componente azul puro. Pelo princípio de superposição, podemos calcular as intensidades de reflexão da luz para cada fonte de luz de forma independente e para cada um dos três componentes de cor. Princípio de superposição Afirma que nos pontos onde ocorre a superposição, ou seja, mais de uma onda de luz é emitida, o efeito resultante é a soma dos efeitos que seriam produzidos pelas ondas que se superpõem, caso cada uma delas atingisse sozinha aquele ponto. Sombreamento (shading) É o processo de renderização que tem por objetivo calcular as cores dos objetos na cena tridimensional (WOO; POULIN; FOURNIER, 1990). Na renderização, o nosso objetivo é reproduzir a forma, a visibilidade e a aparência dos objetos vistos a partir de determinado ponto de vista. Renderização É o processamento que combina um material digitalizado, tais como imagens, vídeos ou áudio com legendas e efeitos. Esse processo faz a transformação de um ou mais arquivos em um único arquivo, fazendo, assim, a combinação dos diversos elementos e recursos com objetivo de melhorar a experiência do usuário. O sombreamento simula as cores dos objetos visíveis de determinado ponto de vista. O ponto de vista aqui desempenha um papel importante, pois a aparência dos objetos pode mudar com o ângulo de visão. A aparência de um objeto também depende de alguns parâmetros, tais como: Quantidade de luz na cena Orientação das superfícies em relação às fontes de luz na cena Cores dos objetos O sombreamento se baseia em leis da Física – que descrevem a maneira como a luz interage com a matéria – para simular a aparência de objetos de uma maneira consistente e realista. Na computação gráfica, uma função de sombreamento é definida como uma função que produz o valor da intensidade de cada ponto no corpo de um objeto a partir das características da fonte de luz, do objeto e da posição do observador (BUSS, 2003). O sombreamento também é chamado de tonalização. A ideia é calcular o nível do sombreamento dos objetos a partir de suas características e das fontes de luz. Veja a seguir os principais modelos de sombreamento, segundo Woo, Poulin e Fournier (1990). • • • Iluminação constante (flat) Uma região inteira obtém a cor de um de seus vértices. A cor de uma linha, um triângulo ou quadrilátero é determinada pela cor do último vértice especificado. O cálculo da reflexão da luz é feito apenas uma vez por superfície. Iluminação de Gouraud Faz o cálculo da reflexão da luz para cada vértice. Desse modo, cada face é resultado do gradiente entre os vértices. A iluminação dos outros pontos é calculada através da interpolação. O sombreamento possui uma qualidade mais suave e seu cálculo é mais demorado do que o modelo de iluminação constante. Iluminação de Phong Faz a interpolação linear dos vetores normais. Desse modo, seus efeitos são mais realistas. A desvantagem em relação aos outros modelos é que consome mais processamento. Um conceito importante no contexto de sombreamento é o de fotorrealismo, que trata da reprodução de características reais para uma imagem processada. Se o fotorrealismo é o objetivo, o sombreamento se preocupa em reproduzir a aparência de superfícies reais com um grau de precisão que o olho humano não pode mais fazer a diferença entre olhar para uma imagem reproduzida pelo computador e o objeto do mundo real. Outra possibilidade é a de renderização não fotorrealística, usada para criar ou simular estilos de renderização artística, tais como pintura a óleo, ou desenvolver estilos inteiramente novos que só podem ser explorados e gerados com computadores. Reflexão É o resultado do que acontece com um feixe de luz incidente quando ele atinge uma superfície reflexiva como vidro ou água, por exemplo. Na imagem, a seguir, apresentamos um exemplo de reflexão. Diagrama ilustrativo de reflexão de um feixe de luz. Onde: Representa o ângulo de incidência. Representa o ângulo de reflexão. É a reta normal perpendicular à superfície refletora. Pelas leis da reflexão, sabemos que α e ß são iguais e que fazem parte do mesmo plano os raios de luz incidente e refletido e a reta normal. Como já dissemos anteriormente, o modelo mais popular de iluminação é o modelo Phong. Esse modelo permite dois tipos de reflexão. Difusa A luz é refletida uniformemente em todas as direções da superfície. Esse é o modo de reflexão predominante para superfícies não brilhantes. Especular A luz é refletida de forma espelhada, como o que ocorre em uma superfície brilhante. A luz refletida especularmente deixa uma superfície com seu ângulo de reflexão aproximadamente igual ao seu ângulo de incidência. Essa é a principal característica da luz refletida em uma superfície polida. As reflexões especulares são a razão de existirem os pontos brilhantes em superfícies curvas onde ocorre uma reflexão especular intensa. Além de dividir a reflexão em duas categorias, o modelo de iluminação Phong trata da iluminação como sendo de três tipos distintos. Especular É a luz de uma fonte de luz pontual que será refletida de modo especular. Difusa É a luz de uma fonte de luz pontual que será refletida difusamente. Ambiente É a luz que chega igualmente de todas as direções, em vez de uma fonte de luz pontual. Refração Quando um raio de luz se move de um meio para outro, sua velocidade muda. Desse modo, a direção do raio de luz também pode mudar. Essa propriedade é chamada de refração. Na imagem a seguir, apresentamos um exemplo de refração. Diagrama ilustrativo da refração de um feixe de luz. O símbolo γ representa o ângulo de refração. Para calcular γ, precisamos calcular o índice de refração, representado por η, que é dado por: Onde: É a velocidade da luz no vácuo que é dada, aproximadamente, por . É a velocidade da luz no meio em que a luz é refratada, dada em metros por segundo. Dado que a velocidade da luz é maior no vácuo do que em qualquer outro meio, o índice de refração sempre será maior ou igual a 1. Agora, podemos enunciar as leis da refração. 1º lei Os raios de luz incidente e refratado, bem como a reta normal, pertencem ao mesmo plano, ou seja, são coplanares. 2º lei Conhecida como Lei de Snell-Descartes, é usada para calcular o desvio angular do raio de luz refratado, tal que a razão entre os senos dos ângulos de incidência (α) e refração (γ) é igual à razão entre as velocidades da luz nos meios incidente e refratado, ou seja: Aplicando algumas manipulações nessa equação, obtemos as relações válidas dadas por: Transparência É a propriedade física que alguns materiais possuem de permitir que a luz passe através deles com baixa dispersão. Isso significa que objetos transparentes têm um comportamento similar ao de filtros de luz. Exemplo Um objeto transparente vermelho que seja iluminado por uma fonte de luz deixará passar apenas luz vermelha,absorvendo todas as componentes de verde e azul. Então, se iluminarmos o objeto desse exemplo diante de uma parede, sua sombra vai aparecer em vermelho. Podemos ver através de um objeto transparente os objetos que estão do outro lado dele. A imagem que vemos através de um objeto transparente é semelhante à imagem que podemos ver sem ele. Contudo, se o objeto transparente se comportar como uma lente, ele pode alterar a forma como enxergamos os objetos através dele, como o tamanho ou a forma da imagem. Temos ainda dois conceitos importantes nesse contexto. Opacidade É exatamente o oposto de transparência, o que significa que objetos com essa propriedade não permitem que a luz passe por eles. Translucidez Ocorre quando a luz pode ser vista através de um objeto, mas com limitação dos detalhes. A luz passa por um objeto translúcido, mas o material espalha a luz, então não podemos ver o objeto, apenas sua sombra. Sombras Uma sombra é uma região de relativa escuridão dentro de uma região iluminada, causada por um objeto que obstrui total ou parcialmente a luz (GLASSNER, 1989). Uma região é considerada uma sombra se houver uma superfície que obstrua a emissão da luz para região de interesse. Atenção Uma sombra não é necessariamente uma região mais escura. Elas podem ser coloridas e aparecer de diferentes maneiras em uma cena. Se duas fontes de luz de cores diferentes forem usadas, uma região com obstrução de apenas uma fonte de luz por um objeto opaco ficará na sombra dessa fonte de luz, mas pode ser influenciada pela cor da segunda fonte de luz. Um objeto também pode atuar como um filtro. Nesse caso, a cor da região de sombra pode então depender do espectro de comprimento de onda filtrado por esse objeto. A difração de luz através de um objeto transparente é outra fonte possível de cor dentro de uma sombra. O cálculo das sombras é essencial para dar qualidade a uma imagem. As sombras fornecem informações sobre as formas, posições relativas e características da superfície dos objetos, além de indicar a localização aproximada, a intensidade, a forma e o tamanho das fontes de luz. Algoritmo de rastreamento de raios (ray tracing) O algoritmo de rastreamento de raios ou, como é mais conhecido, ray tracing, mapeia os raios de luz como se fossem lançados do olho do observador para o ambiente, a fim de realizar cálculos de superfície visível (GLASSNER, 1989). A ideia básica por trás do algoritmo é seguir os caminhos tomados pelos raios de luz, conforme eles viajam das fontes de luz, até que finalmente alcancem a posição do olho do observador. Como a maioria dos raios de luz nunca vai alcançar a posição dos olhos, o algoritmo traça os caminhos percorridos pelos raios de luz do olho. Dessa forma, não desperdiçamos tempo traçando raios que nunca alcancem o visualizador. Na próxima imagem, ilustramos o funcionamento do algoritmo ray tracing. Exemplo de ray tracing. Podemos destacar os seguintes elementos: Uma caixa e uma esfera representadas, respectivamente, por um retângulo e um círculo. Uma única fonte de luz. Uma janela de visualização. Um visualizador. • • • • O visualizador está olhando para a cena através da janela de visualização e nosso objetivo é renderizar a cena. Para determinar a cor de um pixel P na janela de visualização, um raio é traçado do olho do visualizador através do centro do pixel, e então determinamos o primeiro ponto de intersecção do raio com os objetos na cena. Na imagem, o raio cruzaria o retângulo e, em seguida, o círculo. Como o raio cruza o retângulo primeiro, significa que é isso que é visto através do pixel. O ponto de intersecção no retângulo é sombreado de acordo com um modelo de iluminação, e o resultado é o conteúdo do pixel P. Radiosidade É um algoritmo de iluminação global usado na renderização de gráficos tridimensionais de computador (GLASSNER, 1989). Os algoritmos de iluminação global rastreiam a propagação da luz difusa em torno de uma cena, geralmente resultando em sombras e reflexos mais suaves e naturais, diferentemente dos algoritmos de iluminação direta, como é o caso do ray tracing, que tende a simular a luz refletida apenas uma vez em cada superfície. O objetivo de um algoritmo de radiosidade é calcular os níveis de iluminação e brilho de cada superfície em uma cena. Ele é complementar aos métodos de ray tracing, pois os métodos de rastreamento de raio rastreiam o transporte global de luz refletida especularmente, enquanto a radiosidade rastreia o transporte global de luz refletida difusamente. A radiosidade é muito melhor em cenas suavemente iluminadas com sombras de cores sutis, enquanto o traçado de raios é melhor para renderizar sombras nítidas. Iluminação Neste vídeo, abordaremos as classificações dos emissores, a análise de reflexão, a refração e o ray tracing. Conteúdo interativo Acesse a versão digital para assistir ao vídeo. Verificando o aprendizado Questão 1 A iluminação é um dos aspectos mais importantes na computação gráfica para obter realismo. Entre os diversos assuntos que precisamos estudar sobre a iluminação estão a classificação em relação aos tipos de iluminação. A respeito dos tipos de iluminação, selecione a opção correta. A Pode ser ambiental em que o ponto de vista da câmera influencia na captura de características do objeto sob análise. B Quando a intensidade e as características do ambiente são relevantes, diz-se que o tipo de iluminação é direcional. C Quando os raios luminosos são emitidos em todas as direções, diz-se que o tipo de iluminação é pontual. D Pode ser refletora, quando os raios de luz atingem os objetos em diferentes direções e intensidades. E Pode ser refratora, quando os objetos são atingidos por raios de luz emitidos de todas as direções. A alternativa C está correta. O tipo de iluminação pontual ocorre quando os raios luminosos são emitidos em todas as direções, atingindo, assim, os objetos em diferentes direções e intensidades. Questão 2 A reflexão é o resultado da emissão de um raio de luz sobre uma superfície lisa. Na figura a seguir, é apresentado um exemplo de reflexão. Exemplo de reflexão. Utilizando os conceitos relacionados à reflexão e a figura, selecione a opção correta. A Trata-se de um exemplo de reflexão difusa, pois a superfície refletora é lisa. B O exemplo, claramente, mostra uma reflexão especular, uma vez que a superfície é espelhada. C Os raios luminosos indicados por I são chamados de raios refletores, uma vez que serão refletidos. D Os raios luminosos indicados por II são chamados de raios incidentes, uma vez que são resultado da incidência na superfície refletora lisa. E O ângulo ß é igual a 450, pois ele é igual ao valor do ângulo α. A alternativa E está correta. Na reflexão, os ângulos de incidência e reflexão são iguais. No caso do exemplo da imagem, o ângulo de incidência é representado por α e o ângulo de reflexão é representado por ß. 4. Modelar e exibir um cubo em OpenGL em Python O Python e o OpenGL Neste vídeo, apresentaremos o que é OpenGL, como utilizar esta biblioteca em Python, a partir da análise de sua motivação. Conteúdo interativo Acesse a versão digital para assistir ao vídeo. Nós podemos utilizar a linguagem de programação Python para diversas aplicações, como desenvolvimento web, computação científica e análise de dados. Falando especificamente sobre a computação gráfica temos, entre as muitas bibliotecas disponíveis em Python, a PyOpenGL, que permite o uso da conhecida biblioteca OpenGL. A OpenGL viabiliza o desenvolvimento de aplicações gráficas, tanto bidimensionais, como tridimensionais. Então, para podermos utilizá-la no Python, precisamos da PyOpenGL. Vamos desenvolver um exemplo completo utilizando a linguagem Python com o uso da PyOpenGL para modelar e exibir um cubo. Iremos demonstrar como você pode: Instalar pacotes Importar pacotes Entrar com os dados do conjunto de vértices do cubo Entrar com os dados do conjunto de arestas do cubo Fazer a modelagem do cubo Criar a funçãode rotação do cubo Criar a função para gerenciar a exibição do cubo Gerenciar a execução do projeto Vamos lá! Instalando e utilizando os pacotes Neste vídeo, apresentaremos os procedimentos para instalação e o uso da biblioteca pyOpenGL, abordando seu conceito e propriedades. Conteúdo interativo Acesse a versão digital para assistir ao vídeo. Instalando os pacotes necessários Para desenvolver a nossa aplicação, vamos usar a IDE Pycharm. Teremos que instalar duas bibliotecas: “pygame” e “PyOpenGL”. Para isso, devemos executar no console do PyCharm as duas linhas de comando a seguir: • • • • • • • • python !pip install pygame !pip install PyOpenGL Nosso próximo passo é importar essas bibliotecas. Importar pacotes Agora, precisamos importar os pacotes e bibliotecas que vamos utilizar ao longo do projeto. Para isso, devemos executar o seguinte código: python import pygame from pygame.locals import * from OpenGL.GL import * from OpenGL.GLU import * A OpenGL.GL é a interface de baixo nível para a biblioteca OpenGL. Já a OpenGL.GLU é um pacote que simplifica algumas tarefas que fazemos com mais frequência em computação gráfica. Por fim, o pygame é uma biblioteca do Python muito usada para criar jogos. Modelando o cubo em 3D Neste vídeo, apresentaremos os passos necessários para modelar um cubo utilizando a biblioteca pyOpenGL. Conteúdo interativo Acesse a versão digital para assistir ao vídeo. Vértices O cubo é definido com um objeto tridimensional com seis faces quadradas. Então, para definir as faces, precisamos inicialmente determinar quais são os vértices do cubo. Para isso, devemos executar o seguinte código: python def conjunto_vertices(): vertices = ( (1, -1, -1), (1, 1, -1), (-1, 1, -1), (-1, -1, -1), (1, -1, 1), (1, 1, 1), (-1, -1, 1), (-1, 1, 1) ) return vertices Dessa forma, faremos uma chamada para a função “conjunto de vértices”, que vai nos retornar os vértices do cubo. Entrar com os dados do conjunto de arestas do cubo Nosso próximo passo é definir as arestas. Para isso, devemos relacionar os vértices executando o seguinte código: python def conjunto_arestas(): arestas = ( (0,1),(0,3),(0,4), (2,1),(2,3),(2,7), (6,3),(6,4),(6,7), (5,1),(5,4),(5,7) ) return arestas Ou seja, acabamos de definir a função que vai retornar as arestas do cubo. Adicionando o modelo Finalmente chegou o momento em que vamos modelar o cubo. Para isso, vamos construir uma função a partir dos seguintes passos: Obter os vértices Obter as arestas Relacionar as arestas e os vértices Podemos fazer tudo isso por meio da execução do seguinte código: python def modelar_cubo(): glBegin(GL_LINES) vertices = conjunto_vertices() arestas = conjunto_arestas() for aresta in arestas: for vertice in aresta: glVertex3fv(vertices[vertice]) glEnd() O próximo passo é criar a função que permite aplicarmos a operação de rotação no cubo. Exibindo o cubo Neste vídeo, apresentaremos o código de exibição do cubo na tela do computador, executando e mostrando os resultados alcançados com o projeto. Conteúdo interativo Acesse a versão digital para assistir ao vídeo. Função de rotação do cubo Para realizar essa operação, basta utilizar as funções da PyOpenGL, conforme o seguinte código: • • • python def rotacao_do_cubo(): glRotatef(1, 3, 1, 1) glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) Em especial, usamos a função “glClear” para limpar os buffers usados para renderizar os gráficos. Exibindo o cubo Agora, vamos criar a função que gerencia a exibição do cubo, cujas etapas principais são: Iniciar o pygame Definir as dimensões da tela de exibição Estabelecer a perspectiva na qual o cubo será exibido Verificar se devemos ou não aplicar a operação no cubo Conseguimos realizar estas etapas por meio da execução do código: python def principal(frotacionar): pygame.init() display = (800,600) pygame.display.set_mode(display, DOUBLEBUF|OPENGL) gluPerspective(45, (display[0]/display[1]), 0.1, 50.0) glTranslatef(0.0,0.0,-7) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() if(frotacionar): rotacao_do_cubo() desenhar_cubo() pygame.display.flip() pygame.time.wait(10) Agora, vamos para a última parte do projeto, que é criar a função que gerencia toda a execução do nosso programa. Executando o código Aqui, fazemos a chamada para a função principal. Perceba que temos duas situações possíveis, conforme demonstramos a seguir. Situação 1: Não habilitar a rotação Considere o seguinte código: python if __name__ == "__main__": habilitar_rotacao = False principal(habilitar_rotacao) A saída é dada por uma imagem estática de um cubo, conforme a imagem a seguir: • • • • Exibição do cubo mágico. Situação 2: Habilitar a rotação Considere o seguinte código: python if __name__ == "__main__": habilitar_rotacao = True principal(habilitar_rotacao) A saída é dada por um cubo em rotação constante. A imagem é um “retrato” do cubo em rotação: Exibição do cubo em rotação É muito importante que você tente rodar esse exemplo para adquirir segurança. Em seguida, faça algumas modificações e teste o programa. Assim, você vai conhecer mais profundamente como funciona o Python com o OpenGL para trabalhar com aplicações de computação gráfica. Bons Estudos! Verificando o aprendizado Questão 1 Uma das bibliotecas mais tradicionais para desenvolver soluções de computação gráfica é a OpenGL. No caso do Python, utilizamos a PyOpenGL para trabalhar com as funções da OpenGL. Nesse sentido, selecione a opção que responde corretamente à pergunta: é uma desvantagem utilizar a PyOpenGL em relação a OpenGL? A De maneira alguma, pois as funções da PytonGL são mais avançadas do que as da OpenGL. B De forma alguma. A PyOpenGL facilita o acesso às funções da OpenGL, além de ser mais adequada para trabalhar no Python. C De nenhum modo, pois a PyOpenGL é muito simples de ser usada, pois não precisamos passar nenhum parâmetro para suas funções. D Sim, é uma grande desvantagem, pois a OpenGL possui funções mais simples de serem usadas do que a PyOpenGL. E Realmente, é melhor usar a OpenGL no Python, pois é uma prática comum da maioria dos desenvolvedores de computação gráfica. A alternativa B está correta. Sem dúvida, é mais vantajoso utilizar a PyOpenGL do que a OpenGL para desenvolver aplicações em Python. As funções são modeladas para facilitar a passagem de parâmetros e se integrarem facilmente ao resto do código. Questão 2 Em qualquer programa que utilize Python para computação gráfica, precisamos importar pacotes/bibliotecas. Isso ocorre devido à necessidade de utilizar funções que facilitam manipular uma imagem. No caso do exemplo que desenvolvemos, utilizamos a biblioteca “pygame”. Por que é importante o uso desta biblioteca? A Ela possui controles que facilitam a interação do usuário com a aplicação. B Pois pretendemos criar um jogo desenvolvido em Python. C Ela possui a função responsável pela rotação que a biblioteca OpenGL não habilita. D É um padrão de mercado utilizar as funções dessa biblioteca. E Por meio dela, podemos realizar a entrada de dados que não é possível com o OpenGL. A alternativa A está correta. A biblioteca pygame é utilizada pois facilita a interação do usuário com o sistema, tornando muito mais simples o controle da tela de exibição do cubo e encerrar a aplicação corretamente, quando a tela é fechada pelo usuário. 5. Conclusão Considerações finais No decorrer do conteúdo, apresentamos aspectos teóricos e práticos sobre técnicas de renderização, tais como modelagem de objetos, algoritmos de rasterização e de iluminação,além de explorarmos a aplicação TinkerCad para realizar operações sobre figuras geométricas tridimensionais. Entender esses conceitos nos ajuda a avançar nos estudos sobre computação gráfica e perceber oportunidades de aplicações e de aperfeiçoamento de algoritmos. Podcast Você vai saber sobre o conceito de modelagens de objetos, as operações booleanas e sua aplicações para gerar imagens de sólidos geométricos. Conteúdo interativo Acesse a versão digital para ouvir o áudio. Explore + Acesse o site do TinkerCad, explore os recursos, tente fazer exemplos e aprenda mais sobre modelagem geométrica de sólidos. Referências ANDRADE NETO, P. R.; GUEDES, A. L. P. Comparação de estruturas de dados para subdivisões planares baseada em transições. RITA, v. 13, n. 1, p. 23-41, jul. 2006. BUSS, S. R. 3-D computer graphics. A mathematical introduction with OpenGL. Cambridge: Cambridge University Press, 2003. FERGUSON, R. S. Practical algorithms for 3D computer graphics. Natick, Mass.: A K Peters, 2001. GLASSNER, A. S. An introduction to ray tracing. Cambridge: Academic Press, 1989. STEMKOSKI, L.; PASCALE, M.: Developing Graphics Frameworks with Python and OpenGL. Taylor & Francis, 2021. SUTHERLAND, I. E.; SPROULL, R. F.; SCHUMACKER, R. A. nA characterization of ten hidden-surface algorithms. Computing Surveys, n. 6, p. 1-55, 1974. WOO, A.; POULIN, P.; FOURNIER, A. A survey of shadow algorithms. IEEE Computer Graphics and Applications, v. 10, n. 6, p. 13-32, 2017. Técnicas de renderização 1. Itens iniciais Propósito Preparação Objetivos Introdução 1. Representações de modelagens de objetos Tipos de representação Representação aramada ou por wireframe Aresta Vértice origem Vértice destino Representação por faces (winged edge) Representação por quadtrees Primeira etapa Segunda etapa Terceira etapa Quarta etapa Compressão de imagens Busca de nós em uma área bidimensional Representação por octrees Representação por BSP Atenção Técnicas de modelagem geométrica matemática Efeitos naturais Instanciamento de primitivas Combinação de objetos Varredura Varredura por extrusão Varredura rotacional Scanners 3D Indústria da construção e engenharia civil Processo de design Entretenimento Análise forense Geometria sólida construtiva (CSG) União Diferença Interseção Técnicas de modelagem geométrica manual Exploração de operações e exemplos com TinkerCard (Free on-line) Primeiro passo Segundo passo Terceiro passo Primeiro passo Segundo passo Terceiro passo Quarto passo Primeiro passo Segundo passo Terceiro passo Quarto passo Quinto passo Sexto passo Sétimo passo Oitavo passo Nono passo Décimo passo Décimo primeiro passo Décimo segundo passo Décimo terceiro passo Primeiro passo Segundo passo Terceiro passo Quarto passo Quinto passo Sexto passo Modelagem de objetos Conteúdo interativo Verificando o aprendizado 2. Técnicas de rasterização Exibição dos modelos sólidos Métodos baseados em avaliação de fronteiras Métodos de visualização direta Rasterização Rasterização de retas Atenção Passo 1 Passo 2 Passo 3 Rasterização de polígonos Coerência de aresta Coerência do objeto Coerência de face Coerência de área Coerência de profundidade Coerência da linha de varredura Coerência do quadro Coerência de borda implícita Preenchimento de polígonos Preenchimento de bordas Preenchimento por varredura Tabela da lista de arestas Tabela de arestas ativas Tabela de polígonos Remoção de linhas e superfícies escondidas Atenção Métodos de espaço de objeto Métodos de espaço de imagem Rasterização Conteúdo interativo Verificando o aprendizado 3. Algoritmos de iluminação Emissores Fontes de luz própria Refletores Ambiental Direcional Pontual Refletora Sombreamento (shading) Quantidade de luz na cena Orientação das superfícies em relação às fontes de luz na cena Cores dos objetos Iluminação constante (flat) Iluminação de Gouraud Iluminação de Phong Reflexão Difusa Especular Especular Difusa Ambiente Refração 1º lei 2º lei Transparência Exemplo Opacidade Translucidez Sombras Atenção Algoritmo de rastreamento de raios (ray tracing) Radiosidade Iluminação Conteúdo interativo Verificando o aprendizado Questão 2 4. Modelar e exibir um cubo em OpenGL em Python O Python e o OpenGL Conteúdo interativo Instalando e utilizando os pacotes Conteúdo interativo Instalando os pacotes necessários Importar pacotes Modelando o cubo em 3D Conteúdo interativo Vértices Entrar com os dados do conjunto de arestas do cubo Adicionando o modelo Exibindo o cubo Conteúdo interativo Função de rotação do cubo Exibindo o cubo Executando o código Situação 1: Não habilitar a rotação Situação 2: Habilitar a rotação Verificando o aprendizado 5. Conclusão Considerações finais Podcast Conteúdo interativo Explore + Referências