Baixe o app para aproveitar ainda mais
Prévia do material em texto
UVA – Universidade Veiga de Almeida Espaço Vetorial - Introdução • Um ponto P de coordenadas (x, y, z) pode ser visto como um vetor A que sai da origem e chega até ele. Comp Graf 2 – Espaço Vetorial P Y Z X y zx A UVA – Universidade Veiga de Almeida Espaço Vetorial - Introdução • Um vetor pode ser deslocado, desde que seu comprimento e direção sejam mantidos, sem se alterar. • Assim, o espaço de coordenadas cartesianas é na verdade um espaço vetorial, e todo vértice de um objeto define um vetor que vai da origem até ele. Comp Graf 2 – Espaço Vetorial Y Z X UVA – Universidade Veiga de Almeida Multiplicação por escalar A = ( x, y, z) k A = (k.x, k.y, k.z) • Equivale a alterar o módulo (comprimento) do vetor. • Se o escalar for negativo, a sua multiplicação implica na mudança do sentido do vetor (mantém a direção do vetor). Comp Graf 2 – Espaço Vetorial Y Z X 2B B B - B UVA – Universidade Veiga de Almeida Adição e Diferença de Vetores Dados dois vetores: A = (xA, yA, zA) e B = (xB, yB, zB) , então: • O vetor adição A + B é definido por: A + B = (xA + xB, yA + yB, zA + zB) • O vetor soma está na diagonal maior do paralelogramo formado pelos dois vetores • O vetor diferença A - B é definido por: A - B = (xA - xB, yA - yB, zA - zB) • O vetor diferença está na diagonal menor do paralelogramo formado pelos dois vetores: Comp Graf 2 – Espaço Vetorial Y Z A + B B A - B A - B X UVA – Universidade Veiga de Almeida Vetor ligando dois pontos • Um vetor ligando dois pontos: P1 = (xA, yA, zA) e P2 = (xB, yB, zB) pode ser obtido quando se considera os pontos como vetores A e B ligados à origem. • Neste caso, o vetor ligando os dois pontos é a diferença entre os vetores dos dois pontos (B-A). Comp Graf 2 – Espaço Vetorial P1 Y Z X A B P2 B-A UVA – Universidade Veiga de Almeida Produto Interno (ou Produto Escalar) • Dado dois vetores: A = (xA, yA, zA) e B = (xB, yB, zB) • O produto interno é definido como um escalar: A . B = xA . xB + yA . yB + zA . zB • O comprimento (ou módulo) de um vetor pode ser facilmente obtido através do produto interno do vetor por ele mesmo. A . A = xA . xA+ yA . yA + zA . zA A . A = xA2 + yA2 + zA2 = | A|2 | A| = ( xA2 + yA2 + zA2 ) 1/2 Comp Graf 2 – Espaço Vetorial UVA – Universidade Veiga de Almeida Produto Interno (ou Produto Escalar) • O produto interno A . B é numericamente igual ao produto do vetor A pela projeção do vetor B sobre A: A . B = |A| . |B| . cos() • Se A estiver no sentido oposto de B cos()<0 A . B <0 • Se A estiver na direção perpendicular à B cos()=0 A . B = 0 • Se A estiver no mesmo sentido de B cos()>0 A . B >0 Comp Graf 2 – Espaço Vetorial B A |B|. cos() UVA – Universidade Veiga de Almeida Subespaços – O Plano • Dado dois vetores A = (xA, yA, zA) e B = (xB, yB, zB) uma combinação linear através da multiplicação de escalares c1 e c2 é capaz de gerar todos os pontos de um plano formado pelo dois vetores: c1.A + c2.B = (c1.xA, c1.yA, c1. zA) + (c2.xB, c2. yB, c2.zB) = (c1.xA + c2.xB, c1.yA + c2.yB, c1.zA + c2.zB) Comp Graf 2 – Espaço Vetorial A B c1.A c1.B UVA – Universidade Veiga de Almeida Produto Vetorial (ou Produto Externo) • Dado dois vetores: A = (xA, yA, zA) e B = (xB, yB, zB) • O produto vetorial é definido como: Comp Graf 2 – Espaço Vetorial A B AB )..,..,..( BABABABABABA xyyxxzzxyzzyBA Observar que: |A B| = |A| . |B| . sin() A B = - B A UVA – Universidade Veiga de Almeida Produto Vetorial (ou Produto Externo) Comp Graf 2 – Espaço Vetorial BBB AAA zyx zyx kji BA A Componente x de A B = yA.zB – zA.yB eqüivale a eliminar a primeira linha e a primeira coluna de uma matriz, e calcular o determinante da matriz resultante BBB AAA zyx zyx kji BA A Componente Y de A B = xA.zB – zA.xBeqüivale a eliminar a primeira linha e a segunda coluna de uma matriz, e calcular o determinante da matriz resultante BBB AAA zyx zyx kji BA A Componente Z de A B = xA.yB – yA.xB eqüivale a eliminar a primeira linha e a terceira coluna de uma matriz, e calcular o determinante da matriz resultante )..,..,..( BABABABABABA xyyxxzzxyzzyBA UVA – Universidade Veiga de Almeida Coseno Diretor • A direção de um vetor é dada pelos ângulos , , que o vetor faz com cada um dos eixos coordenados. • Esses ângulos são chamados de cosenos diretor do vetor, e são calculados por: Cos() = x / |v| Cos() = y / |v| Cos() = z / |v| Cos2() + Cos2() + Cos2() = 1 Comp Graf 2 – Espaço Vetorial UVA – Universidade Veiga de Almeida Exemplo: Implementação VB • No Global.bas • No frmDesenho Comp Graf 2 – Espaço Vetorial Global Normal(3, 2) As Double Public Sub ProdVet() Normal(3, 0) = Normal(0, 1) * Normal(1, 2) - Normal(0, 2) * Normal(1, 1) Normal(3, 1) = Normal(0, 0) * Normal(1, 2) - Normal(0, 2) * Normal(1, 0) Normal(3, 2) = Normal(0, 0) * Normal(1, 1) - Normal(0, 1) * Normal(1, 0) End Sub )..,..,..( BABABABABABA xyyxxzzxyzzyBA UVA – Universidade Veiga de Almeida Introdução • Um sólido é um objeto 3D que tem superfícies, isto significa que a sua imagem não apresenta as partes das superfícies que não estão visíveis. • Problema: desenhar somente os lados do objeto que estão de frente para a Câmera, porque as faces posteriores do objeto não são visíveis. Comp Graf 2 – Superfícies Escondidas UVA – Universidade Veiga de Almeida Remoção das Faces Escondidas • Primeiro, deve-se definir as superfícies que a Câmera pode ver. • Para determinar qual o lado do objeto está de frente para câmara calcula- se o vetor perpendicular à superfície de cada face. • Este vetor é o resultado de um produto vetorial entre dois vetores pertencentes à uma face do sólido. • Restrição: o vetor normal N à superfície deve apontar para fora dela. • Se o resultado do cálculo do produto interno entre o vetor normal à superfície do objeto e um vetor que aponta para a câmara for positivo, então o lado correspondente do objeto será visível. Comp Graf 2 – Superfícies Escondidas Face visível Produto interno >0 N Face escondidaProduto interno <0 N UVA – Universidade Veiga de Almeida Limitação do algoritmo Hidden Lines • O algoritmo de Hidden Lines não é adequado para objetos complexos (toróides ou outros com furos). Comp Graf 2 – Superfícies Escondidas UVA – Universidade Veiga de Almeida Cálculo do Vetor que Aponta para a Câmara • O vetor V que aponta para a câmara pode ser obtido através do vetor diferença entre o vetor C centro de câmera (construído apenas com as coordenadas de deslocamento da câmera) e o vetor D centro de uma face. D = (xD, yD, zD) C = (xc, yc, zc) Onde: xc = Objeto(0).xObj yc = Objeto(0).yObj zc = Objeto(0).zObj • O vetor V deverá ir do centro da face até a câmera . V = C – D = (xC – xD, yC – yD, zC – zD) Comp Graf 2 – Superfícies Escondidas x’ y’ z’ C Y Z X yObj V xObj zObj D Otimizando o Método Hidden Lines • Quando movemos os objetos para o sistema de coordenadas da câmera (x’, y’, z’), através das transformações de câmera (se a câmera roda de => o objeto roda de -, etc.), estamos colocando o centro do objeto no sistema de coordenadas da câmera (cada ponto do objeto está projetado nos eixos X, Y e Z da câmera). Isto é: Comp Graf 2 – Superfícies Escondidas zN > 0 zN < 0 Z’ N N Otimizando o Método Hidden Lines (cont.) • Neste caso, o vetor V que aponta para a câmaraé o próprio eixo Z, portanto o produto interno entre a normal N (xN, yN, zN) à uma face do sólido e o vetor V = (0, 0, Vz) será: V . N = Vz . zN • Como estamos interessados apenas no sinal de V . N, então basta verificar se zN < 0 , para se determinar se a face está oculta. • Assim, pode-se identificar qualquer face como uma face não visível se o seu vetor normal possui componente z com um valor: zN < 0 Comp Graf 2 – Superfícies Escondidas zN > 0 zN < 0 Z’ N = (xN, yN, zN) N V=(0, 0, vz) Rotulando Vértices das Faces • Para que o vetor normal à cada face do objeto aponte sempre para fora do objeto é necessário que se fixe uma convenção para numeração dos vértices em cada face. • Convenção: Os vértices e arestas são listados no sentido contrário ao do movimento dos ponteiros de um relógio quando a face é vista de fora, de modo que o produto vetorial entre dois vetores da face (que determina a normal) também aponte para fora. Comp Graf 2 – Superfícies Escondidas 12 3 4 Certo 1 2 34 Errado As faces do cubo • Para se observar a convenção para numeração dos vértices, cada face do cubo deve ser identificada conforme mostrado a seguir. Comp Graf 2 – Remoção de Superfícies Escondidas - Topologia: Faces: F0 V0, V1, V2, V3 F1 V1, V4, V5, V2 F2 V0, V7, V4, V1 F3 V4, V7, V6, V5 F4 V2, V5, V6, V3 F5 V0, V3, V6, V7 V0 V1 V3 V2 V4 V5 V7 Normal à uma face do cubo • O vetor normal à uma face F pode ser obtido pelo produto vetorial A x B onde: • A = v0 - v1 e B = v2 – v1 • Sequência – Selecionar um vértice pivô, por exemplo: V1 – Definir vetores correspondentes às arestas que partem desse vértice – Assim, para a face F: V0, V1, V2, V3 V0 = (x0, y0, z0) V1 = (x1, y1, z1) A = v2 - v1 = (x2-x1, y2-y1, z2-z1) V2 = (x2, y2, z2) B = v0 – v1 = (x0-x1, y0-y1, z0-z1) • O vetor normal será: AB = (yA.zB – zA.yB, xA.zB – zA.xB, xA.yB – yA.xB) Comp Graf 2 – Remoção de Superfícies Escondidas - V1 V0 V2 B A A x B Comp Graf 2 – Remoção de Superfícies Escondidas - //******************************************************************* // Function: CalculateVectorNormal // // Purpose: Given three points of a 3D plane, this function calculates // the normal vector of that plane. // // Parameters: // fVert0[] == array for point 0 (3 elements are x, y, and z). // fVert1[] == array for point 1 (3 elements are x, y, and z). // fVert2[] == array for point 2 (3 elements are x, y, and z). // // Returns: // fNormalX == X vector for the normal vector // fNormalY == Y vector for the normal vector // fNormalZ == Z vector for the normal vector // //********************************************************************** Comp Graf 2 – Remoção de Superfícies Escondidas - GLvoid CalculateVectorNormal (GLfloat fVert1[], GLfloat fVert2[], GLfloat fVert3[], GLfloat *fNormalX, GLfloat *fNormalY, GLfloat *fNormalZ) { GLfloat Ax, Ay, Az, Bx, By, Bz; Ax = fVert2[0] - fVert1[0]; Ay = fVert2[1] - fVert1[1]; Az = fVert2[2] - fVert1[2]; Bx = fVert0[0] - fVert1[0]; By = fVert0[1] - fVert1[1]; Bz = fVert0[2] - fVert1[2]; *fNormalX = Ay*Bz - Az*By; *fNormalY = Az*Bx - Ax*Bz; *fNormalZ = Ax*By - Ay*Bx; } V1 V0 V2 B A A x B AB = (yA.zB – zA.yB, xA.zB – zA.xB, xA.yB – yA.xB) Comp Graf 2 – Remoção de Superfícies Escondidas - Exemplo: glBegin(GL_POLYGON); glVertex3fv(fVert1); glVertex3fv(fVert2); glVertex3fv(fVert3); glVertex3fv(fVert4); // Calculate the vector normal coming out of the 3D polygon. CalculateVectorNormal(fVert1, fVert2, fVert3, &fNormalX, &fNormalY, &fNormalZ); // Set the normal vector for the polygon glNormal3f(fNormalX, fNormalY, fNormalZ); glEnd();
Compartilhar