```Computação Gráfica: Aula2:
Curvas e Superfícies
http://www.fei.edu.br/~psergio
psergio@fei.edu.br
Curvas e Superfícies
As Curvas de Hermite
T2
P2
0  t 1
P1
T1
P(t )  f (t , P1, P2, T1, T 2)  ( x(t ), y( y), z (t ))
Curvas e Superfícies: Curvas de Hermite
P  ( P1, P2, T1, T 2)
x(t )  Px  a x t  bx t  cx t  d x
3
2
y (t )  Py  a y t  by t  c y t  d y
3
2
z (t )  Pz  a z t  bz t  cz t  d z
3
2
Curvas e Superfícies: Curvas de Hermite
x(t )  Px  a x t  bx t  cx t  d x
3
2
y (t )  Py  a y t  by t  c y t  d y
3
2
z (t )  Pz  a z t  bz t  cz t  d z
3
2


x(t )  [t t t 1][a x bx cx d x ]  T  x
3
2


y (t )  [t t t 1][a y by c y d y ]  T  y
3
2


z (t )  [t t t 1][az bz cz d z ]  T  z
3
2
Curvas e Superfícies: Curvas de Hermite
P1  ( P1x , P1y , P1z )  ( x(0), y(0), z(0))
x(0)  P1x  a x 0  bx 0  cx 0  d x  d x
3
2
y (0)  P1y  a y 0  by 0  c y 0  d y  d y
3
2
z (0)  P1z  a z 0  bz 0  cz 0  d z  d z
3
2
P1  ( P1x , P1y , P1z )  (d x , d y , d z )
Curvas e Superfícies: Curvas de Hermite
P2  ( P2x , P2 y , P2z )  ( x(1), y(1), z(1))
x(1)  P 2 x  a x1  bx 1  cx1  d x  d x
3
2
y (1)  P 2 y  a y 1  by 1  c y 1  d y  d y
3
2
z (1)  P 2 z  a z 1  bz 1  cz 1  d z  d z
3
2
P2  ( P2 x , P2 y , P2 z ) 
(ax  bx  cx  d x , a y  by  c y  d y , az  bz  cz  d z )
Curvas e Superfícies: Curvas de Hermite
 x(0)  [0 0 0 1][ax bx cx d x ]  d x


P1   y(0)  [0 0 0 1][a y by c y d y ]  d y


 z (0)  [0 0 0 1][az bz cz d z ]  d z
 x(1)  [1 1 1 1][ax bx cx d x ]  ax  bx  cx  d x


P2   y(1)  [1 1 1 1][a y by c y d y ]  ax  by  c y  d y


 z (1)  [1 1 1 1][az bz cz d z ]  az  bz  cz  d z
Curvas e Superfícies: Curvas de Hermite
T1  (T1x , T1y , T1z )  ( x´(0), y´(0), z´(0))
T 2  (T 2 x , T 2 y , T 2 z )  ( x´(1), y´(1), z´(1))
T2
P2
0  t 1
P1
T1
P(t )  f (t , P1, P2, T1, T 2)  ( x(t ), y( y), z (t ))
Curvas e Superfícies: Curvas de Hermite
T1  (T1x , T1y , T1z )  ( x´(0), y´(0), z´(0))
T 2  (T 2 x , T 2 y , T 2 z )  ( x´(1), y´(1), z´(1))
x´(t )  Px´  (axt 3  bxt 2  cxt  d x )´ 3a xt 2  2bxt  cx
y´(t )  Py´  (a y t 3  by t 2  c y t  d y )´ 3a y t 2  2by t  c y
z´(t )  Pz´  (a z t 3  bz t 2  cz t  d z )´ 3az t 2  2bz t  cz
x´(t )  [3t 2 2t 1 0][a x bx cx d x ]  T ´  x
y´(t )  [3t 2 2t 1 0][a y by c y d y ]  T ´  y


z´(t )  [3t 2t 1 0][a z bz cz d z ]  T ´  z
2
Curvas e Superfícies: Curvas de Hermite
T1  (T1x , T1y , T1z )  ( x´(0), y´(0), z´(0))
x´(t )  [3t 2 2t 1 0][a x bx cx d x ]  T ´  x
y´(t )  [3t 2 2t 1 0][a y by c y d y ]  T ´  y
z´(t )  [3t 2 2t 1 0][a z bz cz d z ]  T ´  z

x´(0)  [0 0 1 0][a x bx cx d x ]  cx

y´(0)  [0 0 1 0][a y by c y d y ]  c y

z´(0)  [0 0 1 0][a z bz cz d z ]  cz
T1  (cx , cy , cz )
Curvas e Superfícies: Curvas de Hermite
T 2  (T 2x , T 2 y , T 2z )  ( x´(1), y´(1), z´(1))


x´(t )  [3t 2t 1 0][a x bx cx d x ]  T ´  x
2


y´(t )  [3t 2t 1 0][a y by c y d y ]  T ´  y
2


z´(t )  [3t 2t 1 0][a z bz cz d z ]  T ´  z
2

x´(1)  [3 2 1 0][a x bx cx d x ]  3a x  2bx  cx  d x

y´(1)  [3 2 1 0][a y by c y d y ]  3a y  2by  c y  d y
z´(1)  [3 2 1 0][a z bz cz d z ]  3az  2bz  cz  d z
T 2  (3ax  2bx  cx  d x , 3ay  2by  cy  d y , 3az  2bz  cz  d z )
Curvas e Superfícies: Curvas de Hermite
Em resumo e colocando em forma matricial, temos ...
dx
 P1x  0 0 0 1  ax  

 P2  





 x   1 1 1 1  bx    ax  bx  cx  d x 
T1x  0 0 1 0  cx  

cx

 

  
3 2 1 0 d x  3ax  2bx  cx  d x 
T 2 x  


H
 P1x 
P2 
 x   H
x
T 1x 


T 2 x 
x
 P1y 


P2 y 
T 1   H y
 y
T 2 y 
 P1z 
P2 
 z   H
z
T 1z 


T 2 z 
Curvas e Superfícies: Curvas de Hermite
 P1x 
P2 
 x   H
x
T 1x 


T 2 x 
 P1x 
P2 
x
1 
x  H
T 1x 


T 2 x 
 P1y 


P2 y 
T 1   H y
 y
T 2 y 
 P1y 


P2 y 
1 
y  H 
T 1y 


T 2 y 
 P1z 
P2 
 z   H
z
T 1z 


T 2 z 
 P1z 
P2 
z
1 
z  H
T 1z 


T 2 z 
Curvas e Superfícies: Curvas de Hermite
 P1y 


P2 y 
1 
y  H 
T 1y 


T 2 y 
 P1x 
P2 
x
1 
x  H
T 1x 


T 2 x 
0
1
H 
0

3
0
1
0
2
0
1
1
1
1
1
0

0
 P1z 
P2 
 z  H 1  z 
T 1z 


T 2 z 
1
 2  2 1
  3 3  2  1

H 1  
0
0
1
0


0
0
0
1
Curvas e Superfícies: Curvas de Hermite
1   P1x 
ax   2  2 1
 b   3 3  2  1  P 2 
x
x




x 

 cx   0
0
1
0  T 1x 

  

0
0
0  T 2 x 
d x   1
 a x   2 P1x  2 P 2 x  T 1x  T 2 x 
 b   3P1  3P 2  2T 1  T 2 
x
x
x
x
x   x   
 cx  

T 1x
  

P1x
d x  

Curvas e Superfícies: Curvas de Hermite
 a x   2 P1x  2 P 2 x  T 1x  T 2 x 
 b   3P1  3P 2  2T 1  T 2 
x
x
x
x
x   x   
 cx  

T 1x
  

d
P
1
x
 x 

 a y   2 P1y  2 P 2 y  T 1y  T 2 y 
 b   3P1  3P 2  2T 1  T 2 
y
y
y
y
y
y     
cy  

T 1y
  

d
P
1
 y  

y
 a z   2 P1z  2 P 2 z  T 1z  T 2 z 
 b   3P1  3P 2  2T 1  T 2 
z
z
z
z
z   z   
 cz  

T 1z
  

P1z
d z  

Curvas e Superfícies: Curvas de Hermite
Juntando as idéias ...
x(t )  [t 3 t 2 t 1][a x bx cx d x ]  T  x


y (t )  [t t t 1][a y by c y d y ]  T  y
3
2
z (t )  [t 3 t 2 t 1][az bz cz d z ]  T  z
 P1x 
P2 
x  H x
 T 1x 


T
2
 x
x(t )  [t 3 t 2 t 1]H [ P1x
P 2 x T1x T 2 x ]
y (t )  [t 3 t 2 t 1]H [ P1y
P2 y
z (t )  [t t t 1]H [ P1z
3
2
P2 z
T 1y
T 1z
T 2 y ]

T 2z ]
Curvas e Superfícies: Curvas de Hermite
Finalmente ...
 P1
 P 2
P(t )  ((2t 3  3t 2  1), (2t 3  3t 2 ), (t 3  2t 2  t ), (t 3  t 2 )) 
 T1 
 
T 2 
x(t )  (2t 3  3t 2 1)P1x  (2t 3  3t 2 )P2x  (t 3  2t 2  t )T1x  (t 3  t 2 )T 2x
y(t )  (2t 3  3t 2 1)P1y  (2t 3  3t 2 )P2 y  (t 3  2t 2  t )T1y  (t 3  t 2 )T 2 y
z(t )  (2t 3  3t 2  1) P1z  (2t 3  3t 2 ) P2z  (t 3  2t 2  t )T1z  (t 3  t 2 )T 2z
Curvas e Superfícies: Curvas de Hermite
Finalmente ...
T2
P2
0  t 1
P1
T1
P(t )  (2t 3  3t 2  1) P1  (2t 3  3t 2 ) P2  (t 3  2t 2  t )T1  (t 3  t 2 )T 2
x(t )  (2t 3  3t 2 1)P1x  (2t 3  3t 2 )P2x  (t 3  2t 2  t )T1x  (t 3  t 2 )T 2x
y(t )  (2t 3  3t 2 1)P1y  (2t 3  3t 2 )P2 y  (t 3  2t 2  t )T1y  (t 3  t 2 )T 2 y
z(t )  (2t 3  3t 2  1) P1z  (2t 3  3t 2 ) P2z  (t 3  2t 2  t )T1z  (t 3  t 2 )T 2z
Curvas e Superfícies
As Curvas de Bézier
B0
B2
B4
B1
B3
B5
•Desenvolvida por Pierre Bézier durante seus trabalhos em projetos de
automóveis para a Renault francesa no início da década de 1960.
• A grande maioria dos Softwares de Computação Gráfica disponíveis
no mercado usam o conceito de Curvas de Bézier. Entre eles:Adobe, Corel Draw,
AutoCad, Paint Shop Pro, 3D Studio Max
Curvas e Superfícies: as curvas de Bézier
B0
B2
B4
B1
B3
B5
•Esse tipo de curva, por não usar o conceito de vetor e apenas pontos, é mais
compreensível pelos usuários.
• Para ajuste por u polinômio de grau n, a curva de Bézier pode ser gerada por
3, 4, até n+1 pontos de controle.
• Geralmente, é suficiente usar 4 pontos, gerando uma curva cúbica.
• A curva de Bézier passa pelo primeiro e último ponto, e usa os demais para
construir sua tangente.
Curvas e Superfícies: as curvas de Bézier
B0
B2
B4
B1
n
P(t )   Bi J n,i (t ),
i 0
n
J
i 0
n ,i
B3
B5
0t 0
 n i
n!
n i
n i
i
J n,i (t )   t 1  t  
t 1  t 
i!(n  i)!
i
(t )  1
Curvas e Superfícies: as curvas de Bézier
n
J
i 0
n ,i
(t )  1
0  t 1
força a curva gerada a ficar inteiramente dentro da figura convexa
(convex hull) definida pelos pontos de controle Bi
B2
B1
B1
B2
B0
B5
B5
B0
B3
B4
B3
Curvas e Superfícies: as curvas de Bézier
B2
B3
B3
B1
B2
B0  B4
B4
B0
B1
Conexão de vários segmentos de curvas de graus menores para
simplificação da expressão
Curvas e Superfícies: as curvas de Bézier
Níveis de continuidade da união entre duas curvas
Curvas e Superfícies: as curvas de Bézier
Como exemplo didático apenas, supomos n = 2. Nesse caso, temos
três pontos e controle: B0, B1 e B2
n
P(t )   Bi J n,i (t ),
i 0
0t 0
 n i
n!
n 1
n i
J n,i (t )   t 1  t  
t i 1  t 
i!(n  i)!
i
n
2
n!
2!
i
n i
P(t )   Bi
t (1  t )   Bi
t i (1  t ) n i
i!(n  i )!
i!(2  i )!
i 0
i 0
2! 0
2! 1
2! 2
2
1
P(t )  B0
t (1  t )  B1 t (1  t )  B2
t (1  t ) 0
0!2!
1!1!
2!0!
P(t )  B0 (1  t ) 2  2 B1t (1  t )  B2t 2

P(t )  (1  t ) 2
 B0 
2t (1  t ) t 2  B1   t 2
 B2 


 1  2 1  B0 
t 1  2 2 0  B1 
 1
0 0  B2 

Curvas e Superfícies: as curvas de Bézier
De uma forma mais compacta e elegante, temos a curva de Bézier
quando n=2.
 1  2 1  B0 




2
P(t )  t t 1  2 2 0  B1 


T
 1
0 0  B2 




MB
GB
• T é o vetor de potências da curva de Bézier de grau n = 2
• MB é a Matriz de coeficientes da curva de Bézier de grau n = 2
• GB é a Matriz de pontos de controle que definem a geometria
da curva de Bézier de grau n = 2
Curvas e Superfícies: as curvas de Bézier
De uma forma análoga, as matrizes da curva de Bézier quando n=3.
  1 3  3 1  B0 
 3  6 3 0  B 
1
3
2



P(t )  t t t 1


  3 3
0 0  B2 
T

 
0
0 0  B3 
1




MB
GB
Que leva à expressão:
P(t )  (1  t )3 B0  3t (1  t )2 B1  3t 2 (1  t )B2  t 3 B3
Curvas e Superfícies: as curvas de Bézier
Algoritmo de Casteljau
P1
B1
C0
P2
D0
C1
B2
B0
P0
P0
P1
P2
P3
B0
B1
B2
P3
C0
C1
D0
Curvas e Superfícies: as curvas de Bézier
Aspectos Computacionais
• As curvas de Bézier são computacionalmente baratas, mesmo com
uma discretização de t muito pequena.
• Manuseio das curvas
RESUMO
• Curva Poligonal
• Avaliação por polinômios de Bernstein
• Algoritmo de Casteljau
• Número de pontos de controle e grau são interdependentes
Curvas e Superfícies
B-Splines
B0
B2
B4
B1
B3
B5
•Desenvolvida em 1967 por Schenberg, são até hoje os tipos mais populares em
Computação Gráfica.
• Uma B-Spline é uma versão da curva de Bézier que não passa pelos pontos de
controle, o que permite ela ser gerada para qualquer número de pontos de controle
tornando o grau do polinômio independente do número de pontos bases.
Curvas e Superfícies: B-Splines
B0
B2
B4
B1
B3
B5
• A forma básica da B-Spline é bastante semelhante à curva de Bézier. Nas B-Splines
um conjunto Ni,k(t) combina o efeito dos pontos de controle Bi para gerar a curva.
n
P(t )   Bi Ni ,k (t )
i 0
Curvas e Superfícies: B-Splines
n
P(t )   Bi Ni ,k (t )
i 0
 1 para ti  t  ti 1
N i , 0 (t )  
0 nos demais intervalos
 1  ti 
 ti  k  t 
 N i ,k 1 (t )  
 N i 1,k 1 (t )
N i ,k (t )  
 ti  k  ti 
 ti  k 1  ti 1 
O parâmetro k controla a ordem de continuidade da curva, e n o número de pontos
Os parâmetros t0 , t1 ,, tm  são chamados nós e podem ser qualquer seqüência
crescente uniforme, não-uniforme, periódica ou não-periódica.
Curvas e Superfícies: B-Splines
n
P(t )   Bi Ni ,k (t )
i 0
para k = 2
 t se 0  t  1
Ni , 2 (t )  
2 - t se 1  t  2
Curvas e Superfícies: B-Splines
n
P(t )   Bi Ni ,k (t )
i 0
para k = 3
 1 2
se 0  t  1
 2t

2
3  3 
N i ,3 (t )   -  t -  se 1  t  2
4
2



1
2
se 2  t  3
 (3  t )
2
Curvas e Superfícies: B-Splines
n
P(t )   Bi Ni ,k (t )
para k = 4
i 0
1 3
t
6
2 1
3
2
 - t - 2 - t - 2
3 2
N i , 4 (t )  
2 1
 - t - 23 - t - 22
3 2
1
3
 (4  t )
6
se 0  t  1
se 1  t  2
se 2  t  3
se 3  t  4
Curvas e Superfícies: Curvas Racionais
As curvas vistas até agora possuem uma versão racional, que
Forma Inteira
Bézier
Forma Racional
n
n
B J
i 0
i
n ,i
(t )

i0
n
wiBiJ

wiJ
i0
B-Spline
n
 Bi N n,k (t )
i 0
n ,i
n ,i
(t )
(t )
n

i0
n

wiBiN
i0
wiN
i ,k
i ,k
(t )
(t )
A vantagem da representação racional é a invariância com relação à projeção
Curvas e Superfícies: Curvas Racionais
De forma geral, para cada ponto da curva temos:
n
P (t )   B J n,i (t )
w
i 0
W
i
para as curvas de Bézier
n
P w (t )   BiW N i ,k (t )
i 0
para as curvas B-Splines
Curvas e Superfícies: Curvas Racionais
Para o caso específico da B-Spline, se o conjunto de nós for não-uniforme,
e a curva tratar-se de uma superfície racional, ela é chamada de
Non Uniform Rational Base Spline, mais conhecida como NURBS
As curvas racionais, principalmente as NURBS, têm se tornado muito
populares, sobretudo em sistemas complexos como CAD.
Controlando os pesos, podemos controlar a suavidade da curva próximo
aos pontos de controle correspondentes.
B0
B2
B4
w3  0.1
B6
0 .5
4 .0
B1
B3
B5
Curvas e Superfícies: Superfícies Bézier
As superfícies de Bézier são uma extensão direta das curvas de Bézier,
uma vez que basta apenas acrescentar mais uma dimensão.
A expressão para as superfícies de Bézier é a seguinte:
n
m
P(s, t )   Bi , j J i ,n (s) J j ,m (t )
0  s, t  1
i 0 j 0
P(s, t )  SMBG BMTBTT
P(s, t )  [s
3
s
2
 1 3  3
 3 6 3
MB  
 3 3
0

0
0
1
T
B
s 1]M BGBM [t
1
0
0

0
3
 P0, 0
P
1, 0
GB  
 P2,0

 P3,0
t
2

t 1]
P0,1
P0, 2
P1,1
P2,1
P1, 2
P2, 2
P3,1
P3, 2
P0,3 
P1,3 
P2,3 

P3,3 
Curvas e Superfícies: Superfícies B-Splines
As superfícies de B-Splines, como as superfícies de Bézier, são uma extensão
direta das curvas de B-Splines, uma vez que basta apenas acrescentar mais
uma dimensão. A expressão para as superfícies de Bézier é a seguinte:
n
m
P(s, t )   Bi , j Ni ,k ( s) N j ,l (t )
i 0 j 0
P3, 0
P3,1
P3, 2
P3,3
P2,3
P1,3
P2, 0
P0,3
P1, 0
P0, 0
P0,1
P0, 2
0  s, t  1
Curvas e Superfícies: Superfícies Racionais
Assim como as curvas, as superfícies possuem a versão racional, e
da mesma forma são normalizadas por pesos wi
P ( s, t )
Bézier
Forma Inteira
n
m
 Bi , j J i ,n ( s) J j ,m (t )
Forma Racional
n
m
 
i0
i 0 j 0
j0
n
n
 
m
 B
i 0 j 0
i, j
n
N i ,k ( s ) N j ,l (t )
j ,m
(t )
m
i0
B-Spline
w i , j B i , j J i ,n ( s ) J
j0
w i, j J i,n ( s ) J
j ,m
(t )
m
 
i0
j0
n
w i, j B i, j N
(s)N
j ,l
(t )
m
 
i0
i ,k
j0
w i, j N
i ,k
(s)N
j ,l
(t )
Curvas e Superfícies: NURBS em OpenGL
Para desenhar uma curva de Bézier em OpenGL,
são necessários 2 passos básicos:
1- Definir um avaliador através da função glMap1
2 - Avaliar o polinômio criado em 1 através da função glEvalCoord1
glMap1(Glenum target, Type t0, Type t1, GLint Stride, GLint order, TYPE *points)
• target: define que tipo de ponto tem a curva, exemplo: GL_MAP1_VERTEX_3
• t0: valor mínimo da faixa a ser avaliada, exemplo, 0.0
• t1: valor máxima da faixa a ser avaliada, exemplo, 1.0
• stride: número de pontos-flutuantes entre cada par de ponto de controle sequencial
• ordem: significa que o grau do polinômio criado é n = ordem -1
• *points: ponteiro para o primeiro elemento de um vetor de pontos de controle
glEvalCoord1(Type u): esta função avalia o polinômio criado com glMap1
para a faixa de valores t0-t1.
Curvas e Superfícies: as curvas de Bézier
Funções para Usar no Lab
// variável Global para os Pontos de Controle
•GLfloat ctrlpoints[4][3] = {
{-4.0, -4.0, 0.0}, {-2.0, 4.0, 0.0},
{2.0, -4.0, 0.0}, {4.0, 4.0, 0.0}};
// Função na Main para a criação da Curva
glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);
glEnable(GL_MAP1_VERTEX_3);
Curvas e Superfícies: as curvas de Bézier
Funções para Usar no Lab
void Desenha2()
{
int i;
// avaliação da Curva
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0, 0.0, 0.0);
glBegin(GL_LINE_STRIP);
for (i=0; i <=30; i++)
glEvalCoord1f((GLfloat) i/30.0);
glEnd();
// Plotagem dos pontos de controle
glPointSize(5.0);
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_POINTS);
for (i=0; i < 4; i++)
glVertex3fv(&ctrlpoints[i][0]);
glEnd();
glFlush();
}
Curvas e Superfícies: as curvas de Bézier
```