COMPUTAÇÃO GRÁFICA E INTERFACES
Visualização e Transformações
Geométricas em 3D
Curso de Engenharia Informática
Ano lectivo 2004/2005
Escola Superior de Tecnologia e Gestão da Guarda
Pipeline de visualização da OpenGL
v
e
r
t
i
c
e
Matriz de
Modelização
e Visualização
objet
o
Matriz de
Projeção
olho
Divisão
Perspectiva
recorte
Transformação
“viewport”
normalizadas
de dispositivo
janela
Estado inicial do pipeline
Inicialmente:
• As matrizes modelview e projection
são matrizes-identidade;
• Vértices não são transformados e a
projecção é paralela sobre o plano x-y;
• O mundo visível é restrito ao cubo
-1 ≤ x,y,z ≤ 1;
A transformação viewport mapeia o
quadrado -1 ≤ x,y ≤ 1 (em coordenadas
normalizadas de dispositivo) na
superfície total da janela.
Viewport
A viewport é a área rectangular onde a imagem será visualizada.
Em OpenGL a viewport é definida com a função:
void glViewport( GLint x, GLint y, GLsizei width, GLsizei height )
glViewport(0,0, (GLint)width, (GLint)height);
glViewport(-100,-100, (GLint)width, (GLint)height);
Primitivas gráficas
glBegin(TIPO_PRIMITIVA);
glVertex3f(x, y, z);
...
glEnd()
Primitivas gráficas
Propriedades de linhas e pontos
Tamanho (default = 1):
glPointSize( GLfloat size )
glLineWidth( GLfloat width )
Suavização (default = desligado):
glEnable(GL_POINT_SMOOTH)
glEnable(GL_LINE_SMOOTH)
glDisable(GL_POINT_SMOOTH)
glDisable(GL_LINE_SMOOTH)
Primitivas gráficas
Propriedades de polígonos
A ordenação dos vértices define a face frontal;
O default é o sentido anti-horário;
É possível alterar a ordem:
glFrontFace(GL_CW) Sentido horário
glFrontFace(GL_CCW) Sentido anti-horário
Primitivas gráficas
Modos de renderização
Wireframe:
glPolygonMode(GL_FRONT, GL_LINE);
Sólido:
glPolygonMode(GL_FRONT, GL_FILL);
Pontos:
glPolygonMode(GL_FRONT, GL_POINT);
Backface Culling:
glEnable(GL_CULL_FACE);
Z-Buffer:
glEnable(GL_DEPTH_TEST);
Primitivas gráficas
Objectos sólidos da biblioteca GLUT
glutSolidTeapot(GLdouble size);
glutSolidCube(GLdouble size);
glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);
glutSolidCone(GLdouble radius, GLdouble height, GLint slices, GLint stacks);
glutSolidTorus(GLdouble innerRadius, GLdouble outerRadious, GLint nsides, GLint rings);
glutSolidIcosahedron(void);
glutSolidOctahedron(void);
glutSolidTetrahedron(void);
glutSolidDodecahedron(GLdouble radious);
Todas estas funções também podem ser usadas para desenhar objectos em wire-frame Para
isto, basta substituir a substring Solid por Wire no nome da função.
Transformações geométricas 3D
Translação
1
0
T 
0

0
y
0
1
0
0
0 tx 
0 t y   I 3 t 



1 tz
0
1



0 1
x
z
1
0
P'  T  P  
0

0
0
1
0
0
0 t x   Px   Px  t x 
0 t y   Py   Py  t y 


 Pt





1 tz
Pz
Pz  t z
   

0 1  1   1 
Transformações geométricas 3D
Rotação em torno do eixo Z
• Sabemos que
y
Px  r cos
Py  r sin 
x
y
• Então
z
Px  r cos cos  r sin  sin 
Py  r cos sin   r sin  cos
P’
r

r

Px  r cos(   )
Py  r sin(   )
• Ou, finalmente,
P
Px  Px cos  Py sin 
x
Py  Px sin   Py cos
Transformações geométricas 3D
Matrizes de rotação
• Rotação em torno de Z
• Rotação em torno de X
• Rotação em torno de Y
cos
 sin 

 0

 0
 cos
 0

 sin 

 0
 sin 
cos
0
0
0
0
1
0
0
0
0

1
0 sin 
1
0
0 cos
0
0
0
0
0

1
0
1
0 cos

0  sin 

0
0
0
sin 
cos
0
0
0
0

1
Transformações geométricas 3D
Variação de escala
y
y
Tescala
x
z
x
z
S x
0

0

0
0
Sy
0
0
0
0
Sz
0
0
0
0

1
Transformações geométricas 3D
Transformações geométricas 3D em OpenGL
As trnasformações geométricas são aplicadas nas matrizes modelview e projection do pipeline :
A matriz é escolhida através da função
glMatrixMode(GL_MODELVIEW); ou glMatrixMode(GL_PROJECTION);
As transformações geométricas Translação, Rotação e Variação de escala são implementadas respectivamente
pelas funções:
glTranslated( GLdouble x, GLdouble y, GLdouble z );
glTranslatef( GLfloat x, GLfloat y, GLfloat z );
glRotated( GLdouble angle, GLdouble x, GLdouble y, GLdouble z );
glRotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z );
glScaled( GLdouble x, GLdouble y, GLdouble z );
glScalef( GLfloat x, GLfloat y, GLfloat z );
Existem outras funções para manipular as matrizes das transformações:
glLoadIdentity() glMultMatrix ()
glLoadMatrix()
glPushMatrix ()
glPopMatrix()
Projecções Geométricas
As projecções permitem a visualização planar de objectos tridimensionais.
Para gerar a imagem de um objecto 3D, precisamos converter as
coordenadas 3D em coordenadas 2D que correspondem a uma visão
específica do objecto. Esse processo é chamado de projecção.
Projecções Geométricas
Elementos básicos das projecções
Sendo a projecção de um objecto a sua representação gráfica num plano, e tendo os
objectos três dimensões, para a sua representação num plano bidimensional devem
ser considerados os seguintes elementos básicos da projecção:
•Plano de Projecção;
•Projectante, ou raio de projecção;
•Centro de projecção.
A projectante é a recta que passa
pelos pontos do objecto na direcção
do centro de projecção e intercepta
o plano de projecção. Ela pode ser
oblíqua ou ortogonal ao plano de
projecção, definindo assim o tipo de
projecção.
Plano de
Projeção
Centro de
Projeção
Projectante ou
Raio de projecção
Projecções Geométricas
Tipos de projecções geométricas
Existem dois tipos de projecção: a
perspectiva e a ortográfica (paralela).
Na projecção perspectiva as projectantes
convergem para o centro de projecção
fazendo com que a projecção resultante
tenha em conta a distância a que se
encontra o objecto, do plano de projecção.
A projecção perspectiva é aquela que
acontece no processo de formação de
imagens nos nossos olhos ou numa câmara
fotográfica, por isso é a que gera imagens
mais realistas e mais familiares ao
observador humano.
Projecções Geométricas
Tipos de projecções geométricas
Na projecção ortográfica ou paralela, o
centro de projecção está no infinito e as
projectantes são paralelas entre si.
Na projecção paralela, as linhas que unem
os pontos A e B às suas projecções A’ e B’
são paralelas, isto faz com que o segmento
projectado tenha o mesmo tamanho para
qualquer distância entre o plano de
projecção e o objecto.
Este tipo de projecção é utilizada em
projectos de arquitectura e engenharia
onde não há preocupação com a distância
aparente dos objectos e o que realmente
interessa é que a escala e os ângulos dos
objectos seja preservada
Projecções Geométricas
As projecções geométricas são classificadas conforme o organograma
seguinte. Esta classificação depende das relações entre o centro de
projecção, o plano de projecção e as projectantes.
Projecções Geométricas
Projecções paralelas ortográficas
Usadas em desenhos técnicos
– Engenharias Civil e Mecânica
– Arquitectura
Vantagens
– Medidas precisas;
– Todas as vistas na mesma escala;
Limitações
– Não é possível “visualizar” objectos 3D;
– Múltiplas vistas para definir peça;
Projecções Geométricas
Projecções paralelas axonométricas
Mesmo método das vistas ortogonais
• Isométricas:
– ângulos de 120º entre eixos (1 escala)
• Dimétricas:
– dois ângulos iguais (2 escalas)
• Trimétrica:
– três ângulos diferentes (3 escalas)
Projecções Geométricas
Projecções paralelas obliquas
Raios projectores formam ângulo oblíquo com o
plano de projecção.
Plano de projecção normal a um dos eixos
principais.
Vantagens
– Mostra forma exacta de uma face;
– Comparação de dimensões possível;
– Ideia da aparência 3D de um objecto;
Desvantagens
– aparência distorcida dependendo do plano de
projecção;
– falta de “realismo”;
Projecções Geométricas
Projecções paralelas obliquas (dois casos especiais)
Cavaleira
– Ângulo entre projectores e normal = 45º;
– Faces perpendiculares à escala.
Gabinete
– Ângulo entre projectores e normal arctg(2) = 63.4º;
– Faces perpendiculares à escala de 50%.
Projecções Geométricas
Projecções perspectivas
Usadas mais em publicidade e artes gráficas mas também em arquitectura,
desenho industrial, engenharia.
Garantem maior “realismo” mas alteram a geometria dos objectos
As linhas paralelas dos objectos (não ao plano de projecção), convergem em
pontos de fuga. As linhas paralelas aos eixos definem pontos de fuga axiais
(máximo de 3). Não mantém proporcionalidade entre distâncias. O tamanho
dos objectos diminui com a distância. Só mantém a amplitude dos ângulos em
faces paralelas ao plano de projecção.
Projecções Geométricas
Projecções perspectivas
Projecções Geométricas
Definição matemática da projecção genérica
Qualquer projecção pode ser definida
matematicamente por uma matriz 4 x 4.
Considere-se a projecção de um ponto P
ilustrada na figura ao lado.
O plano de projecção é perpendicular ao
eixo z na distância zp da origem.
O centro de projecção está a uma
distância D do ponto (0, 0, zp).
O vector normalizado (dx, dy, dz) dá a
direcção de projecção e é a direcção de
(0, 0, zp) para o centro de projecção.
Projecções Geométricas
Definição matemática da projecção genérica
Para construir a matriz geral de
projecção, a qual chamaremos de
Mgeral, basta sabermos apenas os
valores de zp, (dx, dy, dz) e D.
A partir desta matriz geral é possível
definir qualquer tipo de projecção.
Deve-se apenas ter em conta as
características gerais das projecções
paralelas e perspectivas, e as
características específicas dos casos
especiais dessas projecções.
A direcção do vector unitário (dx, dy,
dz) e o valor de D (distância do ponto
(0, 0, zp) ao centro de projecção) pode
ser calculada da seguinte forma:
Projecções Geométricas
Matriz geral de projecção em OpenGL
void __fastcall Form1::FormResize()
{
GLfloat mprojecao[16];
glViewport(0,0,width,height);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
mprojecao [0]=1; mprojecao [1]= 0; mprojecao [2]= 0; mprojecao [3]= 0;
mprojecao [4]= 0; mprojecao [5]= 1; mprojecao [6]= 0; mprojecao [7]= 0;
mprojecao [8]= 0; mprojecao [9]= 0; mprojecao [10]= 0; mprojecao [11]= 1/7;
mprojecao [12]= 0; mprojecao [13]= 0; mprojecao [14]= 0; mprojecao [15]= 1;
glLoadMatrixf (mprojecao);
glClearColor(0.0f,0.0f,0.0f,0.0f);
glClear( GL_COLOR_BUFFER_BIT );
glClear(GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
}
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
Formato da matriz em OpenGL
Projecções Geométricas
Definição da matriz de projecção perspectiva – 1º exemplo
Para simplificar, considere-se a
projecção perspectiva representada na
figura ao lado com o centro de
projecção em (0, 0, 0) e direcção de
projecção ortogonal.
Os parâmetros para definir a matriz de
projecção perspectiva Mper para este
exemplo, são respectivamente:
Substituindo estes valores na matriz de projecção
geral, obtemos a seguinte matriz de projecção
perspectiva:
Notar que neste exemplo basta conhecer a distância
D para que a matriz de projecção possa ser definida.
Projecções Geométricas
Definição da matriz de projecção perspectiva – 2º exemplo
Considere-se uma nova projecção
perspectiva ortogonal representada na
figura ao lado, agora com o plano de
projecção em zp = 0 e o centro de
projecção em (0, 0, -D).
Os parâmetros para definir a matriz
de projecção perspectiva M’per, são
respectivamente:
Substituindo estes valores na matriz de projecção
geral, obtemos a seguinte matriz de projecção
perspectiva:
Notar que mais uma vez, basta conhecer a distância D
para que a matriz de projecção possa ser definida.
Projecções Geométricas
Projecção perspectiva em OpenGL
Em OpenGL existe uma matriz de projecção
perspectiva default com direcção ortogonal.
Para configuração de uma projecção perspectiva em
OpenGL (utilizando a matriz default), é apenas
necessário definir o volume visível representado na
figura ao lado.
O volume visível é definido pelo tronco de uma
pirâmide. São especificados os valores de X máximo e
mínimo assim como os valores de Y máximo e mínimo.
O valor de Near é igual a -Z min e o valor de Far é
igual a -Z max.
Somente será visualizado o que estiver dentro deste
volume visível.
A projecção é definida pelos seguintes comandos:
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glFrustum(Xmin, Xmax, Ymin, Ymax, Near, Far);
Projecções Geométricas
Projecção perspectiva em OpenGL
Existe outra função da biblioteca GLU (utilitária da OpenGL), que fornece uma outra maneira
de se configurar uma projecção perspectiva em OpenGL. Ela permite que seja especificado o
ângulo de visão (ou field of vision), da projecção:
gluPerspective (fovy, aspecto, near, far);
Onde:
fovy -> é o ângulo de visão
aspect -> Largura (w na figura) / Altura (h na figura) da janela de visualização.
near e far -> idênticos aos parâmetros do comando Frustum.
Projecções Geométricas
Definição da matriz de projecção perspectiva – 3º exemplo
Considere-se agora a projecção
perspectiva da figura ao lado em que a
direcção de projecção não é ortogonal
ao plano de projecção.
Os parâmetros para definir uma matriz
de projecção perspectiva M1, são
respectivamente:
Substituindo estes valores na matriz de projecção
geral, obtemos a seguinte matriz de projecção
perspectiva:
Projecções Geométricas
Definição da matriz de projecção ortográfica – Exemplo 1
Considere-se a projecção ortográfica da figura ao lado com
direcção de projecção ortogonal.
Como a projecção paralela pode ser vista como uma
projecção perspectiva onde o centro de projecção está no
infinito, o valor de D (distância do centro de projecção ao
ponto (0,0, zp), neste caso zp = 0) será infinito.
Os parâmetros para definir uma matriz de projecção
perspectiva Mpar, são respectivamente:
Substituindo estes valores na matriz de projecção geral, obtemos a
seguinte matriz de projecção paralela:
Notar que neste caso especial de projecção paralela não é
necessário conhecer qualquer parâmetro da projecção e a matriz
da mesma é constante.
Projecções Geométricas
Projecção ortográfica em OpenGL
Em OpenGL já vem definida também uma matriz de
projecção com direcção ortogonal default para a
projecção ortográfica. Como na projecção perspectiva,
para realizar uma projecção deste tipo em OpenGL
(utilizando esta matriz default), é necessário definir-se
apenas o volume visível ilustrado na figura ao lado.
O volume visível é definido por um paralelepípedo. São
especificados os valores de X máximo e mínimo assim
como os valores de Y máximo e mínimo. O valor de Near é
igual a -Z min e o valor de Far é igual a - Z max.
Como na projecção perspectiva, somente será visualizado
o que estiver dentro deste volume visível.
A projecção é definida pelos seguintes comandos:
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho(Xmin, Xmax, Ymin, Ymax, Near, Far);
Projecções Geométricas
Definição da matriz de projecção ortográfica – Exemplo 2
A projecção isométrica é uma projecção onde o plano de projecção (e
consequentemente a direcção de projecção) faz o mesmo ângulo com cada eixo
principal (x, y, e z). Existem apenas oito direcções (uma em cada octante), que
satisfazem esta condição. Por exemplo: (1, 1, 1), (1, -1, -1) e (-1, -1, -1). Essa
projecção é muito útil, pois as medidas junto aos eixos são feitas na mesma escala
(iso: igual, metric: medida).
A matriz Miso de uma projecção isométrica com direcção de projecção igual a (-1, -1,
-1) é definida pelos parâmetros:
Substituindo estes valores na matriz de projecção geral,
obtemos a seguinte matriz de projecção paralela:
Projecções Geométricas
Definição da matriz de projecção ortográfica – Exemplo 3
As projecções cabinet e cavaleira são muito utilizadas em arquitectura e engenharia.
Para a projecção cavaleira, a direcção de projecção faz um ângulo de 45º com o
plano de projecção. Já a projecção cabinet, tem uma direcção de projecção fazendo
um ângulo de arctan(2) = 63,4º com o plano de projecção. Para estas projecções,
considerando t o ângulo entre o eixo z e o eixo x (tipicamente 30º ou 45º), teremos
como parâmetros das matrizes Mcav (cavaleira) e Mcab (cabinet) os valores
mostrados na figura 4.5.11.
Substituindo estes valores na
matriz de projecção geral, obtemos
a seguinte matriz resultantes das
projecções cavaleira e cabinet para
t = 45º. :
Modelo de câmara sintética
A OpenGL utiliza uma analogia comparando a visualização 3D com tirar
fotografias com uma câmara.
volume
visível
câmara
tripé
modelo
Modelo de câmara sintética
Interpretação do modelo da câmara
Duas interpretações possíveis:
Levam a câmara até a cena que se quer visualizar;
Levam os objectos da cena até uma câmara estacionária;
up
y
Em OpenGL a câmara pode ser posicionada com a função:
gluLookAt(eyex, eyey, eyez,aimx, aimy, aimz, upx, upy, upz);
eye = ponto onde a câmara será posicionada
aim = ponto para onde a câmara será apontada
up = vector que dá a direcção “para cima” da câmara
aim
eye
x
z
Modelo de câmara sintética
Interpretação do modelo da câmara
Modelação:
Mover /deformar os objectos
up
y
Visualização:
Mover e orientar a câmara
aim
eye
x
Projecção:
Ajuste da lente / objectiva da câmara
Viewport:
Aumentar ou reduzir a fotografia
z
Download

Document