6.3 Espaço euclidiano
O espaço euclidiano é um espaço afim que inclui a operação de produto escalar, também chamada de produto interno.
O produto escalar produz um escalar a partir de dois vetores. Com isso é possível definir conceitos como distância e ângulo.
O espaço euclidiano inclui o espaço vetorial de números reais Rn. Seus elementos são n-tuplas de números reais (a1,a2,…,an) que denotam coordenadas do sistema de coordenadas cartesiano. A figura 6.9 ilustra a representação de um ponto em coordenadas cartesianas no espaço euclidiano de três dimensões (espaço 3D).
Figura 6.9: Representação de um ponto no espaço 3D.
As operações do espaço vetorial são definidas como:
u+v=(u1+v1,u2+v2,…,un+vn),av=(av1,av2,…,avn).
As operações afins são definidas como:
P−Q=(p1−q1,p2−q2,…,pn−qn),P+u=(p1+u1,p2+u2,…,pn+un).
Frames
Assim como no mundo físico não existe um ponto de referência absoluto (uma “origem” no universo), no espaço euclidiano qualquer ponto pode ser considerado como a origem. Desse modo, para definir unicamente vetores e pontos, precisamos de uma base e um ponto de referência. Um frame cumpre esse papel27.
Um frame de um espaço euclidiano de n dimensões é composto por:
- Um ponto de referência P0;
- Uma base composta por n vetores linearmente independentes v1,…,vn.
Dado um frame {P0,v1,…,vn}, um vetor
u=(u1,…,un)
pode ser escrito unicamente como
u=u1v1+u2v2+⋯+unvn.
Um ponto
P=(p1,…,pn)
pode ser escrito unicamente como
P=P0+p1v1+p2v2+⋯+pnvn.
O ponto de referência P0 representa a origem do frame. No frame cartesiano padrão,
P0=(0,…,0),
e a base é formada pelo conjunto de tuplas
e1=(1,0,0,…,0),e2=(0,1,0,…,0),⋮en=(0,0,0,…,1), No R3, a base é frequentemente denotada por vetores ^i, ^j, ^k:
^i=(1,0,0),^j=(0,1,0),^k=(0,0,1).
O conceito de frame é importante em computação gráfica pois é comum que os modelos geométricos 3D sejam representados originalmente em um frame local no qual a origem é o centro ou a base do objeto. Esses modelos podem ser dispostos em uma cena virtual 3D que usa outro frame de referência. Além disso, durante o processamento geométrico do pipeline de renderização, os objetos da cena podem ser expressos em relação ao frame da câmera virtual, cuja origem é frequentemente o centro de projeção. Veremos futuramente como realizar essas mudanças de representação através de matrizes de transformação.
Produto escalar
Sejam u=(u1,…,un) e v=(v1,…,vn) dois vetores do Rn. O produto escalar, denotado por u⋅v, é a soma da multiplicação componente a componente das tuplas. O resultado é, portanto, um escalar:
u⋅v=n∑i=1uivi=u1v1+u2v2+⋯+unvn.
As seguintes propriedades se aplicam:
- u⋅v=v⋅u.
- (au+bv)⋅w=au⋅w+bv⋅w.
- v⋅v≥0, e v⋅v=0 se e somente se v=0.
- 0⋅0=0.
Ortogonalidade
Se u⋅v=0, então u e v são ortogonais, isto é, os vetores são perpendiculares entre si.
Quando todos os vetores de uma base são ortogonais, temos uma base ortogonal.
A base padrão e1,…,en de Rn é um exemplo de base ortogonal, pois ei⋅ej=0 para i≠j.
Comprimento e distância
No espaço euclidiano, a magnitude ou comprimento de um vetor u=(u1,u2,…,un) é definida pela norma euclidiana:
|u|=√u⋅u=√u21+u22+⋯+u2n.
A norma euclidiana permite calcular a distância entre pontos. Como P−Q é um vetor de deslocamento de Q=(q1,…,qn) para P=(p1,…,pn), a distância entre os dois pontos pode ser calculada como
|P−Q|=√(P−Q)⋅(P−Q)= ⎷n∑i=1(qi−pi)2.
A figura 6.10 ilustra a distância euclidiana entre dois pontos P=(px,py) e Q=(qx,qy). Observe sua relação com o teorema de Pitágoras.
Figura 6.10: Distância entre dois pontos no plano.
Normalização
Se |v|=1, dizemos que v é um vetor unitário. Podemos transformar qualquer vetor v não nulo em um vetor unitário na mesma direção, denotado por ^v, se dividirmos todos os elementos de v por seu comprimento: ^v=v|v|. A figura 6.11 ilustra o resultado da normalização de vetores no R2. Observe que os vetores normalizados desenhados a partir da origem ficam inscritos em um círculo unitário.
Figura 6.11: Um conjunto de vetores (esquerda) e seus correspondentes vetores normalizados (direita).
Sempre que possível trabalharemos com vetores unitários. O uso de vetores unitários simplifica o cálculo do sombreamento e iluminação de superfícies.
Quando dois vetores unitários são ortogonais, dizemos que os vetores são ortonormais. A base padrão e1,…,en do Rn é uma base ortonormal pois possui vetores de base unitários (isto é, |ei|=1) e ortogonais entre si.
Ângulo entre vetores
O produto escalar entre dois vetores u e v não nulos é proporcional ao cosseno do ângulo θ formado entre esses vetores:
u⋅v=|u||v|cosθ. Logo,
cosθ=u⋅v|u||v|.
Se os vetores são ortogonais, cosθ=0. Se os vetores são paralelos e na mesma direção, cosθ=1.
O menor ângulo não negativo entre dois vetores (θ∈[0,π]) pode ser calculado como:
θ=cos−1(u⋅v|u||v|). Note que, para vetores unitários, a expressão é mais simples:
cosθ=u⋅v e
θ=cos−1(u⋅v). A relação entre θ e u⋅v é como segue:
u⋅v⎧⎪ ⎪ ⎪⎨⎪ ⎪ ⎪⎩>0,para 0≤θ<π2=0,para θ=π2<0,para π2<θ≤π A figura 6.12 mostra exemplos dos diferentes valores do produto escalar usando vetores no plano.
Figura 6.12: Valor do produto escalar e ângulo entre vetores.
Projeção ortogonal
Dado um vetor w e um vetor v não nulo, podemos decompor w como uma soma de dois vetores, sendo um paralelo a v e outro ortogonal a v (figura 6.13):
w=av+u,
av é o vetor paralelo, chamado de projeção de w sobre v, sendo que
a=w⋅vv⋅v.
u é o vetor ortogonal a v (isto é, u⋅v=0) e
u=w−av.
Figura 6.13: Projeção ortogonal de um vetor sobre outro.
Note que, se v é um vetor unitário,
a=w⋅^v=|w|cosθ,
onde θ é o ângulo entre w e ^v.
Produto vetorial
Sejam u e v dois vetores do R3. O produto vetorial ou produto externo de u e v é definido como
u×v=|u||v|sin(θ)^n,
onde ^n é um vetor unitário ortogonal a u e v, e θ é o ângulo entre u e v. Assim, u×v é um vetor ortogonal aos dois vetores, com magnitude |u×v|=|u||v||sinθ| como mostra a figura 6.14.
Figura 6.14: Produto vetorial.
A direção do vetor ortogonal é dada pela regra da mão direita: usando a mão direita, se o indicador apontar na direção de u e o dedo médio apontar na direção de v, o vetor ortogonal u×v apontará na direção do dedão (figura 6.15).
Figura 6.15: Direção do produto vetorial segundo a regra da mão direita (imagem modificada do original).
O produto vetorial é anticomutativo, isto é,
u×v=−(v×u).
Assim, se a ordem dos operandos for invertida, o vetor ortogonal apontará para a direção oposta, como mostra a figura 6.16 (pela regra da mão direita, o dedão apontará para baixo).
Figura 6.16: A ordem dos operandos determina a direção do vetor ortogonal.
O produto vetorial é calculado como
u×v=(uyvz−uzvy,uzvx−uxvz,uxvy−uyvx).
Para memorizar mais facilmente, podemos expressar o produto vetorial como um determinante de ordem 3:
u×v=∣∣ ∣ ∣∣^i^j^kuxuyuzvxvyvz∣∣ ∣ ∣∣. Usando expansão de cofatores:
u×v=∣∣∣uyuzvyvz∣∣∣^i−∣∣∣uxuzvxvz∣∣∣^j+∣∣∣uxuyvxvy∣∣∣^k=(uyvz−uzvy)^i−(uxvz−uzvx)^j+(uxvy−uyvx)^k=(uyvz−uzvy,uzvx−uxvz,uxvy−uyvx) Uma vez que o vetor ortogonal tem tamanho proporcional ao seno do ângulo entre os vetores, o produto vetorial de dois vetores paralelos é o vetor nulo:
u×u=0,−u×u=0.
Outras propriedades são dadas a seguir:
- u×(v+w)=(u×v)+(u×w).
- (au)×v=u×(av)=a(u×v).
- u⋅(v×w)=(u×v)⋅w.
- u×(v×w)=(u⋅w)v−(u⋅v)w.
Além disso,
^i×^j=^k,^j×^k=^i,^k×^i=^j.
Vetor normal
Um vetor normal, ou simplesmente “normal,” é um vetor perpendicular ao plano que tangencia uma superfície em um dado ponto. Em computação gráfica, vetores normais são essenciais para o cálculo correto do sombreamento e iluminação de superfícies.
Se considerarmos a superfície de uma esfera de raio r>0 dada pela equação
x2+y2+z2=r2, a normal de um ponto P=(x,y,z) sobre essa esfera é o vetor n=(2x,2y,2z) (figura 6.17). O vetor no sentido oposto, −n, também é um vetor normal. Entretanto, em superfícies fechadas como a esfera, geralmente estamos interessados nas normais que apontam para fora da superfície.
Figura 6.17: Vetor normal em um ponto na superfície de uma esfera.
O cálculo do vetor normal em superfícies suaves frequentemente exige o uso de ferramentas de geometria diferencial. Por exemplo, em uma superfície definida implicitamente como uma função level set f(x,y,z)=c, o vetor normal é calculado através do gradiente
n=∇f(x,y,z)=∂f∂x^i+∂f∂y^j+∂f∂z^k. De fato, para a esfera centralizada na origem,
f(x,y,z)=x2+y2+z2
e
n=∇f(x,y,z)=2x^i+2y^j+2z^k=(2x,2y,2z).
Entretanto, neste curso não trabalharemos com superfícies implícitas. Utilizaremos apenas superfícies formadas por malhas de triângulos, uma vez que o pipeline gráfico do OpenGL trabalha apenas com pontos, segmentos e triângulos. Se quisermos renderizar uma esfera, teremos de usar uma malha triangular que aproxime essa esfera. A figura 6.18 ilustra uma malha que aproxima uma esfera. Essa malha pode ser descrita unicamente por triângulos, pois cada quadrilátero pode ser formado por dois triângulos.
Figura 6.18: Vetor normal em uma malha que aproxima a superfície de uma esfera.
Em geral, dada uma malha de triângulos, não temos acesso à representação implícita ou paramétrica da superfície que a malha tenta aproximar. Assim, no caso geral, a normal n mostrada na figura 6.18 precisa ser calculada utilizando unicamente os triângulos que formam a malha.
Figura 6.19: Calculando o vetor normal de um triângulo.
Para calcular a normal de um triângulo △ABC, basta definir dois vetores sobre o plano do triângulo, e então calcular o produto vetorial desses vetores. Os dois vetores podem ser obtidos através da subtração dos vértices que formam quaisquer duas arestas do triângulo (figura 6.19):
u=A−C,v=B−C,n=u×v. Em geral, desejaremos trabalhar com normais unitárias. Nesse caso, a normal será calculada como
^n=u×v|u×v|. Como o triângulo é uma superfície planar, o vetor normal é o mesmo para todos os pontos do triângulo. Entretanto, isso evidencia um problema com o cálculo do vetor normal em vértices de uma malha que aproxima uma superfície suave. Observe na figura 6.20 o detalhe ampliado da esfera da figura 6.18. Cada face, formada por dois triângulos (mostrados pelo tracejado), é uma superfície planar. Portanto, cada face tem o mesmo vetor normal para todos os pontos. Por outro lado, o ponto P é compartilhado por quatro faces (seis triângulos). Qual das normais (n1, n2, n3, n4) deve ser utilizada em np?
Figura 6.20: Detalhe ampliado de uma esfera aproximada por uma malha.
Como a malha de triângulos aproxima uma superfície suave, podemos calcular um vetor normal em P como uma média dos vetores normais de todos os n triângulos que usam P. Uma forma simples de fazer isso é através da normalização da soma dessas normais
^np=∑ni=1ni|∑ni=1ni|, onde ni é o vetor normal do n-ésimo triângulo que usa P. O resultado é um vetor normalizado chamado de normal de vértice. A figura 6.21 ilustra, em um corte bidimensional, como a normal do vértice P aproxima a superfície suave mostrada no tracejado.
Figura 6.21: Normal de vértice como aproximação da normal da superfície suave.
Podemos utilizar este método sempre que soubermos que a malha aproxime uma superfície suave. Veremos nas próximas seções que esse é o método ideal para ser utilizado com geometria indexada, que é a geometria em que os atributos de um vértice são compartilhados com todas as faces adjacentes. Entretanto, se a malha representar um objeto com quinas, tal como um cubo ou pirâmide, então cada face precisará ser renderizada com vértices não compartilhados, pois queremos evidenciar a descontinuidade da superfície. Se esse fosse o caso da geometria ilustrada na figura 6.20, quatro vértices teriam de ser utilizados em P: um para cada face (quadrilátero formado por dois triângulos). Os vértices teriam a mesma posição de P, mas cada um usaria a normal da face correspondente.
Nesse contexto, frame é um quadro de referência (frame of reference) de um sistema de coordenadas e não tem relação com o termo frame utilizado para descrever uma imagem renderizada.↩︎