Superfcies de Bzier Visualizao 3 D Estruturas de
Superfícies de Bézier Visualização 3 D Estruturas de Dados Básica (Global) para Construção de uma Superfície Bézier 3 D: // Pontos de controle da Bézier (Ver teoria da Sala de Aula) GLfloat pontos[4][4][3] = { {{0. 0, 0. 0}, {0. 3, 0. 5, 0. 0}, {0. 7, 0. 5, 0. 0}, {1. 0, 0. 0}}, {{0. 0, 0. 3}, {0. 3, 0. 5, 0. 3}, {0. 7, 0. 5, 0. 3}, {1. 0, 0. 3}}, {{0. 0, 0. 7}, {0. 3, 0. 5, 0. 7}, {0. 7, 0. 5, 0. 7}, {1. 0, 0. 7}}, {{0. 0, 1. 0}, {0. 3, 0. 5, 1. 0}, {0. 7, 0. 5, 1. 0}, {1. 0, 0. 0, 1. 0}} }; #define SENS_ROT #define SENS_OBS #define SENS_TRANSL 5. 0 15. 0 30. 0
Superfícies de Bézier Para Construir a Superfície de Bézier são necessários principalmente: uma estrutura de Dados (slide anterior) e as funções a seguir: // Função para calcular a Superfície (Chamada de dentro da inicializa) // Define significado dos pontos de controle gl. Map 2 f(GL_MAP 2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &pontos[0][0][0]); // Ativa geração de coordenadas gl. Enable(GL_MAP 2_VERTEX_3);
Superfícies de Bézier Explicação mais Detalhada // Função para calcular a superfície (Chamada de dentro da inicializa) // Define significado dos pontos de controle gl. Map 2 f(GL_MAP 2_VERTEX_3, GLfloat u 1, GLfloat u 2, GLint ustride, GLint uorder, GLfloat v 1, GLfloat v 2, GLint vstride, GLint vorder, GLfloat *pontos); • GL_MAP 2_VERTEX_3: significado dos pontos de controle. Outras opções podem ser: GL_MAP 2_VERTEX_4, GL_MAP 2_INDEX, GL_MAP 2_COLOR_4, GL_MAP 2_NORMAL, GL_MAP 2_TEXTURE_COORD_1, GL_MAP 2_TEXTURE_COORD_2, GL_MAP 2_TEXTURE_COORD_3 e GL_MAP 2_TEXTURE_COORD_4. • u 1 e u 2, v 1 e v 2 definem os intervalos para as variáveis de controle em duas dimensões.
Superfícies de Bézzier Explicação mais Detalhada // Função para calcular a Bézier (Chamada de dentro da inicializa) // Define significado dos pontos de controle gl. Map 2 f(GL_MAP 2_VERTEX_3, GLfloat u 1, GLfloat u 2, GLint ustride, GLint uorder, GLfloat v 1, GLfloat v 2, GLint vstride, GLint vorder, GLfloat *pontos); • Os valores ustride e vstride indicam quantos valores float existem entre cada elemento do vetor no sentido horizontal (ustride) e vertical (vstride) • Os parâmetros uorder e vorder devem conter a quantidade de elementos nos dois sentidos • *pontos é um ponteiro para a estrutura de dados onde são guardados os pontos de controle.
Superfícies de Bézier Explicação mais Detalhada Finalmente, gl. Eval. Coord 2 f(i, j) é a função que avalia os pontos de controle nas coordenadas definidas por gl. Map 2 f Parâmetros avaliados com o uso da função gl. Eval. Coord 2 f Relembrando da Teoria: Curva de Bézier de grau 3 Pontos de controle
Superfícies de Bézier // Função de Avaliação (Chamada de dentro das macros de desenho (gl. Begin/Ebd)) // Traça a superfície for(float j=0; j<=1. 01; j+=delta) { gl. Begin(GL_LINE_STRIP); // desenha (avalia) uma dimensão for(float i=0; i<=1. 01; i+=delta) gl. Eval. Coord 2 f(i, j); gl. End(); gl. Begin(GL_LINE_STRIP); // desenha (avalia) a segunda dimenção for(float i=0; i<=1. 01; i+=delta) gl. Eval. Coord 2 f(j, i); gl. End(); }
Superfícies de Bézier Sugestão de Clall. Backs para serem usadas: // Registra a função callback para eventos de botões do mouse glut. Mouse. Func(Gerencia. Mouse); // Registra a função callback para eventos de movimento do mouse glut. Motion. Func(Gerencia. Movim); // Registra a função callback para tratamento das teclas normais glut. Keyboard. Func (Teclado); // Registra a função callback para tratamento das teclas especiais glut. Special. Func (Teclas. Especiais);
Superfícies de Bézier // Função callback para eventos de botões do mouse void Gerencia. Mouse(int button, int state, int x, int y) { if (state==GLUT_DOWN) { // Salva os parâmetros atuais x_ini = x; y_ini = y; obs. X_ini = obs. X; obs. Y_ini = obs. Y; obs. Z_ini = obs. Z; rot. X_ini = rot. X; rot. Y_ini = rot. Y; bot = button; } else bot = -1; }
Superfícies de Bézier // Função callback para eventos de movimento do mouse void Gerencia. Movim(int x, int y) { // Botão esquerdo ? if(bot==GLUT_LEFT_BUTTON) { // Calcula diferenças int deltax = x_ini - x; int deltay = y_ini - y; // E modifica ângulos rot. Y = rot. Y_ini - deltax/SENS_ROT; rot. X = rot. X_ini - deltay/SENS_ROT; }
Superfícies de Bézier // Função callback para eventos de movimento do mouse (Continuação) // Botão direito ? else if(bot==GLUT_RIGHT_BUTTON) { // Calcula diferença int deltaz = y_ini - y; // E modifica distância do observador obs. Z = obs. Z_ini + deltaz/SENS_OBS; } // Botão do meio ? else if(bot==GLUT_MIDDLE_BUTTON) { // Calcula diferenças int deltax = x_ini - x; int deltay = y_ini - y; // E modifica posições obs. X = obs. X_ini + deltax/SENS_TRANSL; obs. Y = obs. Y_ini - deltay/SENS_TRANSL; } Posiciona. Observador(); glut. Post. Redisplay(); }
Superfícies de Bézier // Função responsável por inicializar parâmetros e variáveis (Chamada na Função Principal) void Inicializa (void) { // Define significado dos pontos de controle (explicação acima) gl. Map 2 f(GL_MAP 2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &pontos[0][0][0]); // Ativa geração de coordenadas gl. Enable(GL_MAP 2_VERTEX_3); (explicação acima) // Define a cor de fundo da janela de visualização como branca gl. Clear. Color(1. 0 f, 1. 0 f); // Inicializa a variável que especifica o ângulo da projeção // perspectiva angle=60; // Inicializa as variáveis usadas para alterar a posição do // observador virtual rot. X = 0; rot. Y = 0; obs. X = obs. Y = 0; obs. Z = 5; }
Superfícies de Bézier // Função callback para tratar eventos de teclas especiais void Teclas. Especiais (int tecla, int x, int y) { switch (tecla) { case GLUT_KEY_HOME: if(angle>=10) angle -=5; break; case GLUT_KEY_END: if(angle<=150) angle +=5; break; } Especifica. Parametros. Visualizacao(); glut. Post. Redisplay(); }
Superfícies de Bézier // Função callback chamada para gerenciar eventos de teclas void Teclado (unsigned char key, int x, int y) { switch(key) { case '-': if(prec>2) prec--; break; case '+': prec++; break; case 27: exit(0); break; } glut. Post. Redisplay(); }
Superfícies de Bézier // Função callback chamada quando o tamanho da janela é alterado void Altera. Tamanho. Janela(GLsizei w, GLsizei h) { // Para previnir uma divisão por zero if ( h == 0 ) h = 1; // Especifica as dimensões da viewport gl. Viewport(0, 0, w, h); // Calcula a correção de aspecto f. Aspect = (GLfloat)w/(GLfloat)h; Especifica. Parametros. Visualizacao(); }
Superfícies de Bézier // Função usada para especificar o volume de visualização void Especifica. Parametros. Visualizacao(void) { // Especifica sistema de coordenadas de projeção gl. Matrix. Mode(GL_PROJECTION); // Inicializa sistema de coordenadas de projeção gl. Load. Identity(); // Especifica a projeção perspectiva(angulo, aspecto, z. Min, z. Max) glu. Perspective(angle, f. Aspect, 0. 1, 1200); Posiciona. Observador(); }
Superfícies de Bézier Explicação mais Detalhada // Especifica a projeção perspectiva(angulo, aspecto, z. Min, z. Max) GLvoid glu. Perspective( GLdouble fovy, GLdouble aspect, GLdouble near. Clip, GLdouble far. Clip ) • Um Grande fovy é como olhar através de uma lente grande • Um pequeno fovy é como olhar através de um telescópio • O aspecto é a largura/altura do plano de projeção
Superfícies de Bézier // Função usada para especificar a posição do observador virtual void Posiciona. Observador(void) { // Especifica sistema de coordenadas do modelo gl. Matrix. Mode(GL_MODELVIEW); // Inicializa sistema de coordenadas do modelo gl. Load. Identity(); // Posiciona e orienta o observador gl. Translatef(-obs. X, -obs. Y, -obs. Z); gl. Rotatef(rot. X, 1, 0, 0); gl. Rotatef(rot. Y, 0, 1, 0); }
Superfícies de Bézier // Função callback de redesenho da janela de visualização void Desenha(void) { // Limpa a janela de visualização com a cor // de fundo definida previamente gl. Clear(GL_COLOR_BUFFER_BIT); // Altera a cor do desenho para preto gl. Color 3 f(0. 0 f, 0. 0 f); // Calcula incremento de acordo com o total // de pontos intermediários float delta = 1. 0/(float)prec;
Superfícies de Bézier // Função callback de redesenho da janela de visualização (Continuação) // Traça a superfície for(float j=0; j<=1. 01; j+=delta) { gl. Begin(GL_LINE_STRIP); for(float i=0; i<=1. 01; i+=delta) gl. Eval. Coord 2 f(i, j); gl. End(); gl. Begin(GL_LINE_STRIP); for(float i=0; i<=1. 01; i+=delta) gl. Eval. Coord 2 f(j, i); gl. End(); }
Superfícies de Bézier // Função callback de redesenho da janela de visualização (Continuação) // Muda a cor para vermelho gl. Color 3 f(1. 0 f, 0. 0 f); // Define tamanho de um ponto gl. Point. Size(5. 0); // Desenha os pontos de controle gl. Begin(GL_POINTS); for(int i=0; i<4; ++i) for(int j=0; j<4; ++j) gl. Vertex 3 fv(pontos[i][j]); gl. End(); // Executa os comandos Open. GL gl. Flush(); }
- Slides: 20