Transformações Geométricas

Documentos relacionados
Cap. 4: Janelas, Visores & Recorte Gráfico

Transformações Geométricas

Computação Gráfica. 5385: Licenciatura em Engenharia Informática. Cap. 3 Janelas e Visores. Janelas e Visores

Engenharia Informática Computação Gráfica

LAB. 1. Introdução à OpenGL

Matriz de transformação

Transformações (Cap 4.3, 4.4 e 4.6 a 4.10)

CG 2013/2014 Primeiro Teste LEIC Alameda/Taguspark

OpenGL, GLU e GLUT. GLUT (OpenGL Utility Toolkit) OpenGL. Linguagem. OpenGL. Esqueleto de um programa em PyOpenGL

Computação Gráfica OpenGl 03

4. Curvas Paramétricas e Transformações 2D

CIV2802 Sistemas Gráficos para Engenharia Luiz Fernando Martha André Pereira

Introdução a OpenGL. Profª. Alessandra Martins Coelho

aula8 Transformações Geométricas no Plano e no Espaço 2016/2 IC / UFF

Transformações Geométricas

n À primeira vista: basta desenhar n Uma subrotina para desenhar cada tipo de objeto n Mas... n Como fazer interação? n Como estruturar a cena?

Transformações geométricas no plano e no espaço

Computação Gráfica - OpenGl 02

Computação Gráfica Transformações Geométrica no Plano e no Espaço

OpenGL. Licenciatura em Computação Computação Gráfica - Aula 2 (atualizada em 03 ago. 2017)

Transformações 2D. Prof. Márcio Bueno Fonte: Material do Prof. Robson Pequeno de Sousa e do Prof.

Sistemas de Referência

Coordenadas Homogêneas

Fundamentos de Computação Gráfica

Translação. Sistemas de Coordenadas. Translação. Transformações Geométricas 3D

Computação Gráfica. Introdução. Tomás A. C. Badan

Pedro Vasconcelos DCC/FCUP. Programação Funcional 11 a Aula Gráficos usando Gloss

Conceitos importantes da Computação Gráfica [3]

Programação Gráfica 2D com OpenGL (Aulas 22, 24 e 25)

Modelagem Cinemática de Robôs Industriais. Prof. Assoc. Mário Luiz Tronco

Transformações Geométricas

Animação por Computador. Sólidos Transformações lineares Hierarquia de movimento Parametrização da orientação Interpolação da orientação

Processamento de Imagens CPS755

Mudança de Coordenadas

ficha 1 matrizes e sistemas de equações lineares

FCG2006 Prova sobre OpenGL e Rastreamento de Raios

Universidade Federal de Alagoas Instituto de Matemática. Geometria. Prof. Thales Vieira

1 Espaços Vectoriais

Transformações geométricas planas

Introdução ao Processamento Digital de Imagens. Aula 6 Propriedades da Transformada de Fourier

Transformações Gráficas Tridimensionais (3D) Antonio L. Bajuelos Departamento de Matemática Universidade de Aveiro

Sumário. Computação Gráfica. Transformações Geométricas. Transformações Geométricas. Translação: Transformações Geométricas

Notas de Aula - Fascículo 03 Transformações projetivas do plano

Projeções e Transformações em 3D

António Costa. Paulo Roma Cavalcanti

Produto interno, externo e misto

Mudanças de Coordenadas em Sistemas de Cores

Instituto Superior Técnico Departamento de Matemática Última actualização: 18/Nov/2003 ÁLGEBRA LINEAR A

Ficha de Exercícios nº 3

Capítulo Equações da reta no espaço. Sejam A e B dois pontos distintos no espaço e seja r a reta que os contém. Então, P r existe t R tal que

PROGRAMA ÁLGEBRA LINEAR, MEEC (AL-10) Aula teórica 32

AULA Exercícios. DEMONSTRAR QUE UMA TRANSFORMAÇÃO É LINEAR Se A é uma matriz real m n e. u R, a aplicação T : R R tal que

depende apenas da variável y então a função ṽ(y) = e R R(y) dy

Matrizes hermitianas e unitárias

Visualização 3D. Soraia Raupp Musse

TRANSFORMAÇÕES LINEARES

Matrizes Semelhantes e Matrizes Diagonalizáveis

A primeira coisa a fazer é saber quais são as equações das curvas quando elas já se encontram na melhor

Matemática II /06 - Matrizes 1. Matrizes

Capítulo 6: Transformações Lineares e Matrizes

ISOMETRIAS - TRANSLAÇÃO, ROTAÇÃO E REFLEXÃO -

Programa de Aprimoramento Discente em Modelagem Geométrica Computacional. Curso Básico de OpenGL

Produto Misto, Determinante e Volume

Capítulo 1 - Cálculo Matricial

Álgebra Linear Transformações Lineares

Pontifícia Universidade Católica do Rio de Janeiro / PUC-Rio Departamento de Engenharia Mecânica. ENG1705 Dinâmica de Corpos Rígidos.

Cálculo Diferencial e Integral 2 Formas Quadráticas

Álgebra Linear e Geometria Anaĺıtica. Vetores, Retas e Planos

OpenGL. O que é OpenGL. O Pipeline do OpenGL. Listas de Exposição

Programação 2012/2013 1º Semestre MEEC Laboratório 2 Semana de 22 de Outubro de 2012

Noções de Álgebra Linear

Capítulo 1 - Cálculo Matricial

1 Segmentos orientados e vetores, adição e multiplicação

Equação Geral do Segundo Grau em R 2

PERFIL DO ALUNO APRENDIZAGENS ESPECÍFICAS - 5.ºANO

Isometrias ESCOLA SECUNDÁRIA ANSELMO DE ANDRADE

Robótica. Linguagens de Programação para Robótica (manipuladores)

Álgebra Linear. Determinantes, Valores e Vectores Próprios. Jorge Orestes Cerdeira Instituto Superior de Agronomia

Resistência dos. Materiais. Capítulo 2. - Elasticidade Linear 2

Introdução à Programação em OpenGL. Prof. Márcio Bueno

TRANSFORMAÇÕES GEOMÉTRICAS

Instituto Superior de Engenharia de Lisboa Engenharia Informática e de Computadores

Visualização. - Aula 4 -

ESCOLA BÁSICA DE MAFRA 2016/2017 MATEMÁTICA (2º ciclo)

Modelagem Cinemática de Robôs Industriais. Prof. Assoc. Mário Luiz Tronco

2 Conceitos Básicos da Geometria Diferencial Afim

Introdução Programando com OpenGL Exemplos. O que é OpenGL? [1]

No desenvolvimento deste guião, procure sempre colocar as denominações referidas em cada ponto.

Introdução a Prática em OpenGL

Universidade Federal de Alagoas UFAL Centro de Tecnologia - CTEC Programa de Pós-Graduação em Engenharia Civil - PPGEC

Integrais Triplas em Coordenadas Polares

MINISTÉRIO DA EDUCAÇÃO E DO DESPORTO UNIVERSIDADE FEDERAL DE VIÇOSA DEPARTAMENTO DE MATEMÁTICA

Posição relativa entre retas e círculos e distâncias

Álgebra Linear Teoria de Matrizes

Matemática I Cálculo I Unidade B - Cônicas. Profª Msc. Débora Bastos. IFRS Campus Rio Grande FURG UNIVERSIDADE FEDERAL DO RIO GRANDE

Aula 12. Ângulo entre duas retas no espaço. Definição 1. O ângulo (r1, r2 ) entre duas retas r1 e r2 se define da seguinte maneira:

CÁLCULO I. 1 Número Reais. Objetivos da Aula

ESCOLA SECUNDÁRIA COM 2º E 3º CICLOS ANSELMO DE ANDRADE

6.1 equações canônicas de círculos e esferas

Matrizes e Linearidade

Transcrição:

Transformações Geométricas Computação Gráfica Motivação! Transformações geométricas! Translação, Rotação, Reflexão! Variação de Tamanho (scaling), Cisalhamento (shearing)! Projecção Ortogonal, Projecção Perspectiva! Porque é que as transformações geométricas são necessárias?! Como operações de posicionamento de objectos.! Como operações de modelação de objectos.! Como operações de visualização. 1

Motivação: modelação de objectos em 2D! Transformações geométricas podem especificar operações de modelação de objectos! Permitem a definição de um objecto no seu próprio sistema de coordenadas locais (modeling coordinates ou coordenadas de modelação)! Permitem usar a definição de um objecto várias vezes numa cena com um sistema de coordenadas globais (world coordinates ou coordenadas do domínio da cena)! A OpenGL fornece uma pilha de transformações que permite a sua utilização frequente Motivação: modelação de objectos em 2D Variação de Tamanho + Rotação + Translação y x Coordenadas Locais (modeling coordinates) Variação de Tamanho + Translação Coordenadas Globais (world coordinates) 2

Motivação: modelação de objectos em 2D y Coordenadas Locais Coordenadas Globais x y Posicionamento x Variação de Tamanho y x y Motivação: modelação de objectos em 2D Coordenadas Locais Coordenadas Globais x Rotação y x Translação y x 3

Translação 2D x =x+δx y =y+δy Transladar um ponto (x, y) significa deslocá-lo de uma quantidade linear (Δx, Δy). Δx=2 Δy=1 Translação 2D: forma matricial! x não é uma combinação linear de x e y! y não é uma combinação linear de x e y 4

Rotação 2D Q=(x, y ) θ O P=(x, y) Rodar um ponto P=(x,y) de um ângulo θ relativamente à origem significa encontrar outro ponto Q=(x,y ) sobre uma circunferência centrada na origem que passa pelos dois pontos, com θ= POQ. Rotação 2D: cálculo de equações (x, y ) θ (x, y) Desenvolvendo as expressões de x e y, tem-se: r φ Substituindo r cos(φ) e r sin(φ) por x e y nas equações anteriores tem-se: 5

Rotação 2D: forma matricial! Embora sin(θ) e cos(θ) sejam funções não-lineares de θ,! x é uma combinação linear de x e y! y é uma combinação linear de x e y Transformações geométricas: forma matricial! P =T + P //translação! P =R x P //rotação! Como tratar todas as transformações da mesma maneira?! Como veremos mais adiante também: P =S x P //variação de escala 6

Problema fundamental das transformações! O facto de a translação não ser uma transformação linear de x e y impede que se possa efectuar uma série de transformações (translações e rotações por ordem arbitrária) através do produto de matrizes 2x2.! Repare-se que é possível, no entanto, fazer k rotações através do produto de k matrizes de rotação.! SOLUÇÃO: coordenadas homogéneas! Coordenadas homogéneas! Um triplo (x,y,t) de números reais com t 0, é um conjunto de coordenadas homogéneas para o ponto P com coordenadas cartesianas (x/t,y/t).! Portanto, o mesmo ponto tem muitos conjuntos de coordenadas homogéneas. Assim, (x,y,t) e (x,y,t ) representam o mesmo ponto sse existe algum escalar α tal que x = αx, y = αy e t = αt. 7

Coordenadas homogéneas! Um triplo (x,y,t) de números reais com t 0, é um conjunto de coordenadas homogéneas para o ponto P com coordenadas cartesianas (x/t,y/t).! Assim, para o ponto P de coordenadas cartesianas (x,y), um dos seus conjuntos de coordenadas homogéneas é (x,y,1). Este é o conjunto que é usado em computação gráfica. Translação e Rotação 2D: coordenadas homogéneas Translação Rotação Consideram-se os pontos em coordenadas homogéneas (x,y) ---- (x,y,1) 8

Definição de grupo: lembrete Um conjunto C e uma operação formam um grupo (C, ) se: Axioma de Fecho. Para quaisquer elementos c 1,c 2 C, c 1 c 2 C. Axioma de Identidade. Existe um elemento identidade i C tal que c i = c = i c, para qualquer c C. Axioma de Elemento Inverso. Para qualquer c C, existe um inverso c -1 C tal que c c -1 = i = c -1 c Axioma de Associatividade. Para quaisquer elementos c 1,c 2,c 3 C, c 1 (c 2 c 3 ) = (c 1 c 2 ) c 3 Geometria euclidiana! Conjunto de transformações geométricas: translações e rotações (também designadas por isometrias).! Com o uso de coordenadas homogéneas, as transformações da geometria euclidiana podem ser representadas por matrizes 3x3, o que permite usar o operador produto para encontrar a matriz de transformação que resulta da concatenação arbitrária de translações e rotações.! O conjunto I(n) de isometrias em R n e o operador de concatenação formam um grupo GI(n)=(I(n), )! Invariante métrico fundamental: distância entre pontos.! Outros invariantes métricos:! Ângulos, comprimentos! Áreas, volumes! Geometria euclidiana 2-dimensional: (R 2,GI(2)) 9

Geometria afim (É uma generalização da geometria euclidiana)! Conjunto de transformações afins (ou afinidades): translação, rotação, variação de tamanho e cisalhamento (shearing).! O conjunto A(n) de afinidades em R n e o operador de concatenação formam um grupo GA(n)=(A(n), )! Invariante fundamental: paralelismo! Outros invariantes:! razão de distâncias entre quaisquer três pontos pertencentes a uma linha! colinearidade! Exemplos: um quadrado pode ser transformado num rectângulo; uma circunferência pode ser transformada numa elipse! Geometria afim 2-dimensional: (R 2,GA(2)) Variação de tamanho 2D Variar o tamanho de um objecto é multiplicar cada componente de cada um dos seus pontos (x,y) por um escalar. λ x = 2 λ y = 2 10

Variação de tamanho não-uniforme com Variar o tamanho dum objecto é multiplicar cada componente de cada um dos seus pontos (x,y) por um escalar. λ x = 2 λ y = 0.5 Cisalhamento (Shearing) Cisalhar um objecto é deformá-lo linearmente ao longo do eixo x ou do eixo y ou de ambos. κ x = 1 κ y = 0 11

Representação matricial 3x3 de transformações afins 2D Translação Variação de Tamanho Rotação Cisalhamento Composição de transformações afins 2D! O operador de composição é o produto de matrizes.! É uma consequência do Axioma da Associatividade da geometria afim e da dimensão 3x3 das matrizes associadas às transformações afins 2D.! ATENÇÃO:! A ordem de composição de transformações afins é relevante.! O produto de matrizes não é uma operação comutativa.! A geometria afim não satisfaz o Axioma da Comutatividade.! Exemplo: 12

Exemplo: rotação dum segmento em torno de Incorrecto Rot(30) Correcto Tr(-2) Rot(30) Tr(2) Exemplo: rotação dum segmento em torno de Tr(-2) Rot(30) Tr(2) 13

Transformações afins 3D Identidade Variação de Tamanho Translação Reflexão relativamente ao plano YZ Outras transformações afins 3D Rotação em torno do eixo Z Rotação em torno do eixo Y Rotação em torno do eixo X 14

Transformações afins em OpenGL! Há duas formas de especificar uma transformação :! Transformações geométricas pré-definidas:! gltranslate!! glrotate! glscale! Transformações geométricas arbitrárias através de especificação directa de matrizes:! glloadmatrix!! glmultmatrix! Transformações geométricas são efectuadas pela matriz de modelação e visualização (modelview). Transformações afins em OpenGL (cont.)! Para usar as transformações geométricas, há que designar a matriz modelview como a matriz corrente através da instrução! glmatrixmode(gl_modelview).! A OpenGL tem uma pilha para cada um dos seguintes tipos de matrizes:! modelação e visualização (GL_MODELVIEW),! projecção (GL_PROJECTION)! textura (GL_TEXTURE)! A pilha modelview é inicializada com a matriz identidade. 15

Transformações afins prédefinidas em OpenGL! gltranslate{f,d}(dx, dy, dz)! Especifica uma translação segundo o vector (dx,dy,dz), em que as componentes são números reais de precisão simples f ou dupla d.! glrotate{f,d}(angle, vx, vy, vz)! Especifica uma rotação de angle graus em torno do eixo definido pelo vector (vx,vy,vz) na origem.! Note-se que esta função define uma rotação geral relativamente a um eixo que passa pela origem. Transformações afins prédefinidas em OpenGL! glscale{f,d}(sx, sy, sz)! Especifica uma variação de tamanho segundo cada um dos eixos de coordenadas.! Esta função pode ser usada para fazer reflexões usando valores negativos nos factores de escala sx, sy ou sz.! ATENÇÃO: se algum factor de escala for zero, pode ocorrer um erro de processamento. 16

Transformações afins em OpenGL! Transformações geométricas pré-definidas:! gltranslate!! glrotate! Ver manual: http://www.glprogramming.com/blue/ Operações com matrizes em OpenGL! glloadidentity()! Especifica a matriz identidade como a matriz de topo da pilha corrente. A matriz de topo duma pilha é sempre a matriz corrente.! glloadmatrix{f,d}(<array>)! Especifica a matriz corrente através dum array 1-dimensional com 16 elementos dados na ordem de coluna-a-coluna.! glmultmatrix{f,d}(<array>)! Multiplica a matriz corrente M com a matriz N dada pelos elementos fornecidos pelo array 1-dimensional: M=M. N 17

Exemplo: produção da matriz modelview M=M 2. M1! A sequência de instruções é a seguinte glloadidentity();! glmultmatrixf(<array of M 2 >); glmultmatrixf(<array of M 1 >);!! Note-se que a primeira transformação efectuada é a última que é especificada. Isto deve-se ao uso de uma pilha de matrizes. Exemplos em OpenGL! Transformações afins com acumulação! Transformações afins sem acumulação! Transformações afins com acumulação controlada pela stack 18

Transformações 2D c/ acumulação /* * quad.cc - Cumulative 2D transformations */ #include <OpenGL/gl.h> // Header File OpenGL Library #include <OpenGL/glu.h> // Header File GLu Library #include <GLUT/glut.h> // Header File GLut Library #include <stdlib.h> void draw(){ // Make background colour yellow glclearcolor( 100, 100, 0, 0 ); glclear ( GL_COLOR_BUFFER_BIT ); // modelview matrix for modeling transformations glmatrixmode(gl_modelview); glcolor3f(0,0,0); glbegin(gl_lines); // x-axis glvertex2f(0.0,0.0); glvertex2f(0.5,0.0); glend(); glcolor3f(0,0,0); glbegin(gl_lines); // y-axis glvertex2f(0.0,0.0); glvertex2f(0.0,0.5); glend(); Transformações 2D c/ acumulação (cont.) // RED rectangle glcolor3f( 1, 0, 0 ); // Translate GREEN rectangle glcolor3f( 0, 1, 0 ); gltranslatef(-0.4, -0.1, 0.0); // Rotate and translate BLUE rectangle glcolor3f( 0, 0, 1 ); glrotatef(90, 0.0, 0.0,1.0); // Scale, rotate and translate MAGENTA rectangle glcolor3f( 1, 0, 1 ); glscalef(-0.5, 1.0, 1.0); // display all glutswapbuffers(); } // end of draw() 19

Transformações 2D c/ acumulação (cont.) // Keyboard callback function to allow ESC key to quit void keyboard(unsigned char key,int x,int y) { if(key==27) exit(0); } int main(int argc, char ** argv) //Main function { glutinit(&argc, argv); // Double Buffered RGB display glutinitdisplaymode( GLUT_RGB GLUT_DOUBLE); // Set window size glutinitwindowsize( 500,500 ); glutcreatewindow("rectangles moving around: CUMULATIVE 2D Transf."); // Declare the display and keyboard CALLBACKS functions glutdisplayfunc(draw); glutkeyboardfunc(keyboard); // Start the Main Loop glutmainloop(); return 0; } Transformações 2D c/ acumulação: output // RED rectangle glcolor3f( 1, 0, 0 ); // Translate GREEN rectangle glcolor3f( 0, 1, 0 ); gltranslatef(-0.4, -0.1, 0.0); // Rotate and translate BLUE rectangle glcolor3f( 0, 0, 1 ); glrotatef(90, 0.0, 0.0,1.0); // Scale, rotate and translate MAGENTA rectangle glcolor3f( 1, 0, 1 ); glscalef(-0.5, 1.0, 1.0); 20

Transformações 2D s/ acumulação /* * quad.cc - Non-cumulative 2D transformations */ #include <OpenGL/gl.h> // Header File OpenGL Library #include <OpenGL/glu.h> // Header File GLu Library #include <GLUT/glut.h> // Header File GLut Library #include <stdlib.h> void draw(){ // Make background colour yellow glclearcolor( 100, 100, 0, 0 ); glclear ( GL_COLOR_BUFFER_BIT ); // modelview matrix for modeling transformations glmatrixmode(gl_modelview); glcolor3f(0,0,0); // x-axis glbegin(gl_lines); glvertex2f(0.0,0.0); glvertex2f(0.5,0.0); glend(); glcolor3f(0,0,0); // y-axis glbegin(gl_lines); glvertex2f(0.0,0.0); glvertex2f(0.0,0.5); glend(); Transformações 2D s/ acumulação (cont.) // RED rectangle glcolor3f( 1, 0, 0 ); // Translate GREEN rectangle glcolor3f( 0, 1, 0 ); gltranslatef(-0.4, -0.1, 0.0); // Rotate BLUE rectangle glcolor3f( 0, 0, 1 ); glloadidentity(); // reset the modelview matrix glrotatef(90, 0.0, 0.0,1.0); // Scale MAGENTA rectangle glcolor3f( 1, 0, 1 ); glloadidentity(); // reset the modelview matrix glscalef(-0.5, 1.0, 1.0); // display all glutswapbuffers(); } // end of draw() 21

Transformações 2D s/ acumulação (cont.) // Keyboard callback function to allow ESC key to quit void keyboard(unsigned char key,int x,int y) { if(key==27) exit(0); } int main(int argc, char ** argv) // Main function { glutinit(&argc, argv); // Double Buffered RGB display glutinitdisplaymode( GLUT_RGB GLUT_DOUBLE); // Set window size glutinitwindowsize( 500,500 ); glutcreatewindow("rect. moving around: NON-CUMULATIVE 2D transf."); // Declare the display and keyboard CALLBACKS functions glutdisplayfunc(draw); glutkeyboardfunc(keyboard); // Start the Main Loop glutmainloop(); return 0; } Transformações 2D s/ acumulação: output // RED rectangle glcolor3f( 1, 0, 0 ); // Translate GREEN rectangle glcolor3f( 0, 1, 0 ); gltranslatef(-0.4, -0.1, 0.0); // Rotate BLUE rectangle glcolor3f( 0, 0, 1 ); glloadidentity(); // reset the modelview matrix glrotatef(90, 0.0, 0.0,1.0); // Scale MAGENTA rectangle glcolor3f( 1, 0, 1 ); glloadidentity(); // reset the modelview matrix glscalef(-0.5, 1.0, 1.0); 22

Transf. 2D c/ acum. controlada pela stack /* * quad.cc - Stack-cumulative 2D transformations */ #include <OpenGL/gl.h> // Header File OpenGL Library #include <OpenGL/glu.h> // Header File GLu Library #include <GLUT/glut.h> // Header File GLut Library #include <stdlib.h> void draw(){ // Make background colour yellow glclearcolor( 100, 100, 0, 0 ); glclear ( GL_COLOR_BUFFER_BIT ); // modelview matrix for modeling transformations glmatrixmode(gl_modelview); glcolor3f(0,0,0); glbegin(gl_lines); // x-axis glvertex2f(0.0,0.0); glvertex2f(0.5,0.0); glend(); glcolor3f(0,0,0); glbegin(gl_lines); // y-axis glvertex2f(0.0,0.0); glvertex2f(0.0,0.5); glend(); Transf. 2D c/ acum. controlada pela stack(cont.) // RED rectangle glcolor3f( 1, 0, 0 ); // Translate GREEN rectangle glcolor3f( 0, 1, 0 ); gltranslatef(-0.4, -0.1, 0.0); // save modelview matrix on the stack glpushmatrix(); // Rotate and translate BLUE rectangle glcolor3f( 0, 0, 1 ); glrotatef(90, 0.0, 0.0,1.0); // restore modelview matrix from the stack glpopmatrix(); // Scale and translate MAGENTA rectangle glcolor3f( 1, 0, 1 ); glscalef(-0.5, 1.0, 1.0); // display rectangles glutswapbuffers(); } // end of draw() 23

Transf. 2D c/ acum. controlada pela stack (cont.) // Keyboard callback function to allow ESC key to quit void keyboard(unsigned char key,int x,int y) { if(key==27) exit(0); } int main(int argc, char ** argv) // Main function { glutinit(&argc, argv); // Double Buffered RGB display glutinitdisplaymode( GLUT_RGB GLUT_DOUBLE); // Set window size glutinitwindowsize( 500,500 ); glutcreatewindow("rect. moving around: STACK-CUMULATIVE 2D transf."); // Declare the display and keyboard CALLBACKS functions glutdisplayfunc(draw); glutkeyboardfunc(keyboard); // Start the Main Loop glutmainloop(); return 0; } Transf. 2D c/ acum. controlada pela stack: output // RED rectangle glcolor3f( 1, 0, 0 ); // Translate GREEN rectangle glcolor3f( 0, 1, 0 ); gltranslatef(-0.4, -0.1, 0.0); // save modelview matrix on the stack glpushmatrix(); // Rotate and translate BLUE rectangle glcolor3f( 0, 0, 1 ); glrotatef(90, 0.0, 0.0,1.0); // restore modelview matrix from the stack glpopmatrix(); // Scale and translate MAGENTA rectangle glcolor3f( 1, 0, 1 ); glscalef(-0.5, 1.0, 1.0); // display rectangles glutswapbuffers(); } // end of draw() 24