Você está na página 1de 12

Universidade Federal do Vale do São Francisco

Curso de Engenharia da Computação

Computação Gráfica – OpenGL 05 – 3D

Prof. Jorge Cavalcanti


jorge.cavalcanti@univasf.edu.br
www.univasf.edu.br/~jorge.cavalcanti
www.twitter.com/jorgecav
Visualização em 3D
• Para visualizar uma determinada cena em 3D é
análogo a tirar uma fotografia com uma máquina
fotográfica, o que inclui os seguintes passos:
– Arrumar o tripé e posicionar a câmera para fotografar a
cena. (LookAt).
– Arrumar a cena para ser fotografada, incluindo ou excluindo
objetos/pessoas.
– Isso é equivalente à etapa de modelagem (inclui as
transformações geométricas, glTranslatef, glScalef,
glRotatef, e o desenho dos objetos);

Computação Gráfica – OpenGl


Página 2 Prof. Jorge Cavalcanti - Parte 05
15/02/2018
Visualização em 3D
• Posição da Câmera e para onde ela está direcionada:
gluLookAt(eye_x, eye_y, eye_z, center_x, center_y, center_z,
up_x, up_y, up_z);

• up_x, up_y, up_z – Indicam o vetor que aponta para o “lado de


cima” do objeto
Computação Gráfica – OpenGl
Página 3 Prof. Jorge Cavalcanti - Parte 05
15/02/2018
Visualização em 3D
• Para visualizar uma determinada cena em 3D...
(cont.).
– Escolher a lente da câmera ou ajustar o zoom
– Equivalente a especificar as transformações de projeção.
gluPerspective(ângulo, aspecto, perto, longe);
glOrtho(esquerda, direita, baixo, cima, perto, longe);

Computação Gráfica – OpenGl


Página 4 Prof. Jorge Cavalcanti - Parte 05
15/02/2018
Visualização em 3D
• Para visualizar uma determinada cena em 3D...
(cont.).
– Determinar o tamanho final da foto (maior ou menor);
– Equivalente a especificar a viewport, informando como
parâmetros o canto inferior esquerdo, a largura e a altura da
janela.
glViewport(0, 0, largura, altura)
– Ver exemplos no Demo

Computação Gráfica – OpenGl


Página 5 Prof. Jorge Cavalcanti - Parte 05
15/02/2018
Visualização em 3D
• A OpenGl mantém matrizes de transformação ModelView,
Projection e ViewPoint, para transformar qualquer ponto dado
em um ponto na janela de visualização (ortho ou perspective).
– O comando glMatrixMode deverá ser utilizado antes dos comandos que
especificam a forma da projeção.
• (GL_PROJECTION) – avisa a OpenGL que todas as futuras
alterações, tais como operações de escala, rotação e translação,
irão afetar a "câmera" (ou observador).
• (GL_MODELVIEW) - avisa a OpenGL que todas as futuras
alterações, tais como operações de escala, rotação e translação,
irão afetar os modelos da cena (=o que é desenhado).
• A função glLoadIdentity(); chamada em seguida, faz com que a
matriz corrente seja inicializada com a matriz identidade (nenhuma
transformação é acumulada).

Computação Gráfica – OpenGl


Página 6 Prof. Jorge Cavalcanti - Parte 05
15/02/2018
Visualização em 3D
• Exemplo:
// Especifica sistema de coordenadas de projeção
glMatrixMode(GL_PROJECTION);
// Inicializa sistema de coordenadas de projeção
glLoadIdentity();
// Especifica a projeção perspectiva
// (angulo, aspecto, zMin, zMax)
gluPerspective(angle,fAspect,0.5,1000);
// Especifica sistema de coordenadas do modelo
glMatrixMode(GL_MODELVIEW);
// Inicializa sistema de coordenadas do modelo
glLoadIdentity();
glTranslatef(-obsX,-obsY,-obsZ);
glRotatef(rotX,1,0,0);
glRotatef(rotY,0,1,0); http://migre.me/mWQMP

Computação Gráfica – OpenGl


Página 7 Prof. Jorge Cavalcanti - Parte 05
15/02/2018
Primitivas 3D no OpenGL
• A biblioteca GLUT também possui diversas funções
para desenhar objetos 3D.
– Ex: glutWireTeapot(GLdoouble size), glutWireCube(GLdouble
size); glutWireSphere(GLdouble radius, GLint slices, GLint
stacks).
– Todas estas funções também podem ser usadas para
desenhar objetos sólidos, ao invés de exibir apenas o seu
wire-frame.
– Para isto, basta substituir a substring Wire do nome da
função por Solid. Por exemplo, se substituirmos a chamada
à função glutWireTeapot(50.0f) por glutSolidTeapot(50.0f)

Exemplo1 - http://migre.me/mWR3j

Exemplo2 - http://migre.me/mWReW

Computação Gráfica – OpenGl


Página 8 Prof. Jorge Cavalcanti - Parte 05
15/02/2018
Primitivas 3D no OpenGL
Esferas
void glutSolidSphere(GLdouble radius, GLdouble slices, GLdouble stack )
void glutWireSphere(GLdouble radius, GLdouble slices, GLdouble stack)
Cubos
void glutSolidCube (GLdouble size )
void glutWireCube (GLdouble size)

Cones
void glutSolidCone(GLdouble base, GLdouble height, Glint slices, Glint stacks)
void glutWireCone(GLdouble base, GLdouble height, Glint slices, Glint stacks)

Torus
void glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, Glint nsides, Glint rings)
void glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, Glint nsides, Glint rings)

Computação Gráfica – OpenGl


Página 9 Prof. Jorge Cavalcanti - Parte 05
15/02/2018
Primitivas 3D no OpenGL
• Os parâmetros slices e stacks que aparecem no
protótipo de algumas funções, significam,
respectivamente, o número de subdivisões em torno
do eixo z (como se fossem linhas longitudinais) e o
número de subdivisões ao longo do eixo z (como
se fossem linhas latitudinais).
– Já rings e nsides correspondem, respectivamente, ao
número de seções que serão usadas para formar o torus, e
ao número de subdivisões para cada seção.
– Ver Exemplo padrão do Dev C++ (Criar um projeto novo do
tipo multimídia, glut).

Computação Gráfica – OpenGl


Página 10 Prof. Jorge Cavalcanti - Parte 05
15/02/2018
Primitivas 3D no OpenGL
Dodecaedro FIGURA Tetraedro FIGURA

void
glutSolidDodecahedron void
() glutSolidTetrahedron()

void void
glutWireDodecahedron glutWireTetrahedron()
()

Icosaedro FIGURA Teapot FIGURA

void void glutSolidTeapot


glutSolidIcosahedron() (GLdouble size);

void void glutWireTeapot


glutWireIcosahedron() (GLdouble size);

Computação Gráfica – OpenGl


Página 11 Prof. Jorge Cavalcanti - Parte 05
15/02/2018
Z-Buffer
Z-buffer
• Buffers são áreas reservadas de memória utilizadas para
determinados propósitos.
• Em aplicações de animação, por exemplo, o double-buffer permite
que as sucessivas renderizações sejam feitas de modo suave, sem
o efeito indesejável de piscar entre cada atualização da janela de
visualização.
• O z-buffer é bastante comum em aplicações gráficas e é utilizado
para calcular a distância do observador e remover superfícies ou
partes ocultas de objetos sobrepostos.

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)

Computação Gráfica – OpenGl


Página 12 Prof. Jorge Cavalcanti - Parte 05
15/02/2018

Você também pode gostar