Jonh Edson Ribeiro de Carvalho | IC-UFFComputação Visual e Interfaces |
|||||||||||||
|
|||||||||||||
Tutorial OpenGL | |||||||||||||
Capítulo 8. Superfícies no espaço
O propósito desta lição é mostrar como gerar no espaço as superfícies paramétricas de Bézier e NURBS utilizando OpenGL. De modo semelhante às curvas descritas no Capítulo 7, a forma destas superfícies é controlada pelo posicionamento de vértices, desta vez componentes de um malha característica. Com a resolução dos exercícios propostos no final da lição, o aluno poderá notar a utilidade das superfícies apresentadas, associando-as a uma situação prática, através da modelagem interativa de uma superfície. Será mostrado também como introduzir iluminação na cena, de modo a tornar a apresentação da superfície mais realística. A superfície gerada pelo programa utilizado nesta lição é mostrado na Figura 8-1. O programa usado para modelar as splines é mostrado no Exemplo 8-1. As teclas b e n definem o tipo de curva que será desenhada: Bézier ou NURBS, respectivamente. As teclas x e X, rotacionam a superfície em torno do eixo x. As teclas y e Y, rotacionam a superfície em torno do eixo y. As teclas z e Z, rotacionam a superfície em torno do eixo z. Exemplo 8-1. programa splines3d.c
Para compilar e executar o programa splines3d.c, salve-o juntamente com o arquivo Makefile em um diretório e execute a seguinte seqüência de comandos:
8.1. Descrição do programa splines3d.c
Define o número de vértices da malha característica (variável nVertices) e as posições no espaço dos seus respectivos vértices (matriz vertices).
As variáveis largura e altura armazenam a largura e a altura da janela corrente, em pixels.
A variável nc contém a referência para a spline que irá modelar a superfície tipo NURBS. nos e nNos são o vetor de nós e o número de nós neste vetor, respectivamente.
Cria as coordenadas x, y e z dos pontos da malha de controle.
Cria um segmento de reta representando o eixo x. A função glRasterPos3f() define a posição do rasterizador para operações com pixels (desenho de bitmaps). Neste caso, o rasterizador é posicionado na ponta do eixo x. Em seguida, a função glutBitmapCharacter() é utilizada para desenhar um mapa de bits do caracter 'x' com a fonte especificada. Outras duas operações semelhantes são realizadas para os eixos y e z.
Caso a superfície seja do tipo Bézier, o seu traçado também se com o uso de avaliadores (semelhante ao caso bidimensional). A função glMap2f() define um avaliador bididimesional. A função glMap2f() possui o seguinte protótipo:
O parâmetro target especifica o tipo de valores gerados pelo evaluator; neste caso, especifica que cada ponto de controle é usado para mapear três valores x, y e z. Comandos internos glVertex*() são gerados quando este mapeamento é realizado. u1 e u2 especificam a faixa de mapeamento linear para u (direção x), ou seja, a faixa de variação do parâmetro que define a curva; neste caso [0,1]. ustride especifica o número de elementos entre o início de um ponto de controle e o início do ponto de controle seguinte; como cada ponto de controle possui três coordenadas, ustride=3 para este exemplo. O parâmetro order especifica o número de pontos de controle para a curva (6 pontos). Estes quatro parâmetros repetem-se para o mapeamento de 'v', relativo à direção y da superfície. Finalmente, o parâmetro *points deve conter a posição do primeiro ponto da malha de controle.
As funções glMapGrid2f() e glEvalMesh2() são utilizadas em conjunto para gerar uma série valores de 'u' e 'v' e avaliar as coordenadas x, y e z do pontos da superfície, para cada um dos pares de parâmetros (u,v). Foi definido 20 subdivisões para as faixas de cada parâmetro, [0,1]. Na função glEvalMesh2() foi especificado que a superfície deveria ser preenchida (GL_FILL), mas poderia também ser traçada utilizando linhas (GL_LINES) ou pontos (GL_POINTS). Os parâmetros seguintes passados para essa função indicam os primeiros e últimos valores inteiros utilizados para as posições do grid de desenho. Foi habilitado, através do parâmetro GL_AUTO_NORMAL, o cálculo automático dos vetores normais aos pontos da superfície, utilizados no processo de iluminação da cena.
Se a curva a ser desenhada for do tipo NURBS, então as funções gluBeginSurface() e gluEndSurface() serão utilizadas para demarcar o início e o fim do seu traçado. A função usada para desenhar esta classe de superfícies é gluNurbsSurface, cujos parâmetros são semelhantes aos da função gluNurbsCurve(), acrescentando o vetor de nós e o número de nós na direção y (nos e nNos), os deslocamentos entre sucessivos pontos de controle (stride) nas duas direções (4*3 e 3), e as ordens da superfície em ambas as direções (4 e 4). A variável nc é iniciada na função init(). Neste exemplo o valor do deslocamento na direção x é 12 (4*3) porque existem três coordenadas para cada vértice (GL_MAP2_VERTEX_3) e quatro pontos de controle na direção v. O valor do deslocamento na direção v é 3 porque cada vértice tem três coordenadas, e os pontos de controle v são adjacentes uns aos outros na memória.
Define as características do material que serão utilizadas pelo modelo de iluminação, através da função glMaterialfv(). Por enquanto estes recursos são apenas ilustrativos, pois serão abordados em uma lição posterior.
A função glShadeModel() define o modelo de sombreamento usado na superfície. O parâmetro GL_SMOOTH torna a superfície suave, mais realística. Da mesma forma que a função glMaterialfv(), a presença desta também é ilustrativa, pois também será abordada em uma lição posterior. Se o parâmetro GL_MAP2_VERTEX_3 for hatilitado, chamadas às funções glEvalCoord2(), glEvalMesh2 e glEvalPoint2 irão gerar vértices com coordenadas x, y e z, necessárias ao traçado das superfícies.
Aqui, a geração automática de vetores normais à superfície é habilitado via GL_AUTO_NORMAL. Após gerados, os vetores normais são escalados de modo a ficarem com módulo igual a 1, melhorando a exibição da superfície. |
|||||||||||||
CopyLeft Webmaster |Atualizado em 22/11/2003 | |||||||||||||
Contato Pesquisas e Projetos Publicações Home |