Aprenda a Matéria

Computação Gráfica · Prova 2 · de Antialiasing a Superfícies Implícitas · leitura de ~40 minutos

Como usar esta página. Leia na ordem: cada parte usa a anterior. No fim de cada parte há um Teste-se; tente responder antes de abrir a resposta. As figuras foram calculadas a partir das próprias fórmulas, então mostram exatamente o que o texto diz.

1. O mapa da matéria 2 min

Toda a matéria responde a duas perguntas.

  1. Como mostrar uma cena 3D numa tela 2D sem parecer feia? Aqui entram a projeção, que leva o 3D para o plano, e o antialiasing, que suaviza as bordas quando a imagem vira pixels.
  2. Como guardar um objeto 3D no computador? Há quatro famílias de resposta, e cada uma troca precisão por memória e processamento de um jeito diferente:
    • Representações de sólidos: gerar o objeto juntando peças (sweep, CSG, voxels, fractal) ou organizar o espaço da cena (octree, BSP).
    • Malhas poligonais: aproximar a superfície por triângulos e quadriláteros.
    • Curvas e superfícies paramétricas: descrever a forma por equações de grau 3.
    • Superfícies implícitas: descrever a forma por uma função cujo sinal diz se o ponto está dentro ou fora.
Ideia que atravessa tudo: nenhuma técnica é "a melhor". A prova quase sempre pede vantagem, desvantagem e quando usar, e a resposta é sempre um equilíbrio entre qualidade, memória e tempo de processamento.

2. Antialiasing 5 min

O problema: o mundo é contínuo, a tela não

Uma reta de verdade pode passar por qualquer ponto. A tela só tem pixels em posições inteiras. Desenhar é decidir, pixel a pixel, se ele recebe a cor do objeto. Quando essa decisão é tudo ou nada, a reta inclinada vira uma escada. Esse defeito é o aliasing: a distorção que aparece ao converter algo contínuo em discreto com amostragem insuficiente. Ele também apaga detalhes menores que um pixel.

Reta em pixels: à esquerda em preto e branco, com degraus; à direita com tons de cinza nas bordas
À esquerda, cada pixel é aceso ou apagado e aparece o serrilhado. À direita, os pixels parcialmente cobertos recebem cinza, e a reta parece lisa.
A ideia de todo antialiasing: dar ao pixel de borda um valor intermediário entre a cor do objeto e a do fundo, proporcional a quanto ele está coberto. Meio coberto, meio-termo de cor. O olho lê essa transição gradual como uma borda suave.

Em forma de conta, todo método termina na mesma mistura:

C_final = c · C_objeto + (1 − c) · C_fundo

Os métodos só diferem no jeito de estimar c. São quatro.

1) Superamostragem: contar pontinhos

Cada pixel é dividido numa pequena grade de subpixels. A imagem é calculada nessa resolução maior e depois volta ao tamanho normal tirando a média, por isso se chama pós-filtragem. Em escala de cinza, basta contar quantos subpixels a primitiva cobre: c = subpixels cobertos ÷ total de subpixels.

Um pixel dividido em 16 subpixels, 9 cobertos pela faixa da linha
Cada subpixel é testado pelo seu centro. 9 de 16 cobertos: o pixel recebe 56% da cor da linha.
Exemplo: uma linha preta sobre fundo branco cobre 9 dos 16 subpixels. O pixel fica 56% preto e 44% branco, um cinza médio-escuro. O vizinho, com 2 de 16 cobertos, fica quase branco. Ao longo da borda surge uma escala de cinzas, e a escada some.

2) Amostragem por área: medir a área

Em vez de contar pontos, calcula-se exatamente a área do pixel que a primitiva ocupa, tratando a reta como um retângulo fino. Como o filtro é aplicado antes de definir o pixel, chama-se pré-filtragem. Aqui c = área ocupada pela primitiva ÷ área do pixel. Se a reta ocupa 35% do pixel, ele recebe 35% da cor dela.

3) Pesos ou máscaras: média com os vizinhos

O pixel vira uma média ponderada dele com os vizinhos, com pesos dados por uma máscara. Na máscara comum 3×3 (1 2 1 / 2 4 2 / 1 2 1) o centro pesa mais. A soma é dividida pelo total, 16, para não clarear nem escurecer a imagem.

Como ler a máscara: ela não é uma matriz que "multiplica" outra no sentido de álgebra linear. É uma tabela de pesos posicionada em cima do pixel: o número do meio (4) vale para o próprio pixel; os números 2, para os vizinhos de lado, de cima e de baixo; os números 1, para os vizinhos na diagonal. Cada vizinho é multiplicado pelo seu peso, tudo é somado, e a soma é dividida por 16. Os números da máscara são fixos; quem muda de pixel para pixel são as cores que eles multiplicam.

4) Pixel phasing: mover o feixe

Aqui quem trabalha é o hardware. O dispositivo de saída desloca o feixe ou acende áreas de tamanhos variados, chegando mais perto da posição contínua real. A cor não muda; muda onde o ponto é aceso.

Duas verdades que caem em prova: (1) não é possível zerar a distorção, porque o que não foi amostrado não se recupera; (2) comercialmente se usa um híbrido dos métodos. Também vale saber que antialiasing não é necessário em bordas alinhadas à grade (horizontais e verticais), onde não há degrau.

Teste-se

Qual é a diferença decisiva entre superamostragem e amostragem por área?A superamostragem estima a cobertura contando subpixels. A amostragem por área calcula a cobertura exata pela geometria. A primeira é simples e gasta memória; a segunda é precisa e cara de calcular.
Por que a máscara divide pela soma dos pesos?Para que os pesos somem 1. Sem isso, a média ponderada clarearia ou escureceria a imagem inteira.

3. Projeções 8 min

Projetar é representar algo de uma dimensão maior numa menor. Os objetos 3D, guardados com significado na estrutura de dados (forma, profundidade, faces), viram uma imagem 2D na tela. A ideia física é simples: saem raios de um centro de projeção, que é o olho ou a câmera, até a cena. Onde cada raio corta o plano de visualização (a "tela"), nasce o ponto da imagem.

O que é preciso para calcular uma projeção

  1. Posição e orientação (ângulo) do observador ou câmera.
  2. Posições dos planos frontal, posterior e de visualização. O frontal e o posterior recortam a profundidade: só o que está entre eles aparece.
  3. O tipo de projeção.
  4. A posição dos objetos na cena.

Os tipos: depende de como os raios se comportam

Raios paralelos geram projeções iguais; raios convergentes deixam o objeto distante menor
Dois objetos de mesmo tamanho, um perto e outro longe. Na paralela, as projeções ficam iguais. Na perspectiva, a do objeto distante fica menor.

Paralela. Os raios são paralelos entre si, como se o centro de projeção estivesse no infinito (pense na sombra feita pelo Sol). O volume visível é um paralelepípedo. Como a distância não muda o tamanho, ela preserva as dimensões, e por isso serve para medir e comparar. Exemplo: dimensionar uma lesão numa tomografia. Ela tem dois subtipos:

L = z / tan α xp = x + L·cos θ yp = y + L·sen θ

Em palavras: quanto mais fundo o ponto (z maior), mais ele desloca. Quanto mais inclinado o raio (α menor), mais ele desloca. Com α = 90°, tan α é infinita, L = 0, e a oblíqua vira ortogonal.

Perspectiva. Os raios convergem para o centro de projeção, como uma lanterna ou o olho humano. O volume visível é um frustum: uma pirâmide de visão sem a ponta, limitada pelos planos frontal e posterior. Objetos iguais mais distantes ficam menores. Por isso as dimensões não se preservam, mas surge a noção de profundidade. Retas paralelas da cena parecem se encontrar nos pontos de fuga (1, 2 ou 3).

A lógica do cálculo: triângulos semelhantes

Triângulo do centro ao plano e do centro ao objeto, semelhantes
O triângulo pequeno (centro → plano) e o grande (centro → objeto) têm os mesmos ângulos. Por isso os lados são proporcionais.
y / f = Y / Z ⇒ y = f · Y / Z (e x = f · X / Z)

Toda a "relação das distâncias" sai dessa única fórmula:

Como ler as matrizes de projeção

Na computação gráfica, um ponto é escrito como uma coluna de 4 números, [x, y, z, 1]. O 1 extra é a coordenada homogênea, um truque para que todas as transformações virem uma única multiplicação de matriz. A matriz 4×4 multiplica essa coluna e devolve outra coluna, o ponto transformado.

A regra de leitura é: cada linha da matriz produz uma coordenada do resultado. Os números da linha dizem quanto de x, de y, de z e de 1 entram naquela coordenada. Eles são fixos: não "recebem" valores. Quem muda é o ponto que entra.

Ortogonal: [x'] [1 0 0 0] [x] x' = 1·x + 0·y + 0·z + 0·1 = x [y'] = [0 1 0 0]·[y] ⇒ y' = y [z'] [0 0 0 0] [z] z' = 0 (a linha de zeros apaga z) [w ] [0 0 0 1] [1] w = 1
Perspectiva: [x'] [1 0 0 0] [X] x' = X, y' = Y, z' = Z [y'] = [0 1 0 0]·[Y] [z'] [0 0 1 0] [Z] [w ] [0 0 1/f 0] [1] w = Z / f (a última linha guarda a profundidade) Depois divide-se tudo por w: x = x'/w = X / (Z/f) = f·X/Z

Aqui o ponto que entra está em maiúsculas, [X, Y, Z, 1], porque é o ponto real da cena; o resultado final, depois da divisão, é o x, y minúsculo da imagem. Ou seja, a matriz copia o ponto e guarda "Z dividido por f" na quarta coordenada. O único número que depende da câmera é o 1/f da última linha. A divisão final por w é o que faz o objeto distante (Z grande) encolher. A matriz não calcula a imagem sozinha: ela prepara o ponto, e a divisão por w completa a perspectiva.

Por que uma mesma aplicação alterna projeções? Porque cada uma serve a uma tarefa. Um programa de modelagem mostra três vistas ortogonais para editar com precisão e uma em perspectiva para ver como fica. Arquitetura usa planta baixa (ortogonal) e maquete (perspectiva). Jogos usam perspectiva na cena e ortogonal no minimapa.

Teste-se

A isométrica é perspectiva?Não. É paralela ortogonal com o objeto girado. Não encolhe o que está longe; só mostra três faces.
Um objeto está a 4 m e outro idêntico a 8 m. Na perspectiva, como se comparam as imagens?O de 8 m sai com metade da altura do de 4 m, porque o tamanho é inversamente proporcional a Z.

4. Representação de sólidos 8 min

Há seis técnicas, em dois grupos. As de geração criam a forma: sweep, CSG, voxels e fractal. As de armazenamento fazem a organização e manipulação da cena: quadtree/octree e BSP. Estas não criam nada; organizam o espaço que os objetos ocupam para responder rápido "o que está visível?", "o que colide?", "o que está na frente?".

Sweep (varredura)

Pegue uma figura 2D e mova-a pelo espaço com uma transformação geométrica. O sólido é tudo por onde ela passou. Com translação, um anel arrastado vira um tubo. Com rotação, um perfil girado 360° em torno de um eixo vira um sólido de revolução, como um vaso, uma taça ou uma ampulheta (é o torno do oleiro).

Vantagem: com muito pouca informação, uma figura e um movimento, sai o sólido inteiro. Desvantagem: descobrir qual figura e qual transformação geram o objeto desejado. Para formas sem simetria, é difícil.

CSG (Constructive Solid Geometry)

É montar objetos como numa oficina: parte de sólidos básicos de equação conhecida (cubo/paralelepípedo, esfera, cilindro, cone, pirâmide, prisma) e os combina com três operações.

União, interseção e diferença de dois círculos
União junta, interseção mantém só o comum, diferença tira de A o que B ocupa.

O objeto é guardado como uma árvore: as folhas são as primitivas, os nós são as operações e a raiz é o objeto final. É preciso guardar o histórico da sequência, porque a ordem muda o resultado e porque, com a árvore, dá para calcular colisões e deformações depois. Para saber se um ponto está dentro do objeto, testa-se o ponto em cada primitiva e combinam-se as respostas pela árvore.

Sequências para treinar (como montar algo): Roteiro: ache a base; o que foi acrescentado entra com ∪; o que foi furado ou cortado entra com −; uma "sobra comum", como um canto arredondado, sai com ∩. Escreva com parênteses na ordem de execução.

Vantagem do CSG: é simples e tem baixo custo. Desvantagem: escolher as primitivas iniciais e a sequência certa.

Voxels

O voxel (volume element) é o "pixel 3D": a menor unidade de volume, indivisível, com um único atributo (cheio/vazio, densidade, cor). O espaço vira uma grade regular de cubinhos. Como o interior também está guardado, fica fácil cortar o objeto, mostrar só um intervalo (o osso e não a pele numa tomografia) ou alternar entre ver a superfície e ver por dentro, como num motor ou num órgão.

O preço é a memória, que cresce com o cubo da resolução: com n voxels por lado, são n×n×n voxels; dobrar n multiplica a memória por 8. As superfícies curvas também ficam em degraus, um aliasing que pode ser suavizado.

Fractal (modelo Mandelbrot)

Formas naturais (samambaia, montanha, litoral) não são bem descritas por equações "bem-comportadas". O fractal parte de um modelo-base e aplica repetidamente uma função geradora. Por exemplo: um triângulo como base e um segmento com um "dente" como gerador. Na 1ª iteração, cada aresta vira o desenho do gerador (cada aresta gera 3). Na 2ª, faz-se o mesmo com cada aresta nova, e assim por diante. Cada repetição é uma iteração; se cada aresta gera k novas, depois de n iterações cada aresta original virou kⁿ. O resultado é autossimilar: a parte repete o todo. Vantagem: uma regra pequena gera uma forma muito complexa. Desvantagem: o custo cresce a cada iteração.

Quadtree e octree

Imagine guardar um mapa: onde é tudo igual (oceano), basta dizer "oceano"; só a costa precisa de detalhe. A quadtree faz isso. Divide a região em 4 (quadtree, 2D) ou em 8 (octree, 3D). Cada parte que é homogênea (toda cheia ou toda vazia) vira folha. A que é heterogênea (mista) vira nó intermediário e é dividida de novo.

Quadtree de um círculo: quadrados grandes no meio e na borda externa, pequenos perto da circunferência
Só a borda do círculo precisa de quadrados pequenos. O miolo cheio e o fundo vazio viram poucos quadrados grandes.
Para decorar: nó intermediário = área heterogênea · nó folha = área homogênea. Na octree, os octantes são numerados assim: frente 4 0 / 7 3, trás 5 1 / 6 2 (em cima / embaixo). O cubo é cortado ao meio nos 3 eixos (esquerda/direita, cima/baixo, frente/trás); cada número é só o nome fixo de um octante e a ordem em que os filhos aparecem na árvore.

Os nós intermediários guardam a média das folhas abaixo deles. Isso permite uma prévia rápida ou o desenho de objetos distantes sem descer até as folhas: cada nível da árvore é uma versão do objeto em resolução diferente. O ponto fraco é que a divisão é sempre ao meio. Se a borda do objeto não se alinha a essas divisões, quase tudo fica heterogêneo, e a árvore pode gastar mais memória e tempo que os voxels puros.

BSP (Binary Space Partitioning)

A BSP divide o espaço em duas regiões de cada vez, com um plano em qualquer posição e orientação. Cada plano tem uma normal (N⃗) que diz qual lado é "depois" e qual é "antes" (O⃗, o sentido oposto). Cada região pode ser dividida de novo, até cada uma ter um objeto. O resultado é uma árvore binária: nó = plano, ramo = lado, folha = objeto.

Quadrado dividido por três planos com normais e a árvore binária correspondente
α separa ① do resto. Do lado da normal de α, β separa ②. Do lado oposto de β, γ separa ③ de ④.

Para que serve: percorrendo a árvore a partir de onde está o observador, obtém-se a ordem dos objetos de trás para frente. Isso resolve sobreposição, visibilidade, colisões e quais áreas um raio intercepta ou ilumina, usando o produto entre o raio e as normais. Os jogos de corredores dos anos 90 desenhavam os mapas assim. Ponto fraco: escolher onde pôr os planos exige analisar a cena antes.

OctreeBSP
Divide em8 partes, sempre ao meio, alinhadas aos eixos2 partes, plano em qualquer posição
Critériohomogeneidade (cheio/vazio)estrutura da cena (separar objetos)
Bom paramemória, prévia, nível de detalhevisibilidade, sobreposição, colisão
Ponto fracodivisão fixa pode não favorecerescolher os planos exige análise prévia

Teste-se

Como obter um copo com CSG?Cilindro − cilindro menor deslocado para cima. A diferença escava o interior e deixa o fundo.
Por que octree e BSP não são técnicas de geração?Porque não criam a forma: organizam e manipulam o espaço da cena para economizar memória e acelerar consultas.
Quando a octree é pior que os voxels?Quando a borda do objeto não se alinha às divisões ao meio. Quase todo nó fica heterogêneo, a árvore desce até o voxel e ainda paga os nós intermediários.

5. Malhas poligonais 3 min

A malha descreve só a superfície, como um papercraft: pontos → arestas → polígonos → objeto. Guarda-se uma lista de vértices (as coordenadas) e uma lista de faces (quais vértices formam cada polígono). Se os pontos vieram de um scanner 3D, o trabalho é decidir como agrupá-los. Ao montar a malha, é preciso responder a quatro perguntas:

  1. Quais pontos formam cada aresta, e quais arestas formam cada polígono?
  2. Vale subdividir um elemento? Por qual critério: textura, iluminação ou topologia?
  3. Até que nível subdividir sem estourar memória e desempenho?
  4. Que polígono usar: triângulo ou quadrilátero?

Triângulo × quadrilátero

O triângulo é sempre plano e se encaixa em qualquer forma, buraco ou curva: tem mais flexibilidade topológica. Por isso é o preferido em regiões com detalhe e deformações frequentes. O preço é a memória, porque é preciso mais triângulos para cobrir a mesma área. O quadrilátero forma grades regulares e econômicas, ideais em regiões retilíneas e estáveis. Na prática se usa a malha híbrida: quadriláteros onde a superfície é regular e triângulos onde ela é complexa (rosto, articulações, borda de um furo). Na fronteira, os vértices são compartilhados para não abrir fendas.

Low poly × high poly

Quanto menor o polígono, mais próximo do contínuo, e mais caro. Low poly (jogos, construção civil) tem melhor desempenho e serve para cálculos em tempo real, com qualidade inferior tolerável. High poly (filmes de animação, avatar em destaque) é processado antes e tem qualidade superior, para um público com baixa tolerância a defeitos. É comum usar os dois no mesmo objeto, conforme a distância: são os níveis de detalhe.

Subdivisão

Triângulo antes e depois da subdivisão, com vértices pares e ímpares
Os vértices antigos são pares. Os novos, nos pontos médios, são ímpares. Ligando os ímpares, cada triângulo vira 4.

Depois, as posições são suavizadas por pesos que somam 1 (subdivisão de Loop). Nova posição = soma de (posição de cada vértice envolvido × seu peso).

Repetindo o processo, cada triângulo vira 4 a cada passo (1 → 4 → 16 → 64), e a malha converge para uma superfície lisa: um icosaedro vira quase uma esfera.

Teste-se

Por que triângulos dão mais flexibilidade, mas gastam mais memória?Três pontos sempre formam um plano, então o triângulo se adapta a qualquer forma. Mas cobrir a mesma área exige mais triângulos que quadriláteros.

6. Curvas paramétricas 11 min

Para descrever uma superfície lisa, usa-se uma rede de curvas. Cada pedaço de curva é um polinômio de grau 3 num parâmetro u que vai de 0 (início) a 1 (fim), um para cada eixo:

p(u) = e + d·u + b·u² + a·u³ 0 ≤ u ≤ 1

Por que grau 3? É o menor grau que permite fixar quatro condições: a posição e a direção (tangente) nas duas pontas. Isso basta para emendar pedaços sem quina e para fazer um "S". Grau maior custa mais e oscila. É um equilíbrio de custo e benefício.

Continuidade e suavidade nas emendas

Duas curvas emendadas com bico, e duas emendadas com a mesma tangente
Continuidade é não ter buraco. Suavidade é, além disso, ter a mesma tangente na emenda.

Sem as duas, a soma dos pedaços não parece um objeto único.

Antes de tudo: como ler uma conta com matriz

Uma matriz vezes uma coluna é só um jeito compacto de escrever várias equações de uma vez. Cada linha da matriz gera uma equação: multiplica-se o 1º número da linha pelo 1º item da coluna, o 2º pelo 2º, e assim por diante, e soma-se tudo.

[p(0) ] [1 0 0 0 ] [e] [p(1/3)] = [1 1/3 1/9 1/27 ]·[d] [p(2/3)] [1 2/3 4/9 8/27 ] [b] [p(1) ] [1 1 1 1 ] [a] 2ª linha, por extenso: p(1/3) = 1·e + (1/3)·d + (1/9)·b + (1/27)·a

A receita que vale para todas as curvas

Cada modelo é só uma regra diferente para descobrir os 4 coeficientes (e, d, b, a). A lógica é sempre a mesma:

[condições] = [A] · [coef] [A⁻¹]·[condições] = [A⁻¹]·[A]·[coef] = [I]·[coef] ⇒ [coef] = [A⁻¹] · [condições] e [M] = [A⁻¹]

O que a matriz característica calcula. Ela multiplica a coluna das condições (os pontos que você deu) e devolve a coluna dos coeficientes. Cada linha diz como montar um coeficiente, e cada número é o peso de um ponto nesse coeficiente. Os pontos entram separadamente para cada eixo: primeiro todos os x, depois todos os y.

Depois que os coeficientes saem, desenhar é multiplicar uma linha por eles: p(u) = [1 u u² u³] · [coef]. Juntando tudo: p(u) = [1 u u² u³] · [M] · [pontos]. O produto [1 u u² u³]·[M] dá, para cada u, quatro pesos que dizem quanto cada ponto "puxa" a curva naquele instante. São as funções de mistura.

Curva interpolada: passar por todos os pontos

As condições são passar pelos 4 pontos informados, nos parâmetros u = 0, 1/3, 2/3 e 1. A matriz [A] é exatamente a do exemplo acima. Invertendo-a, sai a MI:

[ 1 0 0 0 ] e = 1·P0 M_I = [ −5,5 9 −4,5 1 ] d = −5,5·P0 + 9·P1 − 4,5·P2 + 1·P3 [ 9 −22,5 18 −4,5 ] b = 9·P0 − 22,5·P1 + 18·P2 − 4,5·P3 [ −4,5 13,5 −13,5 4,5 ] a = −4,5·P0 + 13,5·P1 − 13,5·P2 + 4,5·P3

Leitura: cada linha monta um coeficiente como mistura dos 4 pontos. A 1ª linha (1 0 0 0) diz "e é o próprio P0": a curva começa em P0. Os números grandes e de sinais alternados nas outras linhas são o que faz a interpolada "se esforçar" para passar por todos os pontos, e o que a faz oscilar.

Curvas aproximadas: os pontos só "puxam"

Hermite. Em vez de 4 pontos, informam-se as 2 pontas e as 2 tangentes: p(0), p(1), p'(0) e p'(1). Derivando a curva, p'(u) = d + 2b·u + 3a·u², em que e some porque é constante. Então as linhas das tangentes em [A] são os números que multiplicam e, d, b e a nessa derivada:

e d b a p(0) = [1 0 0 0] → p(0) = e p(1) = [1 1 1 1] → p(1) = e + d + b + a p'(0) = [0 1 0 0] → p'(0) = d (u = 0: 2b·0 e 3a·0 somem) p'(1) = [0 1 2 3] → p'(1) = d + 2b + 3a (u = 1) [ 1 0 0 0 ] e = p(0) M_H = [ 0 0 1 0 ] d = p'(0) [−3 3 −2 −1 ] b = −3·p(0) + 3·p(1) − 2·p'(0) − p'(1) [ 2 −2 1 1 ] a = 2·p(0) − 2·p(1) + p'(0) + p'(1)

Repare na ordem das colunas de MH: elas correspondem a p(0), p(1), p'(0) e p'(1), nessa ordem. Por isso a 2ª linha (0 0 1 0) pega só a 3ª condição: d = p'(0).

Duas curvas de Hermite com as mesmas pontas e tangentes de tamanhos diferentes
Mesmas pontas e mesma direção de tangente. Tangentes maiores esticam a curva naquela direção.

Vantagem: garante continuidade e suavidade nas emendas (é só repetir o ponto e a tangente). Desvantagem: o usuário raramente sabe as tangentes, o que não favorece o uso comercial.

Bézier. É a Hermite com uma troca esperta: as tangentes são estimadas por dois pontos intermediários, P1 e P2. Considerando P1 em u = 1/3, a inclinação de P0 até P1 é a variação de posição sobre a variação de u:

p'(0) = (P1 − P0) / (1/3) = 3(P1 − P0) p'(1) = 3(P3 − P2)

Substituindo isso na Hermite, sai a matriz da Bézier, que já recebe os 4 pontos de controle direto:

[ 1 0 0 0 ] e = P0 (começa em P0) M_Bz = [−3 3 0 0 ] d = −3·P0 + 3·P1 = 3(P1 − P0) (tangente inicial aponta para P1) [ 3 −6 3 0 ] b = 3·P0 − 6·P1 + 3·P2 [−1 3 −3 1 ] a = −P0 + 3·P1 − 3·P2 + P3

Os zeros têm significado: na 2ª linha, P2 e P3 não entram, porque a tangente do começo depende só de P0 e P1.

Funções de mistura da Bézier (Bernstein). Fazendo [1 u u² u³]·MBz, saem os pesos de cada ponto no instante u:

Mesmos 4 pontos: curva interpolada passando por todos e curva de Bézier dentro da envoltória convexa
Os mesmos 4 pontos. A interpolada passa por todos e oscila. A Bézier sai de P0 rumo a P1, chega a P3 vindo de P2 e fica dentro da área laranja.

A curva fica sempre dentro da envoltória convexa, o polígono formado pelos pontos de controle. O motivo: cada ponto da curva é uma média ponderada dos 4 pontos, com pesos positivos que somam 1, e uma média nunca sai do "envelope" dos pontos. É o modelo mais usado comercialmente: a ferramenta "caneta" dos editores, as trajetórias de câmera em jogos e as fontes. Nas emendas, garante continuidade; a suavidade exige alinhar P2, P3 e o próximo P1.

B-Spline. Usa as mesmas condições da Bézier e acrescenta duas coisas: duplicar pontos, o que funciona como um peso que puxa a curva para o ponto repetido, e a derivada de 2ª ordem, que deixa a curvatura também contínua nas emendas. Fica mais suave e mais flexível, mas custa mais (cerca de 3× em curvas e 9× em superfícies). Com os mesmos pontos, gera curvas diferentes. Cada segmento usa 4 pontos seguidos, mas só é desenhado entre os 2 do meio; o próximo segmento desliza um ponto.

A matriz da B-Spline, MS, tem todos os números multiplicados por 1/6. Ela multiplica a coluna [P0, P1, P2, P3] e devolve [e, d, b, a]:

NURBS (Non-Uniform Rational B-Spline). É uma B-Spline racional: um polinômio dividido por outro, p(u)/q(u), com um peso w em cada ponto. Em p(u)/q(u), o numerador p(u) soma cada ponto multiplicado pelo seu peso w e pela sua função de mistura, e o denominador q(u) soma só os pesos multiplicados pelas funções de mistura. Com todos os w = 1, q(u) = 1 e volta a ser uma B-Spline comum. A divisão funciona como uma média ponderada. Aumentar o peso puxa a curva para o ponto. Por ser uma fração, representa cônicas exatas, inclusive o círculo: com 3 pontos, o peso do meio decide se a curva é hipérbole (w > 1), parábola (w = 1) ou elipse (w < 1). É o padrão em modelagem e CAD, pela manipulação na tela. O ponto fraco: cálculos de colisão ficam caros a ponto de serem inviáveis.

Converter uma curva em outra

Duas descrições representam a mesma curva se dão os mesmos coeficientes. É só igualar e isolar:

[M₁]·[cond₁] = [M₂]·[cond₂] ⇒ [cond₂] = [M₂⁻¹]·[M₁] · [cond₁] matriz de conversão = inversa do DESTINO × matriz da ORIGEM

O que a matriz de conversão faz: ela multiplica a coluna de condições da origem e devolve a coluna de condições do destino. Cada linha monta um ponto novo como mistura dos pontos antigos. Na conversão interpolada → Bézier, a 1ª linha é 1 0 0 0 (o novo P0 é o antigo P0) e a 4ª é 0 0 0 1 (o novo P3 é o antigo P3). As linhas do meio, −5/6 3 −3/2 1/3 e 1/3 −3/2 3 −5/6, misturam os quatro pontos para achar o P1 e o P2 da Bézier.

Exemplos em palavras: Para que serve: converter tudo para Bézier e desenhar qualquer curva com o mesmo algoritmo.
CurvaVocê informaPassa pelos pontos?Nas emendasResumo
Interpolada4 pontos (u = 0, 1/3, 2/3, 1)todossó continuidadefácil; pode oscilar
Hermite2 pontas + 2 tangentessó as pontascontinuidade + suavidadeexige tangentes
Bézier2 pontas + 2 pontos de controlesó as pontascontinuidade (suavidade se alinhar)intuitiva, envoltória, a mais usada
B-Spline+ duplicação + 2ª derivadanenhumaté a curvaturamais suave, mais cara
NURBS+ pesos wdepende dos pesoscomo a B-Splinecônicas exatas; colisão cara

Teste-se

Por que a matriz característica não depende dos pontos?Porque [A] só depende do tipo de condição (quais u, se é ponto ou tangente), não dos valores. Os pontos entram depois, multiplicados por M.
Por que o "3" em p'(0) = 3(P1 − P0)?Porque P1 é tratado como estando em u = 1/3. A inclinação é a variação de posição dividida pela variação de u, e dividir por 1/3 é multiplicar por 3.
Qual matriz fica à esquerda na conversão?A inversa do modelo de destino. A conversão é inversa do destino × matriz da origem.

7. Superfícies implícitas 3 min

Aqui o objeto não é desenhado ponto a ponto: ele é uma função f(x, y, z), normalmente um polinômio, e a superfície é onde ela vale zero. O sinal diz onde está qualquer ponto:

Círculo: f negativo dentro, positivo fora, zero na borda
f = 0 na superfície, f < 0 dentro e f > 0 fora.

Objetos complexos saem combinando funções simples: f_R = f₁ op f₂ op … f_N. Aqui f₁ … f_N são as funções simples (cada esfera, por exemplo), op é uma operação entre elas (união, interseção, diferença, soma) e f_R é a função Resultante, que representa o objeto inteiro. A grande vantagem é que testar colisão ou interseção vira só "calcular o sinal". A desvantagem é desenhar, porque é preciso procurar onde f = 0.

Há cinco formas de obter fR:

Dois blobs separados, depois unidos por um pescoço, depois fundidos
Os mesmos dois blobs, cada vez mais próximos: separados, ligados por um "pescoço" e fundidos.
BlobbyVoxels
tamanho variadotamanho fixo
único atributoúnico atributo
operações ∩, ∪, −só ∪
modela melhor curvasmodela melhor características lineares
menos memória (só o externo)alterna externo e interno (mais memória)
maior custo computacionalmanipulação de baixo custo

Por que é assim? O Blobby guarda poucos centros e raios, em vez de milhões de cubos, e por isso usa pouca memória. Em compensação, cada ponto exige somar todas as esferas, o que custa processamento. O voxel é só ler e escrever numa matriz: barato, mas faz degraus em curvas.

Teste-se

Para a esfera f = x² + y² + z² − r², o centro está dentro ou fora?Dentro: no centro, f = −r², que é negativo.
Por que o Blobby facilita modelar formas orgânicas?Porque poucas esferas somadas se fundem suavemente e formam superfícies arredondadas, com pouca memória.

8. As 15 frases para lembrar 1 min

  1. Antialiasing dá à borda um valor intermediário; reduz, mas não zera, o aliasing.
  2. Superamostragem estima contando subpixels; amostragem por área calcula a área exata.
  3. Paralela preserva dimensões; perspectiva dá profundidade e encolhe o que está longe.
  4. Perspectiva: y = f·Y/Z, por triângulos semelhantes; Z dobra, a imagem cai pela metade.
  5. Ortogonal descarta z; oblíqua desloca o ponto em L = z/tan α.
  6. Sweep = figura 2D + translação ou rotação.
  7. CSG = primitivas + ∪, ∩, −, numa árvore; a ordem importa.
  8. Voxels guardam o interior, mas custam memória.
  9. Octree e BSP organizam e manipulam a cena; não geram forma.
  10. Octree: folha = área homogênea; nó intermediário = área heterogênea.
  11. Malha triangular é flexível; quadrangular é econômica; na prática, híbrida.
  12. Toda curva: [coef] = [A⁻¹]·[condições]; A⁻¹ é a matriz característica, constante.
  13. Interpolada passa por tudo; Hermite exige tangentes; Bézier fica na envoltória convexa.
  14. Conversão entre curvas = inversa do destino × matriz da origem.
  15. Implícita: f = 0 na superfície, < 0 dentro, > 0 fora; Blobby arredonda com pouca memória.