Curvas Interativas
Computação Gráfica – DCC065Sumário
●
Nesta aula estudaremos as curvas interativas
seguindo os seguintes tópicos
● Introdução ● Curvas Interativas ● Curvas Cúbicas ● Curvas de Bézier ● B-Splines ● B-Spline Cúbica
● B-Spline Cúbica Uniforme e Não-uniformes ● Curvas e OpenGL
Introdução
●
Curvas e superfícies são objetos
matemáticos fundamentais na modelagem de
objetos gráficos.
●
Uma das representações mais utilizadas
para curvas e superfícies é a baseada em
funções paramétricas.
Introdução
●
Considere, por exemplo, um projetista que
precisa editar uma forma muito complexa,
alterando a posição de cada um dos pontos
de uma malha densa.
●
Esta forma de interação é muito pouco
prática e ineficiente.
●
Para contornar este problema é necessário
formas de representação mais compactas e
que facilitem o processo de criação e
Construção Interativa de Curvas
● Um esquema de representação apropriado para
interação é o baseado em um tipo especial de representação paramétrica.
● Tal representação é caracterizada por dois
conjuntos:
● Um conjunto de pontos discretos denominados
pontos de controle.
● Um conjunto de funções de base ou funções
Definição de Curvas Interativas
●
Considere um conjunto de pontos de
controle P
0, P
1, P
2, P
3onde P
i, i=0,..,3 e Px
i,
Py
i, Pz
iindicam as coordenadas de cada
ponto P
i.
P0
P1 P2
Definição de Curvas Interativas
● Pode-se determinar uma curva paramétrica Q(u) através
de uma expressão que pondere a contribuição das coordenadas de cada ponto de controle, para cada ponto associado a um valor de u no espaço de
parâmetros.
● A ponderação é feita através da definição de uma
função de base para cada ponto de controle.
P1 P2
Curvas Interativas - Propriedades
● Diferentes funções de base possuem diferentes
propriedades.
● Uma das propriedades diz respeito ao fato delas
gerarem curvas que interpolam ou aproximam os pontos de controle.
● Outras propriedades estão relacionadas a continuidade
e localidade da curva. P1 P2 P P1 P2 P3
Curvas Interativas - Propriedades
● Quando dois segmentos de curvas são
conectados, a continuidade da curva é alterada dependendo da forma de junção:
● Continuidade C0 → funções
paramétricas são contínuas, isto é, sem “pulos”
● Continuidade C1 → funções
paramétricas têm primeiras derivadas contínuas, isto é, tangentes variam suavemente
● Continuidade Ck → funções
paramétricas têm k’ésimas derivadas contínuas
C0
Algoritmo de De Casteljau
● Suponha que queiramos aproximar uma
curva polinomial entre dois pontos p0 e p1 dados
● A solução natural é um segmento de reta
que passa por p0 e p1 cuja parametrização mais comum é
p (u) = (1 – u) p0 + u p1
● Podemos pensar em p (u) como uma
média ponderada entre p0 e p1
● Observe que os polinômios (1 – u)
e u
somam 1 para qualquer valor de u
● São chamadas de funções de mistura (blending functions)
p0
p1
Algoritmo de De Casteljau
●
Para generalizar a ideia para três pontos p
0
,
p
1e p
2consideramos primeiramente
os segmentos de reta p
0p
1e p
1p
2p01(u) = (1 – u) p0 + u p1
p11(u) = (1 – u) p1 + u p2
●
Podemos agora realizar uma
interpolação entre p
01(u) e p
11(u)
p02(u) = (1 – u) p01 (u) + u p11 (u)
= (1 – u) 2 p0 + 2 u (1 – u) p1 + u2 p2 p0 p1 p2 p11 p01 p02
Algoritmo de De Casteljau
p0 p1 p2 p11 p01 u = 0.25 p02Algoritmo de De Casteljau
p0 p1 p2 p11 p01 u = 0.5 p02Algoritmo de De Casteljau
p0 p1 p2 p11 p01 u = 0.75 p02Algoritmo de De Casteljau
p0
p1
p2 p02(u)
Algoritmo de De Casteljau
● A curva obtida pode ser entendida como a “mistura”
dos pontos p0, p1 e p2 por intermédio de três funções quadráticas: ● b 02(u) = (1 – u) 2 ● b 12(u) = 2 u (1 – u) ● b 22(u) = u 2
● Aplicando mais uma vez a ideia podemos definir uma
função cúbica gerada por 4 pontos
p02(u) = (1 – u) 2 p0 + 2 u (1 – u) p1 + u2 p2
p12(u) = (1 – u) 2 p1 + 2 u (1 – u) p2 + u2 p3
p03(u) = (1 – u) p02 (u) + u p12 (u)
Algoritmo de De Casteljau
p0 p1 p2 p02(u) p12(u) p3 u = 0.25 p03Algoritmo de De Casteljau
p0 p1 p2 p02(u) p12(u) p3 u = 0.5 p03Algoritmo de De Casteljau
p0 p1 p2 p02(u) p12(u) p3 u = 0.75 p03Algoritmo de De Casteljau
p0 p1 p2 p02(u) p12(u) p3 p03(u)Algoritmo de De Casteljau
● Novamente temos uma curva dada pela soma de
4 funções de mistura (agora cúbicas), cada uma multiplicada por um dos 4 pontos
● b 03(u) = (1 – u) 3 ● b 13(u) = 3 u (1 – u) 2 ● b 23(u) = 3 u 2 (1 – u) ● b 33(u) = u 3
● Em geral, uma curva de grau n pode ser
Curvas de Bézier
● Uma curva de Bézier é uma parametrização que
utiliza a base de Bézier, também denominadas funções de mistura de Bernstein.
● São curvas construídas pelo algoritmo de
De Castejau
● A base de Bézier de grau 3 é dada pelos
seguintes termos: 0.2 0.4 0.6 0.8 0.2 0.4 0.6 0.8 B0,3 B1,3 B2,3 B3,3 u
Forma Matricial da Base Bézier
● Podemos escrever a equação para uma curva
de Bézier cúbica na forma
Propriedades de Curva de Bézier
● O grau da curva (do polinômio) é dado pelo número de
pontos do polígono de controle menos 1
● A curva de Bézier está contida no fecho convexo do
polígono de controle
● Os polinômios de Bernstein somam 1 para qualquer u
● A curva interpola o primeiro e último ponto do polígono
Propriedades de Curva de Bézier
● As tangentes à curva em p
0 e pn têm a direção dos
segmentos de reta p0p1 e pn-1pn , respectivamente
● Qualquer linha reta intercepta a curva tantas ou menos
vezes quanto intercepta o polígono de controle ● Não pode oscilar demasiadamente
● Transformar os pontos de controle (transformações afim)
e desenhar a curva é equivalente a desenhar a curva transformada
Desenhando Curvas Bézier
● Curva normalmente é aproximada por uma linha
poligonal
● Pontos podem ser obtidos avaliando a curva em
u = u1, u2 ... uk
● Avaliar os polinômios de Bernstein
● Usar o algoritmo recursivo de De Casteljau
● Devemos utilizar uma quantidade de pontos
compatível com o grau de suavidade que desejamos para o curva
● Clique neste link para ver uma demonstração da
Curvas Longas
● Curvas Bézier com k pontos de controle são de grau
k – 1
● Curvas de grau alto são difíceis de desenhar
● Complexas
● Sujeitas a erros de precisão
● Normalmente, queremos que pontos de controle
tenham efeito local
● Em curvas Bézier, todos os pontos de controle têm efeito global
● Solução:
● Emendar curvas polinomiais de grau baixo ● Relaxar condições de continuidade
Emendando Curvas Bézier
Condições para construção das "emendas":
● Continuidade C0 é obtida se o último ponto da primeira curva for
igual ao primeiro ponto da segunda
● Continuidade C1: deve-se obter se C0 e garantir que o segmento
p2p3 da primeira curva tenha a mesma direção e comprimento que o segmento p’0p’1 da segunda curva
● Continuidade C2: deve-se obter C1 e adicionar mais restrições
sobre pontos p’1 da primeira e p’2 da segunda
p0
p1 p2 p'3
p3 p'0
B-Splines - Motivação
● Curvas de Bézier possuem duas grandes
desvantagens:
● O controle exercido pelos pontos de controle
não é local. A movimentação de um ponto
altera toda curva, apesar de sua influência ser maior na vizinhança de tal ponto.
● Não é possível definir uma curva de Bézier
cúbica para aproximar ou representar um conjunto de n pontos sem utilizar múltiplos segmentos de curva.
● Uma representação que não possui tais
B-Splines
●
Originalmente, uma
spline
é uma ferramenta
de desenho.
●
Consiste em uma tira de metal flexível usada
para desenhar curvas fixando-se
pesos
a
B-Splines
●
B-Splines não passam pelos pontos de
controle, nem em suas extremidades.
●
Uma B-Spline é uma curva completa
polinomial por partes consistindo de um
conjunto de segmentos.
P0
P3
B-Splines
● Uma B-spline é composta por uma série de m-2
segmentos de curva Q3,Q4,…,Qm definidos por m+1 pontos de controle P0,P1,…,Pm, m≥3.
● Cada segmento de curva é definido por quatro pontos de
controle e 4 funções de mistura. Cada ponto de controle influencia no máximo 4 segmentos de curva.
● Para facilitar a notação serão abordadas apenas
P0 P1 P 2 P3 P4 P5 Q3 Q4 Q5
Q3 é definido por P0P1P2P3 e ponderado por B0B1B2B3 Q4 é definido por P1P2P3P4 e ponderado por B0B1B2B3 Q5 é definido por P2P3P4P5 e ponderado por B0B1B2B3
B-Spline Cúbica
●
A movimentação de um ponto de controle
de uma B-spline afeta, no pior caso,
somente um conjunto de 4 segmentos.
●
Na figura abaixo a movimentação de P
4
afeta somente Q
4e Q
5mantendo Q
3intacto.
P0 P1 Q3 Q4 P4 P3 Q5 P2 P4 P4B-Spline Cúbica
●
Um B-Spline exibe continuidade
C
0(posicional), C
1(da primeira derivada) e
C
2(da segunda derivada).
●
O mecanismo que garante a continuidade
C
2está no compartilhamento dos pontos
de controle por segmentos de curva
B-Spline Cúbica Uniforme
●
Cada função da base de funções de uma
B-spline é por si própria uma função
cúbica composta de 4 segmentos.
●
Uma função da base é diferente de zero
em 4 intervalos consecutivos no espaço
de parâmetros.
u u u u u
B-Spline Cúbica Uniforme
●
Os pontos associados a junções de dois
segmentos adjacentes de uma determinada
função base são denominados
nós
(em
vermelho na imagem abaixo).
●
O valor de u correspondente a um nó é
denominado
valor do nó
.
●
Uma B-spline é dita uniforme se valores dos
nós são igualmente espaçados no espaço do
parâmetro u.
B-Spline Cúbica Uniforme
● No caso de B-splines uniformes os intervalos
são de mesmo comprimento.
● Isto significa que os valores dos nós são
igualmente espaçados e as funções da base são
cópias transladadas.
● Uma B-spline com n pontos de controle possui
n+4 nós
0 1 2 3 4
B0(u)
5 6 7 8 9
B1(u) B2(u) B3(u) B4(u) B5(u)
B-Spline Cúbica Uniforme
● Um segmento de curva está definido em um
intervalo de ui a u
i+1.
● De fato, avaliamos 4 bases
no intervalo ui≤u≤u
i+1
0 1 2 3 4
B0(u)
5 6 7 8 9
B1(u) B2(u) B3(u) B4(u) B5(u)
P0 P1 P2 P3 P4 P5 Q3 Q4 Q5
B-Spline Cúbica Uniforme
● No exemplo abaixo, a curva soma a unidade no
intervalo 3≤u≤6
0 1 2 3 4
B0(u)
5 6 7 8 9
B1(u) B2(u) B3(u) B4(u) B5(u)
P0 P1 P2 P3 P4 Q3 Q4 Q5
B-Spline Cúbica Uniforme
● No caso geral, uma B-spline não interpola pontos de
controle.
● É possível fazer com que uma B-spline interpole um
ponto de controle através da replicação de vértices.
● Intuitivamente, replicar um vértice faz com que a
curva seja atraída para tal ponto de controle, já que seu peso na ponderação é maior.
P0 P Q3 Q4 P4 P3 Q5 P Q6
B-Spline Cúbica Uniforme
●
O preço pago pelo uso da replicação de
pontos é a perda da continuidade C
2da
curva.
●
Exemplo da replicação em pontos de
controle interiores:
P0 P 4 P3, P3 P P0 P 4 P3, P3 , P3 PB-Splines Cúbicas Não-uniformes
● Uma B-Spline é não-uniforme (também
chamada de NURBS) quando os intervalos paramétricos entre valores de nós sucessivos não são necessariamente iguais.
● Isto significa que as função da base não são
translações umas das outras. São completamente distintas.
● O caso mais comum é aquele em que alguns
B-Splines Cúbicas Não-uniformes
● Comparação de uma B-spline uniforme e uma
não uniforme: P0 P1 P 5 P3 P2 0 u 3 P0 P1 P2 P3 P4 P5 Q3 Q4 Q5 0 1 2 3 4 B1(u) 5 6 7 8 9
B2(u) B3(u) B4(u) B5(u) B6(u) B1(u) B2(u) B3(u) B4(u) B5(u) B6(u)
B-Splines - Sumário
● Sumário das propriedades de uma curva B-spline:
● Segue a forma do polígono de controle e é restrita
a permanecer no fecho convexo dos pontos de controle.
● Pode ser transformada através de uma
transformação afim (translação + rotação)
aplicando-se a transformação sobre os pontos de controle.
Demonstração
●
Link 1
- Demonstração das curvas de Bézier
●
Link 2
- Demonstração de todas as curvas
Curvas e OpenGL
● OpenGL suporta curvas e superfícies através de
mecanismos denominados evaluators
(avaliadores).
● Os evaluators calculam valores intermediários
para os polinômios que descrevem curvas e superfícies, dada uma sequência de pontos de controle.
● Os evaluators da OpenGL são avaliadores de
Bézier.
Curvas e OpenGL
● Para utilizar um avaliador Bézier emprega-se a seguinte
função:
void glMap1f(GLenum target, GLfloat u1, GLfloat u2, Glint stride, Glint order,
const GLfloat * points);
Parâmetro Significado
Target Significado dos pontos de controle
u1 e u2 Intervalo para a variável de controle u
Stride Quantos valores float existem entre cada elemento do vetor Order Quantidade de elementos no vetor de pontos de controle Points Apontador para primeira coordenada do primeiro ponto de
Curvas e OpenGL
● Os avaliadores servem não somente para gerar curvas
de coordenadas, mas também de cores, vetores
normais, coordenadas de textura (assunto a ser visto futuramente), etc.
● Uma vez definido um avaliador, deve-se habilitá-lo
através da função glEnable sobre alguma das
Constante Significado
GL_MAP1_VERTEX_3 Coordenadas x, y e z
GL_MAP1_VERTEX_4 Coordenadas x, y, z e w (homogêneas) GL_MAP1_INDEX Índice de cor
GL_MAP1_COLOR_4 Cor com RGBA GL_MAP1_NORMAL Vetor normal
GL_MAP1_TEXTURE_COORD_1 Coordenadas de textura s. GL_MAP1_TEXTURE_COORD_2 Coordenadas de textura s e t. GL_MAP1_TEXTURE_COORD_3 Coordenadas de textura s,t e r. GL_MAP1_TEXTURE_COORD_4 Coordenadas de textura s,t,r e q.
Curvas e OpenGL
● A utilização da constante GL_MAP1_VERTEX
indica que queremos apenas a posição de cada ponto intermediário.
● O procedimento de desenho é simples: basta
percorrer os pontos intermediários desejados e
solicitar a avaliação da curva Bézier por meio da seguinte função:
glEvalCoord1f(GLfloat u)
● O valor u indica o valor a ser passado para a
OpenGL – Exemplo de Curva de Bézier
#ifdef WIN32 #include <windows.h> #endif #include <GL/glui.h> #include <GL/glut.h> #define TOTAL 5int prec = 10; // Total de pontos intermediários
float pontos[TOTAL][3] = {0.0,0.0,0.0},{0.3,1.0,0.0},{0.7,1.0,0.0},
{1.0,0.0,0.0},{0.5,0.4,0.0}}; // Pontos de controle
void init(void) {
glClearColor (0.8, 0.8, 0.8, 0.0);
// Define significado dos pontos de controle
glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, TOTAL, &pontos[0][0]); glEnable(GL_MAP1_VERTEX_3); // Ativa geração de coordenadas
glMatrixMode(GL_PROJECTION); glLoadIdentity();
glOrtho(-0.2, 1.2, -0.2, 1.2, -1.0, 1.0); glMatrixMode(GL_MODELVIEW);
OpenGL – Exemplo de Curva de Bézier
void display (void) {
float delta =1.0/(float)prec;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0); glPointSize(5);
// Desenha os pontos de controle glBegin(GL_POINTS);
for (int i=0; i<TOTAL; i++) glVertex3fv(pontos[i]); glEnd();
glColor3f(0,0,1); glLineWidth(2.0);
glBegin(GL_LINE_STRIP); // Desenha a curva
for (float u=0; u<=1.01; u+=delta)
glEvalCoord1f(u); // chama o avaliador para o parâmetro f
glEnd();
glutSwapBuffers ( ); }
OpenGL – Exemplo de Curva de Bézier
OpenGL – Exemplo de Curva de Bézier
Saiba mais!
● Computer Graphics, C Version
● Capítulo 10 – Seção 10-8
Nesta seção são tratadas as
curvas e superfícies de Bézier e nas demais seções deste capítulo há uma abordagem mais geral
Saiba mais!
● Computação Gráfica - Teoria e
Prática.
● Capítulo 3
Neste capítulo são tratadas não só curvas como também superfícies. Para aqueles que querem se
aprofundar no assunto é uma leitura interessante.
Saiba mais!
● OpenGL Programming Guide
Seventh Edition
● Capítulo 12
Neste capítulo você encontrará informações detalhadas para utilizar os evaluators vistos até aqui na criação de curvas de Bézier e NURBS.
Resumo
●
Vimos hoje as curvas Interativas, em
especial as curvas de Bézier e algumas
variações de curvas Splines
●
A principal função dessas curvas é fornecer
uma representação suave através de um
conjunto de pontos de controle
Prática
1. Baixe o código fonte “curvasInterativas.cpp” e altere-o para que o número de pontos
intermediários seja informado pelo usuário durante a execução do programa.
2. Modifique o código do exemplo anterior adicionando 3 novos pontos de controle.
3. Crie uma interface na qual pontos de controle possam ser criados e removidos. Ao final,
Exercício
1. Utilizando a interface disponível na prática
anterior, implemente o algoritmo de De Casteljau para a criação de uma curva de Bézier cúbica.
Basicamente o algoritmo deverá gerar uma lista de pontos a ser desenhado pelo OpenGL com código apropriado.
Você poderá pesquisar códigos na internet para inspirar sua implementação (veja este link por exemplo).