Curvas e Superfícies
3.2. SUPERFÍCIES
3.2.11. Superfícies Racionais
O processo de geração de superfícies (seção 3.1.9) racionais também é uma exten- são do processo usado para gerar as curvas racionais, aplicando os mesmos concei- tos de coordenadas homogêneas. A tabela que segue compara as expressões.
P (s, t) = Forma Inteira Forma Racional Bézier i 0 n i, j j 0 m i,n j,m B J (s) J (t) = =
å å
i 0 n i, j j m i, j i,n j,m i n i, j j m w B J (s) J (t) w = = = =å å
å å
0 0 0 Ji,n(s) Jj,m(t) B-Spline i 0 n i, j j 0 m i,k j,l B N (s) N (t) = =å å
i 0 n i, j j 0 m i,k j,l i, j i 0 n i, j j 0 m w N (s) N (t) B w = = = =å å
å å
Ni,k(s) N (t)j,lOnde Bisão os pontos de controle, wi,j são os pesos de cada ponto de controle (coordenada homogênea) e Ni,k(s), Nj,l(t), Ji,n(s) e Jj,m(t) são as funções de interpo- lação usadas.
No caso das superfícies de B-Spline, o vetor de nós usado pode ser periódico e uniforme; não-periódico ou não-uniforme, podendo ser usados vetores de nós dife- rentes nas direções s e t, como no caso das curvas onde os pesos wi,jdão um grau de liberdade adicional para a forma da superfície a ser obtida. A maioria das proprieda-
des das superfícies não-racionais estende-se à sua forma similar racional. Por exem- plo, se rotações e translações forem aplicadas aos pontos de controle, a superfície será interior ao convex hull do poliedro que a envolve.
3.2.12. NURBS
O termo NURBS é a abreviatura de Non-Uniform Rational B-Splines Surfaces, ou seja, é uma B-Spline racional (originária da razão de polinômios). Non-Uniform significa que a influência da extensão de um controle de vértice não precisa ser a in- tervalos iguais do parâmetro t, podendo variar (o que é muito bom na modelagem de superfícies irregulares). Rational significa que a equação usada para representar a curva ou superfície é expressa pela razão de dois polinômios. A forma Rational (como comentado na seção anterior) fornece um modelo melhor de algumas im- portantes superfícies especialmente para formas cônicas e esféricas.
As superfícies NURBS não existem no mundo do desenho tradicional. Elas foram criadas especialmente para a modelagem em três dimensões no computador. As NURBS são construídas matematicamente e representam formas de um espaço 3D. O uso de NURBS oferece uma forma matemática comum tanto para a análise quan- to para a geração de formas livres. Ela provê uma flexibilidade adicional para proje- tar uma grande variedade de formas e pode ser avaliada de maneira razoavelmente rápida por algoritmos numericamente estáveis e precisos.
Essas superfícies são obtidas com o uso de matrizes Bi,jde nós não-uniformes e são uma das formas de representação mais usadas em projetos de engenharia, prin- cipalmente por englobar todas as outras formas de representação.
A forma geral das B-Splines racionais, descritas na seção anterior, é também usada nas formas não-uniformes. A única restrição é (como o nome indica) que os vetores de nós sejam não-uniformes. Ela pode fazer com que todas as demais formas de re- presentação sejam casos particulares dela, bastando seguir as seguintes restrições:
Tipo De Curva Restrição
B-Spline não-racional Fixar todos os pesos wi,j=1
Bézier racional Se o número de pontos de controle é igual à ordem em cada di- reção dos parâmetros e não existirem nós interiores duplicados Bézier não-racional As mesmas das racionais, além de fixar que o peso seja wi,j=1
Além disso, as NURBS têm a habilidade de representar superfícies quadráticas. A característica não-uniforme das NURBS nos leva a um importante ponto. Por se- rem geradas matematicamente na forma homogênea, NURBS possuem um parâmetro adicional em 3D. Especificamente, um “array” de valores chamados nós especifica a in- fluência de sua extensão para cada vértice da curva ou superfície. Os nós são invisíveis
ao usuário e não podem ser manipulados diretamente, sendo que, ocasionalmente, o seu comportamento é capaz de afetar a aparência de um objeto gerado por NURBS.
A função polinomial das curvas NURBs é definida como:
P(t) w B N (t) w N (t) i i 0 n i n,i i i 0 n n,i = = = =
å
å
Pw( )tTodos os polinômios possuem um grau. Uma equação linear possui grau 1; uma quadrática, grau 2; e as NURBs dependerão do grau das equações. Por exemplo, as cú- bicas possuem grau 3. Graus mais elevados são possíveis, porém muitas vezes desne- cessários e complexos. Uma curva pode possuir níveis de continuidade maiores que C2, mas para modelagem em computadores, curvaturas contínuas são satisfatórias. Ge- ralmente, a distinção entre uma curva C2e uma outra de maior continuidade é imper- ceptível para usuário.
Continuidade e grau estão relacionados. O grau 3 pode gerar curvas de continui- dade C2. Esse é o motivo pelo qual curvas de maior grau não são necessárias para
modelagem de NURBs. Curvas de graus maiores são também menos estáveis nume- ricamente, o que as torna não recomendáveis.
Diferentes segmentos de curvas NURBs podem ter diferentes níveis de continuida- de dependendo do posicionamento dos pontos de controle pelo usuário. Em particu- lar, quando posicionamos dois pontos de controle em um mesmo lugar ou muito próximos, o nível de continuidade será reduzido. Dois pontos de controles coinci- dentes aguçam a curvatura, enquanto três coincidentes criam uma quebra angular na curva. Essa propriedade de uma NURBs é conhecida como multiplicidade.
Existem três pontos de controles no ápice da esquerda e dois no ápice da direita nas curvas da Figura 3.29. Movendo um dos controles de vértices para longe do ou- tro, o nível de continuidade da curva será aumentado. A multiplicidade também é aplicada quando os pontos de controle são fundidos, gerando a criação de curvas refinadas ou quebradas. Refinar uma curva significa adicionar mais pontos de con- trole à curva. (Figura 3.29). Quando uma curva é refinada, sugerimos reparametri- zá-la. A reparametrização ajusta os parâmetros para que a curva se comporte ade- quadamente quando em edição.
z z z
x x x
y
y y
Os reparametrizadores mais úteis são os de comprimento de curva e os unifor- mes. No primeiro caso, os espaços entre os nós são reparametrizados com base na raiz quadrada do comprimento de cada segmento da curva. No segundo caso, ocor- re a reparametrização uniforme dos espaços entre os nós.
3.2.12.1. NURBS em OpenGL
Antes de chamarmos qualquer função NURBS, temos de dizer ao OpenGL que cria- remos um NURB. Isso pode ser feito pela chamada de função
nurbSurface = gluNewNurbsRenderer( );
Cada chamada a essa função retorna um ponteiro para a GLUnurbsObj, que deve ser usado com as demais funções NURBS. Dessa maneira, podemos criar quantos patches NURBS desejarmos ajustando suas propriedades individualmente.
Para ajustarmos as propriedades de um NURBS, chamamos a função gluNur- bsProperty( ).
gluNurbsProperty( GLUnurbsObj *nurb, GLenum property, GLfloat value );
As propriedades devem ser uma das que seguem:
GLU_SAMPLING_TOLERANCE: especifica o comprimento máximo em pixel dos polígonos que compõem a malha. Quanto menor, mais suave parecerá a malha, po- rém demandará mais tempo para o render. O valor padrão é de 50 pixels.
GLU_DISPLAY_MODE: define como um NURBS deve ser renderizado entre as seguin- tes opções: GLU_FILL, GLU_OUTLINE_POLYGON, ou GLU_OUTLINE_ PATCH GLU_CULLING: este é um valor booleano. GL_TRUE significa que uma superfície NURBS deve ser descartada se os seus pontos de controle estiverem fora da janela de visualização. O padrão é GL_FALSE.
GLU_AUTO_LOAD_MATRIX: este também é um valor booleano. GL_TRUE sig- nifica que um NURBS utiliza as matrizes de projeção corrente, modelview e view- port. GL_FALSE requer a especificação de matrizes através da função gluLoadSam- plingMatrices( ).
Agora que ajustamos as propriedades basta desenhar a curva através da função:
gluNurbsSurface( GLUnurbsObj *nurb, GLint uKnotCount, GLfloat *uKnot, GLint vKnotCount, GLfloat *vKnot, GLint uStride, GLint vStride, GLfloat *ctrlArray, GLint uOrder, GLint vOrder, GLenum type );
— nurb é o ponteiro do objeto NURBS
— uKnotCount especifica o número de nós na direção paramétrica u — uKnot especifica um array de nós crescente na direção u
— vKnotCount especifica o número de nós na direção paramétrica v — vKnot especifica um array de nós crescente na direção v
— uStride especifica o equilíbrio entre pontos de controles sucessivos na direção paramétrica u em ctrlArray
— vStride especifica o equilíbrio entre pontos de controles sucessivos na direção paramétrica v em ctrlArray
— uOrder especifica a ordem da superfície NURBS na direção u — vOrder especifica a ordem da superfície NURBS na direção v
— type especifica o tipo de superfície, que poderá ser GL_MAP2_VERTEX_3 or GL_MAP2_COLOR_4
Se desejar desenhar uma linha curva, em vez de uma superfície, você poderá chamar a função gluNurbsCurve( ) que possui os mesmos parâmetros, menos a direção v.