===================================================================================================================

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