COMPUTAÇÃO GRÁFICA E INTERFACES Visualização e Transformações Geométricas em 3D Curso de...

Post on 22-Apr-2015

102 views 0 download

Transcript of COMPUTAÇÃO GRÁFICA E INTERFACES Visualização e Transformações Geométricas em 3D Curso de...

COMPUTAÇÃO GRÁFICA E INTERFACES

Visualização e Transformações Geométricas em 3D

Curso de Engenharia InformáticaAno lectivo 2004/2005

Escola Superior de Tecnologia e Gestão da Guarda

Pipeline de visualização da OpenGL

Transformação“viewport”

Transformação“viewport”

DivisãoPerspectiva

DivisãoPerspectiva

Matriz deProjeção

Matriz deProjeção

Matriz deModelização

e Visualização

Matriz deModelização

e Visualização

vertice

objeto

olho recortenormalizadasde 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árioglFrontFace(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

x

y

z

Transformações geométricas 3D

Rotação em torno do eixo Z

sin

cos

rP

rP

y

x

P

P’

x

y

rr

• Sabemos que

)sin(

)cos(

rP

rP

y

x

• Então

cossinsincos

sinsincoscos

rrP

rrP

y

x

cossin

sincos

yxy

yxx

PPP

PPP

• Ou, finalmente,

x

y

z

Transformações geométricas 3D

Matrizes de rotação

1000

0100

00cossin

00sincos

1000

0cossin0

0sincos0

0001

1000

0cos0sin

0010

0sin0cos

• Rotação em torno de Z

• Rotação em torno de X

• Rotação em torno de Y

Transformações geométricas 3D

Variação de escala

1000

000

000

000

z

y

x

escala S

S

S

T

x

y

z

x

y

z

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.

Centro de Projeção

Plano de Projeção

Projectante ouRaio 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.

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étricasProjecçõ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étricasProjecçõ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 empontos 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éricaPara 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étricasMatriz 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ãoaspect -> 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.

câmara

tripé modelo

volume visível

Modelo de câmara sintéticaInterpretaçã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;

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á posicionadaaim = ponto para onde a câmara será apontadaup = vector que dá a direcção “para cima” da câmara

x

y

z

aim

eye

up

Modelo de câmara sintética

Interpretação do modelo da câmara

Modelação:Mover /deformar os objectos

Visualização:Mover e orientar a câmara

Projecção:Ajuste da lente / objectiva da câmara

Viewport:Aumentar ou reduzir a fotografia

x

y

z

aim

eye

up