Computação Gráfica 5385: Licenciatura em Engenharia Informática Cap. 2 Transformações Geométricas Transformações Geométricas
Sumário
Transformações geométricas Geometria Projectiva (projecções) Geometria Afim (variação de tamanho, cisalhamento) Geometria Euclideana (translação, rotação, refleão) NOTA: o pipeline gráfico é uma implementação da geometria projectiva!
Motivação
Motivação (cont.): modelação e posicionamento Variação de Tamanho Rotação Translação Y Coordenadas Locais (modeling coordinates) X Variação de Tamanho Translação Coordenadas Globais (world coordinates)
Translação '= + Δ '= + Δ Δ=2 Δ=
Translação 2D: forma matricial ' ' = + Δ Δ http://encclopedia.laborlawtalk.com/linear_combination Uma combinação linear de e é uma epressão do tipo a+b, em que a,b são constantes.
Rotação '= cosθ sinθ '= sinθ + cosθ (, ) θ (, )
Rotação 2D: cálculo das equações (, ) = rcosφ = rsinφ '= rcos(φ +θ) '= rsin(φ +θ) θ φ (, ) ' = r cosφ cosθ r sinφ sinθ ' = r cosφ sinθ + r sinφ cosθ ' = cosθ sinθ ' = sinθ + cosθ
Rotação 2D: forma matricial ' ' = cosθ sinθ sinθ cosθ
Problema fundamental das transformações Solução: COORDENADAS HOMOGÉNEAS
Coordenadas homogéneas O P = (,,z) Q = ( z, z,) z http://www.geometer.org/mathcircles/cghomogen.pdf z= P Q z O
Translação 2D e rotação 2D: coordenadas homogéneas Translação Rotação ' ' = cosθ sinθ 0 sinθ cosθ 0 0 0 ' ' = 0 Δ 0 Δ 0 0
Geometria métrica Euclidiana
Definição de grupo: lembrete
Geometria afim
Variação de tamanho (scaling) '= λ '= λ λ = 2 λ = 2
Variação de tamanho não-uniforme '= λ '= λ com λ λ λ = 2 λ = 0.5
Cisalhamento (shearing) '= + κ '= + κ κ = κ = 0
Resumo: representação matricial 33 de transformações afins Translação Rotação Cisalhamento Variação de Tamanho ' ' = 0 Δ 0 Δ 0 0 ' ' = λ 0 0 0 λ 0 0 0 ' ' = cosθ sinθ 0 sinθ cosθ 0 0 0 ' ' = κ 0 κ 0 0 0
Composição de transformações afins 2D = 0 Δ 0 Δ 0 0. cosθ sinθ 0 sinθ cosθ 0 0 0. λ 0 0 0 λ 0 0 0.
Eemplo: rotação de θ=30º dum segmento de recta PQ em torno de P(2,0) P P P Incorrecto Rot(30) Correcto Tr(-2) Rot(30) Tr(2)
Eemplo: rotação de θ=30º dum segmento de recta PQ em torno de P(2,0) P P P P ' 0 2 cosθ sinθ 0 0 2 ' = 0 0. sinθ cosθ 0. 0 0. 0 0 0 0 0 0
Transformações afins 3D Identidade Variação de Tamanho Translação Refleão relativamente ao plano YZ ' ' z' = 0 0 0 0 0 0 0 0 0 0 0 0 z ' ' z' = λ 0 0 0 0 λ 0 0 0 0 λ z 0 0 0 0 z ' ' z' = 0 0 Δ 0 0 Δ 0 0 Δz 0 0 0 z ' ' z' = 0 0 0 0 0 0 0 0 0 0 0 0 z
Outras transformações afins 3D Rotação em torno do eio Z ' ' z' = cosθ sinθ 0 0 sinθ cosθ 0 0 0 0 0 0 0 0 z Rotação em torno do eio Y ' ' z' = cosθ 0 sinθ 0 0 0 0 sinθ 0 cosθ 0 0 0 0 z Rotação em torno do eio X ' ' z' = 0 0 0 0 cosθ sinθ 0 0 sinθ cosθ 0 0 0 0 z
Transformações afins em OpenGL
Transformações afins pré-definidas em OpenGL
Transformações geométricas arbitrárias em OpenGL
Transformações afins com acumulação Transformações afins sem acumulação Transformações afins com acumulação controlada
Transformações 2D c/ acumulação // Cumulative 2D transformations #include <OpenGL/gl.h> #include <OpenGL/glu.h> #include <GLUT/glut.h> #include <stdlib.h> void draw() { // Make background colour ellow glclearcolor( 00, 00, 0, 0 ); glclear ( GL_COLOR_BUFFER_BIT ); // modelview matri glmatrimode(gl_modelview); // -ais glcolor3f(0,0,0); glbegin(gl_lines); glverte2f(0.0,0.0); glverte2f(0.5,0.0); glend(); // -ais glcolor3f(0,0,0); glbegin(gl_lines); glverte2f(0.0,0.0); glverte2f(0.0,0.5); glend();
Transformações 2D c/ acumulação (cont.)
Transformações 2D s/ acumulação // quad.cc - Non-cumulative 2D transformations #include <OpenGL/gl.h> #include <OpenGL/glu.h> #include <GLUT/glut.h> #include <stdlib.h> void draw() { // Make background colour ellow glclearcolor( 00, 00, 0, 0 ); glclear ( GL_COLOR_BUFFER_BIT ); // modelview matri glmatrimode(gl_modelview); // -ais glcolor3f(0,0,0); glbegin(gl_lines); glverte2f(0.0,0.0); glverte2f(0.5,0.0); glend(); // -ais glcolor3f(0,0,0); glbegin(gl_lines); glverte2f(0.0,0.0); glverte2f(0.0,0.5); glend();
Transformações 2D s/ acumulação (cont.) // Keboard method to allow ESC ke to quit void keboard(unsigned char ke,int,int ) { if(ke==27) eit(0); } int main(int argc, char ** argv) { glutinit(&argc, argv); // Double Buffered RGB displa glutinitdisplamode( GLUT_RGB GLUT_DOUBLE); // Set window size glutinitwindowsize( 500,500 ); glutcreatewindow("rectangles..."); // Declare the displa and keboard functions glutdisplafunc(draw); glutkeboardfunc(keboard); // Start the Main Loop glutmainloop(); return 0; }
Transformações 2D c/ acumulação controlada //Stack-cumulative 2D transformations #include <OpenGL/gl.h> #include <OpenGL/glu.h> #include <GLUT/glut.h> #include <stdlib.h> void draw(){ // Make background colour ellow glclearcolor( 00, 00, 0, 0 ); glclear ( GL_COLOR_BUFFER_BIT ); // modelview matri glmatrimode(gl_modelview); // -ais glcolor3f(0,0,0); glbegin(gl_lines); glverte2f(0.0,0.0); glverte2f(0.5,0.0); glend(); // -ais glcolor3f(0,0,0); glbegin(gl_lines); glverte2f(0.0,0.0); glverte2f(0.0,0.5); glend();
Transformações 2D c/ acumulação controlada (cont.) // Keboard method to allow ESC ke to quit void keboard(unsigned char ke,int,int ) { if(ke==27) eit(0); } int main(int argc, char ** argv) { glutinit(&argc, argv); // Double Buffered RGB displa glutinitdisplamode( GLUT_RGB GLUT_DOUBLE); // Set window size glutinitwindowsize( 500,500 ); glutcreatewindow("rectangles..."); // displa and keboard functions glutdisplafunc(draw); glutkeboardfunc(keboard); // Start the Main Loop glutmainloop(); return 0; }
Sumário: