===================================================================================================================
Trabalho de Computação Gráfica
===================================================================================================================
Autora: Cláudia Maria Caixeta Bezerra
LOGOTIPO DA UNICAMP
O trabalho foi feito em Pascal no ambiente Delphi 6.0, onde foi acrescentada a biblioteca de OpenGL.
//==================================================================================================================
Algumas observações sobre o ambiente Delphi:
1- Tem-se três formas de comentários (sem valor de compilação). { }- Palavras entre chaves ficam comentadas. Para se comentar uma linha usa-se duas barras //, e, por último para se comentar várias linhas de uma só vez, coloca-se estas linhas entre (* Tudo que está sendo escrito neste momento, se estivesse no Delphi seria um comentário. *)
2- Para que se possa começar a utilização deste trabalho no Delphi é necessário que se aloque o Dispositivo de Contexto do Windows (HDC) e também o de Renderização (HGLRC), a declaração é feita desta forma:
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------
private
{ Private declarations }
FDC: HDC; //Device context
FRC: HGLRC; //Rendering Context
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------
(-) Sendo que alocasse e desalocasse o espaço em memória em duas PROCEDURES consecutivamente: no FormCreate e no FormDestroy:
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
var
PFD: PIXELFORMATDESCRIPTOR;
PixelFormat: GLuint;
begin
//Cria o device context
FDC:=GetDC(Handle);
//formato do nosso device
with pfd do
begin
nSize := SizeOF(PIXELFORMATDESCRIPTOR); //tamanho do descritor
nVersion := 1; //versão - sempre 1
dwFlags := PFD_DRAW_TO_WINDOW //Pode desenhar na janela
or PFD_SUPPORT_OPENGL //Vamos usar OpenGL
or PFD_DOUBLEBUFFER; //e double buffer.
iPixelType := PFD_TYPE_RGBA; //Formato de cor RGBA
cColorBits := 32; //usando 32 bits de cor
cDepthBits := 16; //Depth Buffer de 16 bits
end;
PixelFormat:=ChoosePixelFormat(FDC,@pfd); //Busca o formato mais próximo
SetPixelFormat(FDC, PixelFormat, @pfd); //aplica o device context
FRC := wglCreateContext(FDC); //cria o rendering context
if(FRC<>0)then //se deu certo...
wglMakeCurrent(FDC, FRC); //Diz qual o RC a ser usado
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
wglMakeCurrent(FDC, 0); //Nosso RC não é mais o principal
wglDeleteContext(FRC); //Então nos livramos deles
if(FDC<>0) then
ReleaseDC(Handle, FDC); //Liberamos então o DC
end;
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------
//=================================================================================================================
A PROCEDURE, a seguir, irá determinar como será a janela de exibição do Logotipo.
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------
procedure TForm1.FormResize(Sender: TObject);
begin
if(Height<=0)then //previne divisão por zero
Height := 1;
glViewport(0, 0, Width, Height); //Ajusta o campo de visão
glMatrixMode(GL_PROJECTION); //Muda para a matriz de Projeção
glLoadIdentity();
gluPerspective(20.0, Width/Height, 1.0, 0.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
end;
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------
Abaixo, tem-se a disposição todos as figuras e arquivos deste trabalho.
(-) A imagem original (Figura1) abre assim que o programa é rodado, mas, desejando ver a original após visualizar a imagem transformada ou 3D, é só apertar o botão ORIGINAL.
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------
procedure TForm1.Draw1;
var
vpontos:TPontos;
begin
glClearColor(1.0, 1.0, 1.0, 0.0); // Fundo Branco
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //limpa os buffers
glMatrixMode(GL_MODELVIEW); //carrega a matriz dos objetos
glLoadIdentity;
glTranslate(-2.3, -1.0, -5.0);
glColor3f(0.0,0.0,0.0);
vpontos := TPONTOS.Create;
vpontos.pontos;
SwapBuffers(FDC); //Manda a tela da memória para a janela
vpontos.Free;
end;
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------
Figura1. Imagem original
(-) A Figura 2 apresenta a imagem original, com uma visualização 3D.
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------
procedure TForm1.Draw2;
var
vpontos:TPontos;
begin
glClearColor(0.7, 0.7, 0.7, 1.0); // Fundo Cinza
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //limpa os buffers
glMatrixMode(GL_MODELVIEW); //carrega a matriz dos objetos
glLoadIdentity;
glColor3f(1.0,1.0,1.0);
glTranslatef(-2.5,-8.0,-25.0);
glRotatef(45,0.0,0.0,1.0);
glRotatef(45,0.0,6.0,0.0);
glScale(5.0,5.0,1.0);
vpontos := TPONTOS.Create;
vpontos.pontos;
SwapBuffers(FDC); //Manda a tela da memória para a janela
vpontos.Free;
end;
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------
Figura2. Figura original mostrada como representação 3D.
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------
(-) Na Figura 3, pode ser visto o que se verifica após transformações geométricas consecutivas, veja no código:
procedure TForm1.Draw3;
var
vpontos:TPontos;
begin
glPushMatrix(); // salvar as coordenadas correntes
glTranslated(0,0,0.02);
vpontos := TPONTOS.Create;
vpontos.pontos;
glTranslated(0,0,0.12);
vpontos := TPONTOS.Create;
vpontos.pontos;
glPopMatrix(); // volta para o sistema de coordenadas
vpontos := TPONTOS.Create;
vpontos.pontos;
SwapBuffers(FDC); //Manda a tela da memória para a janela
vpontos.Free;
end;
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------
Figura 3. Figura após o primeiro clique no botão TRANSFORMAÇÃO
Quando vai se clicando o botão TRANSFORMAÇÃO, vai ocorrendo transformação geométrica do Logotipo da Unicamp, como mostrado nas duas figuras a seguir (Figura 4 e 5).
Figura 4. Figura após o segundo clique no botão TRANSFORMAÇÃO
Figura 5. Figura após alguns cliques no botão TRANSFORMAÇÃO
(-) A imagem transformada, também, pode ser visualizada em 3D, para isto, é só clicar no botão TRANSFORMAÇÃO e depois no botão 3D.
Figura 6. Figura transformada e visualizada como 3D.
(-) O código para a utilização da iluminação e as figuras serão mostradas a seguir, uma combinação de botões também será explicada.
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------
procedure TForm1.Draw4;
begin
// Habilitar a determinacao de iluminacao
glEnable(GL_LIGHTING);
// Habilitar uma fonte de luz
glEnable(GL_LIGHT0);
// Habilitar o algoritmo de z-Buffer
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
// Setar a cor de fundo
glClearColor (1.0, 1.0, 1.0, 0.0);
// Definir a tonalizacao de Gouraud */
glShadeModel (GL_SMOOTH);
// Definir que somente a face frontal reflete
glMaterialfv(GL_FRONT, GL_AMBIENT, @matAmbient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, @matDiffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, @matSpecular);
glMaterialf(GL_FRONT, GL_SHININESS, matShininess);
glMaterialfv(GL_FRONT, GL_EMISSION, @matEmission);
Draw2;
glPopMatrix();
// Definir a posicao da luz
glLightfv (GL_LIGHT0, GL_POSITION, @lightPosition);
// Definir as intensidades ambiente, difusa e especular
glLightfv (GL_LIGHT0, GL_AMBIENT, @lightAmbient);
glLightfv (GL_LIGHT0, GL_DIFFUSE, @lightDiffuse);
glLightfv (GL_LIGHT0, GL_SPECULAR, @lightSpecular);
// Caso for fonte spot, definir a direcao, o expoente de decaimento e angulo
glLightfv (GL_LIGHT0, GL_SPOT_DIRECTION, @spotDirection);
glLightf (GL_LIGHT0, GL_SPOT_EXPONENT, spotExponent);
glLightf (GL_LIGHT0, GL_SPOT_CUTOFF, spotCutoff);
// Definir o fator de atenuacao da intensidade da fonte
glLightf (GL_LIGHT0, GL_CONSTANT_ATTENUATION, fatConstant);
glLightf (GL_LIGHT0, GL_LINEAR_ATTENUATION, fatLinear);
glLightf (GL_LIGHT0, GL_QUADRATIC_ATTENUATION, fatQuadratic);
glPopMatrix();
glFlush ();
SwapBuffers(FDC); //Manda a tela da memória para a janela
end;
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------
Figura 7. Imagem do Logotipo da Unicamp, conseguida com o código de iluminação (botão Iluminação).
Obs.: Para se conseguir as duas imagens a seguir (Figura 8 e 9), basta clicar no botão TRANSFORMAÇÃO, que a imagem vai movimentando, e portanto, o efeito da iluminação é modificado.
Figura 8. Após a utilização do botão Iluminação uma única vez, utiliza-se somente o botão TRANSFORMAÇÃO.
Figura 9. Continuando a usar o botão TRANSFORMAÇÃO, visualiza-se o efeito da iluminação.
Obs.: Nas Figuras 10 e 11, tem-se a combinação da iluminação com o efeito de 3D. Para se conseguir isto, tem-se os seguintes passos:
==>Clicar o botão Iluminação
==>Clicar o botão 3D (Figura 10).
==>Para se conseguir a Figura 11, repetir os passos anteriores.
Figura 10. Figura iluminada com efeito em 3D.
Figura 11. Segunda imagem de iluminação com visualização 3D.
Os códigos pertencentes as Units, o executável e também o projeto compactado estão disponíveis abaixo.
Código Código(Unit)
Vértices Vértices(Unit)
Aplicativo Pr_logotipo(exe)
Logotipo Logotipo(zip)
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------
Pg Inicial Visão Geral