º Exame de Animação e Visualização Tridimensional Mestrado de Bolonha em Eng. Informática e de Computadores pólo Alameda Prof. responsável João Madeiras Pereira 3 de Janeiro de 8 Nº Nome: Sala: Responda às questões seguintes justificando adequadamente todas as respostas. Se necessário utilize o verso da respectiva folha; O exame tem a duração de h3m com tolerância máxima de 3m. ( valor) No OpenGL descreva o que se entende pelo conceito de avaliador. Dê um exemplo em que a sua utilização seja adequada. É um andar do pipeline OpenGL que com base em informação geométrica de alto nível de objectos da cena calcula a representação de baixo nível desses mesmos objectos (vértices de polígonos). Exemplo de utilização: desenho de curvas a partir de descrição paramétrica (pts de controlo, etc.). (valor) Explique o conceito de fragmento. Os fragmentos representam o resultado do andar de rasterização do OpenGl. Cada fragmento contém a informação espacial, cromática, textura, etc., e define um potencial pixel. Só após o fragmento ter sido submetido com sucesso a um conjunto de testes (dithering, profundidade, stencil, nevoeiro) é que ao ser armazenado no framebuffer passa `a categoria de pixel. 3. ( valor) Explique como utilizaria a função de blending do OpenGL (glblendfun()) para implementar o efeito de transparência/opacidade. Os alunos tinham de referir os argumentos GL_SRC_ALPHA e GL_ONE_MINUS_SRC_ALPHA para a realização da mistura de cores do fragmento com o correspondente pixel do color-buffer 4. Na definição do processo de visualização de um programa em OpenGL, foram definidos os seguintes comandos: gluperspective(6.f,.f, 5.,.) para a definição da topologia do volume de visualização glulookat(.,.,.,.,.,.,.,.,.) para o posicionamento e orientação da Câmara Virtual Responda às seguintes questões: /7
a) ( valor) Calcule no referencial da Câmara Virtual, as coordenadas dos cantos da janela de visualização Coordenadas dos 4 cantos são: (bottom,right,near); (bottom,left, near); (top,right,near); (top,left,near) gluperspective define um frustum simétrico, logo left=-right e bottom=-top O ângulo fornecido como primeiro argumento respeita a abertura vertical em graus. A relação existente entre a semi-altura e a distância à janela de visualização (definida pelo argumento near) é a tangente da semi-abertura vertical ou seja: top = tg (6/) * 5 e como bottom= -top = -5*tg(3); near = 5 Dado que a relação de aspecto é. temos que right= top e left = -right= - 5*tg(3); b) ( valores) Assuma que a matriz MODELVIEW foi inicializada com a matriz identidade. Calcule qual será a posição de um objecto, representado pelo seu centro geométrico (3, -3, ), após a execução do comando glulookat() explicitado acima. A resposta a esta questão passa por calcular a MODELVIEW que será aplicada ao objecto. O conteúdo da matriz MODELVIEW será o resultado da multiplicação de rotação pela translação. VRP ( ) logo realiza-se uma translação de um vector de deslocamento de [-VRPx VRPy VRPz] Translação= Para a rotação basta por isso calcular os versores u, v e n. Look-at está em ( ) logo VPN vale [ ] => n [/sqrt() /sqrt() ] View-up [ ] => v [ ] e portanto u = [/sqrt() -/sqrt() ] pois referencial mão esquerda: u = n x v. A matriz de rotação é dada em termos de linhas, respectivamente, pelas componentes dos versores u,v e -n. / Rotação = / / / /7
MODELVIEW = RotaçãoxTranslação / / / / / P' = MODELVIEW multiplicap = / / / 3 3 = 3 5. (,5 valores) Considere uma cena constituída por objectos tridimensionais opacos e transparentes, a qual será visualizada utilizando o mecanismo do Z-Buffer do OpenGL. Indique a ordem pela qual os objectos devem ser dados ao pipeline de visualização, quais os testes a serem aplicados sobre fragmentos, quais os buffers do OpenGL a serem utilizados bem como o seu modo de utilização. Justifique cuidadosamente a sua resposta. Dado existirem objectos não opacos, é necessário, a fim que o Z-buffer seja bem sucedido, que sejam desenhados em primeiro lugar os opacos e depois os translúcidos. Assim: Activa-se o teste da profundidade. Em seguida desenham-se os objectos opacos; para isso activa-se o teste alpha de modo a rejeitar os fragmentos com valor de alpha diferentes de. Depois desactiva-se a escrita no z-buffer (para evitar que em caso de um translúcido à frente de um objecto opaco altere o conteúdo do z-buffer removendo este último o que seria indesejável), activa-se o teste de blending (especificando a respectiva função de blending) e desenham-se os objectos transparentes (teste de alpha para rejeitar fragmentos com valores iguais a ). Neste desenho é fundamental que a ordem de rasterização se faça do objecto mais distante para o objecto mais próximo 6. (,5 valores) Em termos de reflexão, nomeie e descreva as características, em OpenGL, dos materiais a serem usados na modelação dos objectos. Descrever pormenorizadamente as componentes de reflexão difusa, especular e ambiente do modelo de reflexão de Phong utilizado pela API. A componente especular modela a reflexão da energia luminosa numa única direcção (ângulo de reflexão igual ao ângulo de incidência) e é responsável pelo brilho. A área da zona de brilho é propocional ao produto (R prod int V) exp n. n é o grau de brilho. A componente difusa modela reflexão da energia luminosa em todas as direcções e é responsável pela cor do objecto (parte da luz incidente é selectivamente absorvida pelo próprio objecto). O seu valor é descrito pela Lei de Lambert, (L prod interno N). Componente ambiente simula as reflexões provenientes de outros objectos e das paredes da cena e é um valor constante. 7. ( valor) Uma fonte de luz é posicionada na cena através do comando gllightfv(gl_light, light_position). Se alterar a posição do observador na cena através do comando glulookat(), qual a sequência de comandos na rotina de desenho de 3/7
modo a que a fonte de luz acompanhe sempre esse movimento (efeito capacete do mineiro)? gllightfv(gl_light, light_position) glulookat(...); drawobjects(); Isto significa que a transformação de visualização afecta apenas a posição os objectos de desenho e não a fonte de luz. Assim, ao movimentar-se a câmara, a posição dos objectos é alterada mas a fonte de luz não: esta mantém sempre a mesma posição relativa à câmara. Assim observar-se-á, que à medida que a câmara se movimenta, a fonte de luz acompanha sempre do mesmo modo esse movimento 8. (,5 valores) Uma das questões que se coloca na aplicação das texturas relaciona-se com o tipo de atributos dos objectos a serem modelados. Apresente os três tipos de atributos referidos nas aulas teóricas e descreva as correspondentes técnicas de texturização. Cor da superfície do objecto (coeficientes da reflexão difusa) caso mais comum. Neste caso, apenas a componente difusa do objecto vai ser modelada (substituída, multiplicada, etc) pelo mapa de textura. Reflexão difusa e especular global: mapeamento de ambiente ou environmental mapping. Mapeamento do ambiente é uma técnica que simula os resultados do ray-tracing. Usa-se para reflexões em superfícies curvas. Depende do ponto de vista do observador. Consiste em arranjar uma textura contendo toda a cena visível por determinado objecto. A textura a ser aplicada é indexada pelo vector de reflexão Geometria: bump mapping. Esta técnica consiste na aplicação de uma função que pertube as normais do objecto de modo a gerar o efeito de rugosidade. Note-se que com esta técnica, ao invés de se utilizar objectos com um elevado número de polígonos, os objectos a serem alvo de bump-mapping são de baixa resolução e produzem resultados muito bons e de um modo muito mais rápido. 9. ( valor) A função gltexenv permite especificar o modo como as texturas irão ser utilizadas para sombrear os objectos. Neste contexto, descreva a utilização dos parâmetros GL_REPLACE, GL_MODULATE e GL_BLEND As operações de textura são efectuadas após o sombreamento (ao nível do fragmento). A cor final do fragmento pode ser definida dos seguintes modos: GL_REPLACE: a cor do fragmento (obtida pela operação de sombreamneto) é substituída pelo cor da textura GL_MODULATE: A textura é utilizada para modular, ou escalar, a cor do fragmento GL_BLEND: uma cor constante pode ser misturada (blended) com a cor do fragmento com base no valor da textura.. ( valor) Considere uma cena com fontes de luz. No processo de mapeamento de texturas, pretende-se visualizar os objectos texturados com reflexos especulares. Utilizando a invocação do comando OpenGL de parametrização do modelo de iluminação, indicado abaixo, explique como implementaria esse efeito de iluminação de texturas gllightmodeli( GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR) 4/7
Com este comando a cor calculada para cada vértice, pelo modelo de reflexão do OpenGL, é separada em campos: um que guarda a componente ambiente mais a componente difusa; e um outro que armazena a componente especular. Ao utilizar-se a textura com a indicação de GL_REPLACE no comando gltexenv(), a API substitui o campo que contém a soma das componentes ambiente e difusa pelo valor da textura ao qual soma de seguida o valor do campo que contém a componente especular.. (,5 valores) Explique detalhadamente como se poderia implementar, recorrendo ao acumulador do OpenGL, o efeito de profundidade de campo. Refira-se, ainda, à possibilidade de utilização dos dois tipos Matriz de Projecção em OpenGL. Limpa-se o acumulador e activa-se um buffer de cor para leitura e escrita. O efeito de profundidade de campo pode-se obter transladando, em x e em y, a posição da câmara e fazer com que o volume perspectivo contenha sempre o mesmo plano focal. Cada uma dessas translacções é armazenada como uma imagem de peso /N no acumuladorglaccum(gl_accum, /n). No final das N translacções faz-se o desenho através da passagem do conteúdo do acumulador para o color-buffer -glaccum(gl_return, ). Naturalmente apenas a matriz de projecção perspectiva pode ser utilizada. A Matriz de Projecção ortográfica não pode ser utilizada devido à impossibilidade manter o mesmo plano focal após os sucessivos jitterings do observador.. ( valor) Demonstre que a formulação matricial da curva de Bézier: é equivalente a Basta fazer a multiplicação das matrizes 3. Considere curva B-Spline não-racional, cúbica com sete pontos de controlo e cuja representação gráfica está ilustrada na figura abaixo. 5/7
p p p 6 p 3 p p 4 p 5 a. (,5 valores) Será esta uma curva uniforme? Justifique. Na sua justificação determine o vector de nós que caracteriza esta curva bem como o número de segmentos. Não. A curva é não-uniforme visto que a B-Spline interpola os pts de controlo extremos, P e P6, e interpola o ponto de controlo intermédio P3. Deste modo, a multiplicidade a ser aplicada aos nós é de 4 para os nós extremos e de 3 para o nó intermédio, resultando o seguinte vector de nós [ ]. Como se pode constatar deste vector de nós só existem segmentos, pois quando dois nós consecutivos são iguais, o segmento de curva definido por esses dois nós se anula. b. ( valor) Esta curva B-Spline pode ser caracterizada como uma junção de duas curvas cúbicas de Bézier. Justifique esta afirmação. É verdadeira a afirmação. Cada curva de Bézier cúbica é definida por 4 pts de controlo e interpola os pts extremos, o que acontece neste caso. Cada uma das curvas evolui dentro do respectivo polígono de controlo, sendo a derivada em cada um dos pts extremos influenciada pelos pts de controlo intermédios Por outro lado, tem-se a junção de curvas de Bézier, pois os pts de controlo P, P3 e P4 são colineares. 4. (,5 valores) Considere uma cena apenas com um objecto. Inicialmente esse objecto encontra-se virado para a Câmara. Posteriormente, aplica-se a esta última, uma translação e uma rotação fazendo com que a matriz ModelView do objecto, passe a ter o seguinte conteúdo:.77.77.77.77.44.44 Sem efectuar operações de rotação, explique como procederia de modo a que o referido objecto tivesse um comportamento de billboard esférico, em que o alinhamento é feito com o plano de visualização? Neste tipo de alinhamento é preciso garantir que face à movimentação da câmara, as rotações provocadas por esta no billboard sejam anuladas. Assim é necessário que após obter a matriz ModelView (comando getfloatv()) cujo conteúdo está acima indicado: )Carregar a submatrix 3x3 da ModelView com a matriz identidade )Calcular a posição do billboard no sistema de coordenadas de câmara que significa manter os três primeiros elementos da última coluna da ModelView Aplica-se esta nova matriz ModelView, utilizando push, ao objecto billboard, e depois faz-se o pop 6/7
7/7