Superf - PowerPoint PPT Presentation

1 / 20
About This Presentation
Title:

Superf

Description:

Superf cies de B zier Visualiza o 3D Estruturas de Dados B sica (Global) para Constru o de uma Superf cie B zier 3D: // Pontos de controle da B zier (Ver ... – PowerPoint PPT presentation

Number of Views:78
Avg rating:3.0/5.0
Slides: 21
Provided by: psergio
Category:

less

Transcript and Presenter's Notes

Title: Superf


1
Superfícies de Bézier
  • Visualização 3D
  • Estruturas de Dados Básica (Global) para
    Construção de uma Superfície Bézier 3D
  • // Pontos de controle da Bézier (Ver teoria da
    Sala de Aula)
  • GLfloat pontos443
  • 0.0, 0.0, 0.0, 0.3, 0.5, 0.0, 0.7, 0.5,
    0.0, 1.0, 0.0, 0.0,
  • 0.0, 0.0, 0.3, 0.3, 0.5, 0.3, 0.7, 0.5,
    0.3, 1.0, 0.0, 0.3,
  • 0.0, 0.0, 0.7, 0.3, 0.5, 0.7, 0.7, 0.5,
    0.7, 1.0, 0.0, 0.7,
  • 0.0, 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 5.0 define SENS_OBS 15.0 define
SENS_TRANSL 30.0
2
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
  • glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12,
    4, pontos000)
  • // Ativa geração de coordenadas
  • glEnable(GL_MAP2_VERTEX_3)

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
  • glMap2f(GL_MAP2_VERTEX_3,GLfloat u1, GLfloat
    u2, GLint ustride,
  • GLint uorder, GLfloat v1, GLfloat v2, GLint
    vstride, GLint vorder, GLfloat pontos)
  • GL_MAP2_VERTEX_3 significado dos pontos de
    controle. Outras opções podem ser
    GL_MAP2_VERTEX_4, GL_MAP2_INDEX, GL_MAP2_COLOR_4,
    GL_MAP2_NORMAL, GL_MAP2_TEXTURE_COORD_1,
    GL_MAP2_TEXTURE_COORD_2, GL_MAP2_TEXTURE_COORD_3
    e GL_MAP2_TEXTURE_COORD_4.
  • u1 e u2, v1 e v2 definem os intervalos para as
    variáveis de controle em duas dimensões.

4
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
  • glMap2f(GL_MAP2_VERTEX_3,GLfloat u1, GLfloat
    u2, GLint ustride,
  • GLint uorder, GLfloat v1, GLfloat v2, 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.

5
Superfícies de Bézier
  • Explicação mais Detalhada
  • Finalmente, glEvalCoord2f(i,j) é a função que
    avalia os pontos de controle nas coordenadas
    definidas por glMap2f
  • Relembrando da Teoria Curva de Bézier de grau 3

Pontos de controle
Parâmetros avaliados com o uso da função
glEvalCoord2f
6
Superfícies de Bézier
  • // Função de Avaliação (Chamada de dentro das
    macros de desenho (glBegin/Ebd))
  • // Traça a superfície
  • for(float j0 jlt1.01 jdelta)
  • glBegin(GL_LINE_STRIP) // desenha (avalia)
    uma dimensão
  • for(float i0 ilt1.01 idelta)
  • glEvalCoord2f(i,j)
  • glEnd()
  • glBegin(GL_LINE_STRIP) // desenha (avalia)
    a segunda dimenção
  • for(float i0 ilt1.01 idelta)
  • glEvalCoord2f(j,i)
  • glEnd()

7
Superfícies de Bézier
  • Sugestão de ClallBacks para serem usadas
  • // Registra a função callback para eventos de
    botões do mouse
  • glutMouseFunc(GerenciaMouse)
  • // Registra a função callback para eventos de
    movimento do mouse
  • glutMotionFunc(GerenciaMovim)
  • // Registra a função callback para tratamento das
    teclas normais
  • glutKeyboardFunc (Teclado)
  • // Registra a função callback para tratamento das
    teclas especiais
  • glutSpecialFunc (TeclasEspeciais)

8
Superfícies de Bézier
  • // Função callback para eventos de botões do
    mouse
  • void GerenciaMouse(int button, int state, int x,
    int y)
  • if (stateGLUT_DOWN)
  • // Salva os parâmetros atuais
  • x_ini x
  • y_ini y
  • obsX_ini obsX
  • obsY_ini obsY
  • obsZ_ini obsZ
  • rotX_ini rotX
  • rotY_ini rotY
  • bot button
  • else bot -1

9
Superfícies de Bézier
  • // Função callback para eventos de movimento do
    mouse
  • void GerenciaMovim(int x, int y)
  • // Botão esquerdo ?
  • if(botGLUT_LEFT_BUTTON)
  • // Calcula diferenças
  • int deltax x_ini - x
  • int deltay y_ini - y
  • // E modifica ângulos
  • rotY rotY_ini - deltax/SENS_ROT
  • rotX rotX_ini - deltay/SENS_ROT

10
Superfícies de Bézier
  • // Função callback para eventos de movimento do
    mouse (Continuação)
  • // Botão direito ?
  • else if(botGLUT_RIGHT_BUTTON)
  • // Calcula diferença
  • int deltaz y_ini - y
  • // E modifica distância do observador
  • obsZ obsZ_ini deltaz/SENS_OBS
  • // Botão do meio ?
  • else if(botGLUT_MIDDLE_BUTTON)
  • // Calcula diferenças
  • int deltax x_ini - x
  • int deltay y_ini - y
  • // E modifica posições
  • obsX obsX_ini deltax/SENS_TRANSL
  • obsY obsY_ini - deltay/SENS_TRANSL

11
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)
  • glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12,
    4, pontos000)
  • // Ativa geração de coordenadas
  • glEnable(GL_MAP2_VERTEX_3) (explicação acima)
  • // Define a cor de fundo da janela de
    visualização como branca
  • glClearColor(1.0f, 1.0f, 1.0f, 1.0f)
  • // Inicializa a variável que especifica o ângulo
    da projeção
  • // perspectiva
  • angle60
  • // Inicializa as variáveis usadas para alterar a
    posição do
  • // observador virtual
  • rotX 0
  • rotY 0

12
Superfícies de Bézier
  • // Função callback para tratar eventos de teclas
    especiais
  • void TeclasEspeciais (int tecla, int x, int y)
  • switch (tecla)
  • case GLUT_KEY_HOME if(anglegt10) angle -5
  • break
  • case GLUT_KEY_END if(anglelt150) angle 5
  • break
  • EspecificaParametrosVisualizacao()
  • glutPostRedisplay()

13
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(precgt2) prec--
  • break
  • case '' prec
  • break
  • case 27 exit(0)
  • break
  • glutPostRedisplay()

14
Superfícies de Bézier
  • // Função callback chamada quando o tamanho da
    janela é alterado
  • void AlteraTamanhoJanela(GLsizei w, GLsizei h)
  • // Para previnir uma divisão por zero
  • if ( h 0 ) h 1
  • // Especifica as dimensões da viewport
  • glViewport(0, 0, w, h)
  • // Calcula a correção de aspecto
  • fAspect (GLfloat)w/(GLfloat)h
  • EspecificaParametrosVisualizacao()

15
Superfícies de Bézier
  • // Função usada para especificar o volume de
    visualização
  • void EspecificaParametrosVisualizacao(void)
  • // Especifica sistema de coordenadas de projeção
  • glMatrixMode(GL_PROJECTION)
  • // Inicializa sistema de coordenadas de projeção
  • glLoadIdentity()
  • // Especifica a projeção perspectiva(angulo,aspec
    to,zMin,zMax)
  • gluPerspective(angle,fAspect,0.1,1200)
  • PosicionaObservador()

16
Superfícies de Bézier
  • Explicação mais Detalhada
  • // Especifica a projeção perspectiva(angulo,aspect
    o,zMin,zMax)
  • GLvoid gluPerspective( GLdouble fovy, GLdouble
    aspect, GLdouble nearClip, GLdouble farClip )
  • 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

17
Superfícies de Bézier
  • // Função usada para especificar a posição do
    observador virtual
  • void PosicionaObservador(void)
  • // Especifica sistema de coordenadas do modelo
  • glMatrixMode(GL_MODELVIEW)
  • // Inicializa sistema de coordenadas do modelo
  • glLoadIdentity()
  • // Posiciona e orienta o observador
  • glTranslatef(-obsX,-obsY,-obsZ)
  • glRotatef(rotX,1,0,0)
  • glRotatef(rotY,0,1,0)

18
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
  • glClear(GL_COLOR_BUFFER_BIT)
  • // Altera a cor do desenho para preto
  • glColor3f(0.0f, 0.0f, 0.0f)
  • // Calcula incremento de acordo com o total
  • // de pontos intermediários
  • float delta 1.0/(float)prec

19
Superfícies de Bézier
  • // Função callback de redesenho da janela de
    visualização (Continuação)
  • // Traça a superfície
  • for(float j0 jlt1.01 jdelta)
  • glBegin(GL_LINE_STRIP)
  • for(float i0 ilt1.01 idelta)
  • glEvalCoord2f(i,j)
  • glEnd()
  • glBegin(GL_LINE_STRIP)
  • for(float i0 ilt1.01 idelta)
  • glEvalCoord2f(j,i)
  • glEnd()

20
Superfícies de Bézier
  • // Função callback de redesenho da janela de
    visualização (Continuação)
  • // Muda a cor para vermelho
  • glColor3f(1.0f, 0.0f, 0.0f)
  • // Define tamanho de um ponto
  • glPointSize(5.0)
  • // Desenha os pontos de controle
  • glBegin(GL_POINTS)
  • for(int i0 ilt4 i)
  • for(int j0 jlt4 j)
  • glVertex3fv(pontosij)
  • glEnd()
  • // Executa os comandos OpenGL
  • glFlush()
Write a Comment
User Comments (0)
About PowerShow.com