Este programa desenha numa janela com fundo branco, de dimensões 256x256 pixels, um quadrado vermelho, com vértice superior esquerdo de coordenadas (x,y)=(30, 226) e vértice inferior direito de coordenadas (x,y) = (226, 30). Quando a tecla a (keycode=97) for pressionada, o quadrado deverá ficar com a cor azul. Quando a tecla v (keycode=118) for pressionada, o quadrado deverá voltar à cor vermelha. Quando a tecla ESC (keycode=27) for pressionada o programa deverá ser finalizado.
Solução:
quadrado.cpp
#include
#define AZUL 0.0, 0.0, 1.0
#define VERMELHO 1.0, 0.0, 0.0
void init(void);
void display(void);
void quadradoVermelho();
void quadradoAzul();
void keyboard(unsigned char key, int x, int y);
int main(int argc, char** argv){
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (256, 256);
glutInitWindowPosition (100, 100);
glutCreateWindow ("Desenhando um Quadrado");
init();
gluOrtho2D(250.0f, 250.0f, 250.0f, 250.0f);
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
void init(void){
glClearColor(1.0, 1.0, 1.0, 1.0);
glOrtho (0, 256, 0, 256, -1 ,1);
}
void display(void){
quadradoVermelho();
glFlush();
}
void keyboard(unsigned char key, int x, int y){
switch (key) {
case 27:
exit(0);
break;
case 97:
quadradoAzul();
break;
case 118:
quadradoVermelho();
break;
}
glFlush();
}
void quadradoAzul(void){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f (AZUL);
glBegin(GL_QUADS);
glVertex2i( 30,226);
glVertex2i( 30, 30);
glVertex2i(226, 30);
glVertex2i(226,226);
glEnd();
}
void quadradoVermelho(void){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f (VERMELHO);
glBegin(GL_QUADS);
glVertex2i( 30,226);
glVertex2i( 30, 30);
glVertex2i(226, 30);
glVertex2i(226,226);
glEnd();
}
Desenhe duas linhas que representem os eixos cartesianos do universo, acrescentando os quatro vértices necessários para o desenho dos eixos);Desenhe duas linhas que representem os eixos cartesianos do universo, acrescentando os quatro vértices necessários para o desenho dos eixos;Desenhe duas linhas que representem os eixos cartesianos do universo acrescentando os quatro vértices necessários para o desenho dos eixo. Desenhe um triângulo e um quadrado, que devem ser definidos de maneira a formar uma casinha, como mostra a figura abaixo:
Inclua teclas especiais com as seguintes funções:
a. rotacionar o objeto para esquerda cada vez o usuário pressiona a tecla Page Up.
b. rotacionar o objeto para direita cada vez o usuário pressiona a tecla Page Down.
c. aumentar o tamanho do objeto cada vez que o usuário pressionar o botão esquerdo do mouse.
d. diminuir o tamanho do objeto cada vez que o usuário pressionar o botão direito do mouse.
e. transladar o objeto para cima, para baixo, para a esquerda e para a direita sempre que o usuário pressionar cada uma das teclas de setas.
Solução
#include <glut.h>
GLint tx, ty, angulo;
GLfloat ex, ey;
// Função callback chamada para fazer o desenho
void Desenha(void)
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// Limpa a janela de visualização com a cor de fundo especificada
glClear(GL_COLOR_BUFFER_BIT);
// Desenha eixos cartesianos
glBegin(GL_LINES);
glColor3f(1.1f, 1.1f, 1.1f);
glLineWidth(1.0f);
glVertex2f(-600,0);
glVertex2f(600,0);
glVertex2f(0,-600);
glVertex2f(0,600);
glEnd();
// Especifica que a cor corrente é vermelha
// R G B
glColor3f(1.0f, 0.0f, 0.0f);
// Desenha um quadrado preenchido com a cor corrente
glLineWidth(3);
glTranslatef(tx, ty, 0);
glScalef(ex, ey, 1);
glRotatef(angulo,0,0,1);
glBegin(GL_TRIANGLES);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex2i(50,100);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex2i(100,150);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex2i(150,100);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex2i(50,1);
glVertex2i(50,99);
glVertex2i(150,99);
glVertex2i(150,1);
glEnd();
// Executa os comandos OpenGL
glFlush();
}
// Inicializa parâmetros de rendering
void Inicializa (void)
{
tx= 0;
ty= 0;
angulo= 0;
ex= 1;
ey= 1;
// Define a cor de fundo da janela de visualização como preta
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}
// Função callback chamada quando o tamanho da janela é alterado
void AlteraTamanhoJanela(GLsizei w, GLsizei h)
{
// Evita a divisao por zero
if(h == 0) h = 1;
// Especifica as dimensões da Viewport
glViewport(0, 0, w, h);
// Inicializa o sistema de coordenadas
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Estabelece a janela de seleção (left, right, bottom, top)
if (w <= h)
// gluOrtho2D (0.0f, 250.0f, 0.0f, 250.0f*h/w);
// else
// gluOrtho2D (0.0f, 250.0f*w/h, 0.0f, 250.0f);
gluOrtho2D(-250.0f, 250.0f, -250.0f, 250.0f);
}
void TeclasEspeciais(int key, int x, int y)
{
switch (key)
{
case GLUT_KEY_PAGE_UP:
angulo++;
break;
case GLUT_KEY_PAGE_DOWN:
angulo--;
break;
case GLUT_KEY_UP:
ty++;
break;
case GLUT_KEY_DOWN:
ty--;
break;
case GLUT_KEY_LEFT:
tx--;
break;
case GLUT_KEY_RIGHT:
tx++;
break;
}
glutPostRedisplay();
}
void Clique_Mouse(int b,int state,int x, int y)
{
switch(b)
{
case GLUT_LEFT_BUTTON:
ex= ex + 0.1;
ey= ey + 0.1; //ey++;
break;
case GLUT_RIGHT_BUTTON:
ex= ex - 0.1;
ey= ey - 0.1;
break;
}
glutPostRedisplay();
}
// Programa Principal
int main(void)
{
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(600,600);
glutInitWindowPosition(10,10);
glutCreateWindow("Quadrado");
glutDisplayFunc(Desenha);
glutReshapeFunc(AlteraTamanhoJanela);
glutSpecialFunc(TeclasEspeciais);
glutMouseFunc(Clique_Mouse);
Inicializa();
glutMainLoop();
}
Programa que mostra um objeto hierárquico, as transformações aplicadas na base do objeto são propagadas para as outras partes, há uma composição das transformações geométricas. Deve ser aplicada uma escala somente na base, pois os "braços" foram modelados com um tamanho maior que a base.
Implementar o zoom, quando clicar com o botão direito do mouse, e decrementar quando clicar com o botão esquerdo.
Criar menu para que o usuário possa trocar a cor da borboleta. Devem existir duas opções de cores.
A execução do programa deverá ser igual a figura abaixo:
Solução:
#include <glut.h>
#include <stdio.h>
// variáveis para zoom do objeto e cores da borboleta.
GLfloat win, r, g, b;
// Declaração das variáveis de translação.
GLfloat txObj, txBorboleta;
// Declaração das Variáveis usadas nos braços.
GLfloat braco1, braco2;
// Declara e Inicializa variável que determina o tamanho da borboleta.
GLsizei tamanhoBorboleta = 1;
// Tamanho do incremento na direção x a cada intervalo de tempo.
GLfloat moveXPassos = 0.8;
// Declaração de Variáveis responsáveis pela Largura e Altura da janela.
GLfloat LarguraJ;
GLfloat AlturaJ;
//Função que desenha a borboleta.
void DesenhaBorboleta()
{
glLineWidth(2);
glBegin(GL_LINE_LOOP);
glVertex2f( 0.5, 1.0);
glVertex2f( 0.5,-1.0);
glVertex2f(-0.5, 1.0);
glVertex2f(-0.5,-1.0);
glEnd();
}
//Função que desenha o braço1.
void DesenhaBraco()
{
glLineWidth(2);
glBegin(GL_LINE_LOOP);
glVertex2f( 1.0, 4.6);
glVertex2f( 1.0,-0.8);
glVertex2f(-1.0,-0.8);
glVertex2f(-1.0, 4.6);
glEnd();
glPointSize(2);
glBegin(GL_POINTS);
glVertex2i(0,0);
glEnd();
}
//Função desenha braço2.
void DesenhaBraco2()
{
glLineWidth(2);
glBegin(GL_LINE_LOOP);
glVertex2f( 1.0, 4.6);
glVertex2f( 1.0,-0.8);
glVertex2f(-1.0,-0.8);
glVertex2f(-1.0, 4.6);
glEnd();
glPointSize(2);
glBegin(GL_POINTS);
glVertex2i(0,0);
glEnd();
}
// Função que desenha a base.
void DesenhaBase()
{
glLineWidth(2);
glBegin(GL_LINE_LOOP);
glVertex2f( 1.5, 1);
glVertex2f( 1.5,-1.5);
glVertex2f( 1.0,-1.5);
glVertex2f( 1.0,-1);
glVertex2f(-1.0,-1);
glVertex2f(-1.0,-1.5);
glVertex2f(-1.5,-1.5);
glVertex2f(-1.5, 1);
glEnd();
}
//Função desenha piso.
void DesenhaPiso()
{
glLineWidth(4);
glBegin(GL_LINES);
glColor3f(0.0, 0.7, 0.0);
glVertex2f(-400.0, -4.8);
glVertex2f( 400.0, -4.8);
glEnd();
}
// Função para executar as inicializações.
void Inicializa(void)
{
// Cor Azul
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
r = 1.0;
g = 0.0;
b = 1.0;
win = 20;
txObj = 0;
braco1 = 0;
braco2 = 270;
txBorboleta = 0;
printf(" Setas para esquerda e para direita movimentam a base (vermelha).");
printf("
Home e End rotacionam o braco 1 (verde).");
printf("
PageUP e PageDn rotacionam o braco 2 (azul).");
printf("
Botoes direito para aumentar zoom.");
printf("
Botoes esquerdo para diminuir zoom.");
printf("
Botao de scroll do mouse exibe menu com opcoes de cor da borboleta.");
}
// Callback chamada quando o tamanho da janela é alterado
void AlteraTamanhoJanela(GLsizei w, GLsizei h)
{
// Especifica o tamanho da Viewport
glViewport(0, 0, w, h);
// Inicializa o sistema de coordenadas
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Estabelece a janela de seleção (left, right, bottom, top)
if (w <= h)
{
AlturaJ = win*h/w;
LarguraJ = win;
}
else
{
LarguraJ = win*w/h;
AlturaJ = win;
}
// Estabelece o volume de visualização (left, right, bottom, top)
gluOrtho2D(-win, LarguraJ, -win, AlturaJ);
}
// Callback chamada de acordo com um "idle"
void Timer(int value)
{
// Muda a direção da borboleta antes de chegar a borda esquerda ou direita
if(txBorboleta > LarguraJ-tamanhoBorboleta-7 || txBorboleta < -15)
moveXPassos = -moveXPassos;
/* Verifica as bordas. Se a window for menor e a
borboleta sair do volume de visualização */
if(txBorboleta > LarguraJ-tamanhoBorboleta)
txBorboleta = LarguraJ-tamanhoBorboleta-1;
// Movimenta borboleta
txBorboleta += moveXPassos;
glutPostRedisplay();
glutTimerFunc(120,Timer, 1);
}
// Callback chamada quando as teclas especiais são pressionadas
void TeclasEspeciais(int key, int x, int y)
{
// Move a base
if(key == GLUT_KEY_LEFT)
txObj--;
if(key == GLUT_KEY_RIGHT)
txObj++;
// Rotaciona braco1
if(key == GLUT_KEY_HOME)
braco1-=2;
if(key == GLUT_KEY_END)
braco1+=2;
// Rotaciona braco2
if(key == GLUT_KEY_PAGE_UP)
braco2-=2;
if(key == GLUT_KEY_PAGE_DOWN)
braco2+=2;
glutPostRedisplay();
}
// Controla as opções de cor do menu.
void MenuTrocaCorBorboleta(int opcao)
{
switch(opcao) {
case 0:
r = 0.0; // verde
g = 1.0;
b = 0.0;
break;
case 1:
r = 1.0; //vermelho
g = 0.0;
b = 0.0;
break;
/* case 2:
r = 0.0; // azul
g = 0.0;
b = 1.0;
break; */
}
glutPostRedisplay();
}
// Cria o menu com opções de cores para a borboleta.
void MenuOpcoes()
{
int menu;
menu = glutCreateMenu(MenuTrocaCorBorboleta);
glutAddMenuEntry("Verde",0);
glutAddMenuEntry("Vermelho",1);
//glutAddMenuEntry("Azul",2);
glutAttachMenu(GLUT_MIDDLE_BUTTON);
}
// Função callback chamada para gerenciar eventos do mouse.
void GerenciaMouse(int button, int state, int x, int y)
{
// Zoom out
if (button == GLUT_LEFT_BUTTON)
{
if (state == GLUT_DOWN)
win--;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D (-win, win, -win, win);
}
// Zoom in
if (button == GLUT_RIGHT_BUTTON)
{
if (state == GLUT_DOWN)
win++;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D (-win, win, -win, win);
}
//opções do Menu
if (button == GLUT_MIDDLE_BUTTON)
{
if (state == GLUT_DOWN)
MenuOpcoes();
}
glutPostRedisplay();
}
// Callback chamada para fazer o desenho
void Desenha(void)
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT);
// Borboleta
glPushMatrix();
glColor3f(r, g, b);
glTranslatef(txBorboleta,15.0,1.0);
DesenhaBorboleta();
glPopMatrix();
// Objeto
glPushMatrix();
glTranslatef(txObj,0.0,0.0);
// Braços
glPushMatrix();
glRotatef(braco1, 0.0, 0.0, 1.0);
// Braço 2
glPushMatrix();
glColor3f(0.0, 0.0, 1.0);
glTranslatef(0.1, 2.8, 0.0);
glRotatef(braco2, 0.0, 0.0, 1.0);
DesenhaBraco2();
glPopMatrix();
// Braço 1
glPushMatrix();
glColor3f(0.0, 1.0, 0.0);
DesenhaBraco();
glPopMatrix();
glPopMatrix();
// Base
glPushMatrix();
glColor3f(1.0, 0.0, 0.0);
glTranslatef(0.0,-1.5,0.0);
glScalef(2.0,2.0,1.0);
DesenhaBase();
glPopMatrix();
glPopMatrix();
// Piso
DesenhaPiso();
//glFlush();
glutSwapBuffers();
}
// Programa principal
void main(void)
{
glutInitDisplayMode(GLUT_DOUBLE);
glutInitWindowSize(400,350);
glutInitWindowPosition(10,10);
glutCreateWindow("Trabalho1");
Inicializa();
glutDisplayFunc(Desenha);
glutReshapeFunc(AlteraTamanhoJanela);
glutSpecialFunc(TeclasEspeciais);
glutMouseFunc(GerenciaMouse);
glutTimerFunc(120, Timer, 1);
glutMainLoop();
}
Programa que realiza as transformações geométricas: translação, rotação e escala e a iluminação de em um objeto 3D.
Solução:
#include <glut.h>
#include <stdio.h>
// GLfloat fAngulo, fAspect, x_obj, y_obj, scala_obj, rotaciona_obj;
GLfloat fAngulo, scala_obj, rotaciona_obj, fAspect, x_obj, y_obj;
// Função callback chamada para fazer o desenho
void Desenha(void)
{
// Limpa a janela e o depth buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//
glColor3f(0.2f, 0.5f, 1.0f ); // azul claro
glPushMatrix();
glTranslatef(x_obj,y_obj,0.0);
glScalef(scala_obj, scala_obj,1.0);
glRotatef(rotaciona_obj, 0.0, 90.0, 1.0);
glutSolidTeapot(40.0f);
glPopMatrix();
glutSwapBuffers();
}
// Inicializa parâmetros de rendering
void Inicializa (void)
{
GLfloat luzAmbiente[4]={0.2,0.2,0.2,1.0};
// "cor"
GLfloat luzDifusa[4]={0.7,0.7,0.7,1.0};
// "brilho"
GLfloat luzEspecular[4]={1.0, 1.0, 1.0, 1.0};
GLfloat posicaoLuz[4]={0.0, 50.0, 50.0, 1.0};
// Capacidade de brilho do material
GLfloat especularidade[4]={1.0,1.0,1.0,1.0};
GLint especMaterial = 60;
// Especifica que a cor de fundo da janela será preta
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
// Habilita o modelo de colorização de Gouraud
glShadeModel(GL_SMOOTH);
// Define a refletância do material
glMaterialfv(GL_FRONT,GL_SPECULAR, especularidade);
// Define a concentração do brilho
glMateriali(GL_FRONT,GL_SHININESS,especMaterial);
// Ativa o uso da luz ambiente
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, luzAmbiente);
// Define os parâmetros da luz de número 0
glLightfv(GL_LIGHT0, GL_AMBIENT, luzAmbiente);
glLightfv(GL_LIGHT0, GL_DIFFUSE, luzDifusa );
glLightfv(GL_LIGHT0, GL_SPECULAR, luzEspecular );
glLightfv(GL_LIGHT0, GL_POSITION, posicaoLuz );
// Habilita a definição da cor do material a partir da cor corrente
glEnable(GL_COLOR_MATERIAL);
//Habilita o uso de iluminação
glEnable(GL_LIGHTING);
// Habilita a luz de número 0
glEnable(GL_LIGHT0);
// Habilita o depth-buffering
glEnable(GL_DEPTH_TEST);
fAngulo=70;
x_obj = 0.0;
y_obj = 0.0;
scala_obj = 1;
rotaciona_obj = 0.0;
printf(" [Setas] movem o objeto nos eixos (X) e (Y).");
printf("
[Home e End] aumenta ou diminui a escala.");
printf("
[PageUP e PageDn] rotacionam o objeto no eixo Y.");
}
// Função usada para especificar o volume de visualização
void EspecificaParametrosVisualizacao(void)
{
// Especifica sistema de coordenadas de projeção
glMatrixMode(GL_PROJECTION);
// Inicializa sistema de coordenadas de projeção
glLoadIdentity();
// Especifica a projeção perspectiva
gluPerspective(fAngulo,fAspect,0.4,500);
// Especifica sistema de coordenadas do modelo
glMatrixMode(GL_MODELVIEW);
// Inicializa sistema de coordenadas do modelo
glLoadIdentity();
// Especifica posição do observador e do alvo
gluLookAt(0,0,200, 0,0,0, 0,1,0);
}
// Função callback chamada quando o tamanho da janela é alterado
void AlteraTamanhoJanela(GLsizei w, GLsizei h)
{
// Para previnir uma divisão por zero
if ( h == 0 ) h = 1;
// Especifica o tamanho da viewport
glViewport(0, 0, w, h);
// Calcula a correção de aspecto
fAspect = (GLfloat)w/(GLfloat)h;
EspecificaParametrosVisualizacao();
}
// Função callback chamada para gerenciar eventos do mouse
void GerenciaMouse(int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON)
{
if (state == GLUT_DOWN)
{
// Zoom-in
if (fAngulo >= 10) fAngulo -= 5;
}
}
if (button == GLUT_RIGHT_BUTTON)
{
if (state == GLUT_DOWN)
{
// Zoom-out
if (fAngulo <= 130) fAngulo += 5;
}
}
EspecificaParametrosVisualizacao();
glutPostRedisplay();
}
// Callback chamada quando as teclas especiais são pressionadas
void TeclasEspeciais(int key, int x, int y)
{
if(key == GLUT_KEY_LEFT)
x_obj -= 2;
if(key == GLUT_KEY_RIGHT)
x_obj += 2;
if(key == GLUT_KEY_UP)
y_obj += 2;
if(key == GLUT_KEY_DOWN)
y_obj -= 2;
if(key == GLUT_KEY_HOME)
scala_obj += 0.2;
if(key == GLUT_KEY_END)
scala_obj -= 0.2;
if(key == GLUT_KEY_PAGE_UP)
rotaciona_obj-=2;
if(key == GLUT_KEY_PAGE_DOWN)
rotaciona_obj+=2;
glutPostRedisplay();
}
// Programa Principal
int main(void)
{
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(400,350);
glutCreateWindow("Bule Azul em 3D");
glutDisplayFunc(Desenha);
glutReshapeFunc(AlteraTamanhoJanela);
glutSpecialFunc(TeclasEspeciais);
glutMouseFunc(GerenciaMouse);
Inicializa();
glutMainLoop();
}