//==================================================================
// Projeto: Batalha Naval
// Por: Renata Corrêa - Silmara Pedretti Gomes
// Versão: 0.3
// Disciplina: IA725 - Profa. Ting
// Julho/2004
//==================================================================
//tamanho de posições que ocupam
#define SUBMARINO 3
#define BARCO 2
#define NAVIO 4
#define txId_Mar 0
#define txId_Tecido 1
#define txId_Metal1 2
#define txId_Metal2 3
#define txId_Madeira 4
#define txId_MetalEncaixe 5
#define txId_Bomba 6
#define txId_Prata 7
GLuint barco;
GLuint submarino;
GLuint navio;
GLuint texture_id[8];
void MontaChao();
int EhDia=1;
void CuboUnitario();
//---------------------------------------------------------------------------
/*Esta função irá construir o modelo
geométrico da bomba, usada para marcar o
local onde o usuário acertar os navios - */
void constroe_bomba(int x, int y)
{
/*esfera da bomba*/
glPushMatrix();
glColor3f(1,0,0.1);
glTranslatef(9-(2*y),-2,9-(2*x));
//textura - início - SP
glBindTexture ( GL_TEXTURE_2D, texture_id[txId_MetalEncaixe]
);
GLUquadricObj* q = gluNewQuadric ( );
gluQuadricTexture ( q, GL_TRUE );
glScalef(1.0,1.0,1.0);
gluSphere ( q, 0.6, 10, 8);
glBindTexture ( GL_TEXTURE_2D, 0 );
gluDeleteQuadric ( q ); //textura - fim - SP
glPopMatrix();
//cilindro - detalhe da bomba
glPushMatrix();
glTranslatef(9-(2*y), -1.7,9-(2*x));
glRotatef(90, 0.0, 1.0, 0.0); //rotacionando 90 graus
em y
glRotatef(270, 1.0, 0.0, 0.0); //rotacionando 270 graus
em x
gluCylinder(gluNewQuadric(), 0.1, 0.1, 0.1, 5, 3); //subdivisões
ao redor do eixo z, subdivisões ao longo do eixo
z
glPopMatrix();
}
void desenha_tabuleiro(void){
// Modelando o chão
glPushMatrix();
glColor3f(0.0f,1.0f,1.0f);
glTranslatef(0,-1.98,0.0);
GLfloat Line = -10;
int Grid;
glBegin(GL_LINES);
for(Grid = 0; Grid <= 20; Grid += 2)
{
glVertex3f(Line + Grid, 0, -10);
glVertex3f(Line + Grid, 0, 10);
glVertex3f(-10, 0, Line + Grid);
glVertex3f(10, 0, Line + Grid);
}
glEnd();
glPopMatrix();
glPushMatrix();
MontaChao();
glPopMatrix();
}
//---------------------------------------------------------------------------
/*Esta função irá construir o modelo
geométrico do submarino*/
void constroe_submarino(int intPosx, int intPosy)
{
float x;
/*inicia a composicao do submarino */
submarino = glGenLists(0);
glNewList(submarino, GL_COMPILE);
glPushMatrix();
glColor3f(0.5,0.6,0.5);
//Formação da posição y
if (intPosx >= 0 && intPosx <= 2)
x = 5.9 - (2*intPosx);
else if (intPosx == 3)
x = -0.9;
else if (intPosx > 3)
x = -7.9+(2*(7-intPosx));
glTranslatef(8.75-(2*intPosy), -1.5, x);
//textura - início - SP
glBindTexture ( GL_TEXTURE_2D, texture_id[txId_Metal1]
);
GLUquadricObj* q = gluNewQuadric ( );
gluQuadricTexture ( q, GL_TRUE );
/* corpo */
gluCylinder(q, 0.5, 0.5, 3, 12, 3); //raio base, raio
topo, altura, slices, stacks
/* corpo */
//gluCylinder(gluNewQuadric(), 0.5, 0.5, 3, 12, 3); //raio
base, raio topo, altura, slices, stacks
//nariz do submarino
glTranslatef(0,0,3);
gluSphere ( q, 0.49, 10, 8);
//glutSolidSphere(0.49,10, 8);
//final do corpo do submarino
glTranslatef(0,0,-2.98);
glPushMatrix();
glScalef(1,1,2.0);
//base para cauda (cone)
glTranslatef(0,0,-0.41);
gluCylinder(q, 0.2, 0.5, 0.4, 12, 3); //raio base, raio
topo, altura, slices, stacks
glPopMatrix();
//Finalizando a textura SP
glBindTexture ( GL_TEXTURE_2D, 0 );
//asa frontal
glPushMatrix();
glTranslatef(-0.8,0.0,2.5);
glRotatef(90, 0.0,1.0,0.0);
glScalef(1.2,0.5,1);
gluCylinder(gluNewQuadric(), 0.1, 0.1, 1.6, 12, 3); //raio
base, raio topo, altura, slices, stacks
glPopMatrix();
//asa da cauda - vertical
glTranslatef(0,0,-0.65);
glBegin(GL_POLYGON);
glVertex3f(0.0,0.8,0.0);
glVertex3f(0.0,0.8,-0.1);
glVertex3f(0.0,0.0,0.0);
glVertex3f(0.0,0.0,0.3);
glEnd();
//asa da cauda - horizontal
glTranslatef(0,0,0);
glBegin(GL_TRIANGLES);
glVertex3f(0.7,0.0,0);
glVertex3f(-0.7,0.0,0);
glVertex3f(0.0,0.0,0.7);
glEnd();
//tampa do cilindro - (arredondado)
glPushMatrix();
glColor3f(0.2,0.21,0.2);
glTranslatef(0,0.65,1.0);
glScalef(0.4,0.4,1.0);
gluSphere ( q, 0.4, 20, 20); //SP
//glutSolidSphere(0.4,20, 20);
glPopMatrix();
//Ativando novamente a textura SP
glBindTexture ( GL_TEXTURE_2D, texture_id[txId_Metal1]
);
glColor3f(0.5,0.6,0.5);
// cilindro superior
glTranslatef(0,0.45,1.0);
glRotatef(240, 1.0, 1.0, 1.0);
glPushMatrix();
glScalef(1.2,0.8,1);
gluCylinder(q, 0.4, 0.3, 0.3, 20, 10); //SP raio base,
raio topo, altura, slices, stacks
glPopMatrix();
//Fechamento final //SP
glPushMatrix();
glTranslatef(-1.15,0,-0.45);
glScalef(0.25,1,1);
gluSphere ( q, 0.2, 20, 20); //SP
glPopMatrix();
glPushMatrix();
gluDeleteQuadric ( q ); //quadrico - fim - SP
//Iluminação da janela do submarino
GLfloat especularidade[4]={0.0,0.0,0.0,1.0}; //capacidade
de brilho do material
if (EhDia == 0)
{
especularidade [0] = 2.0;
especularidade [1] = 1.0;
especularidade [2] = 1.0;
}
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION, especularidade);
//----------
//Cor das janelas
glColor3f(0,0.8,0.6);
//Janelas Laterias
glPushMatrix();
//Lado Esquerdo
glRotatef(90, 1.0, 0.0, 0.0);
glTranslatef(0.4, -0.37, 0.50);
//glScalef(1.8,1,1);
glutSolidTorus(0.03,0.03,2.5,150);
glTranslatef(0.2, 0.0, 0.0);
glutSolidTorus(0.03,0.03,2.5,150);
glTranslatef(0.2, 0.0, 0.0);
glutSolidTorus(0.03,0.03,2.5,150);
glTranslatef(0.2, 0.0, 0.0);
glutSolidTorus(0.03,0.03,2.5,150);
glTranslatef(0.2, 0.0, 0.0);
glutSolidTorus(0.03,0.03,2.5,150);
glPopMatrix();
//Janelas lado direito
glPushMatrix();
glTranslatef(0.0, 1.0, 0.00);
glColor3f(0,0.0,1);
glRotatef(90, 1.0, 0.0, 0.0);
glTranslatef(0.4, -0.37, 0.50);
//glScalef(1.8,1,1);
glutSolidTorus(0.03,0.03,2.5,150);
glTranslatef(0.2, 0.0, 0.0);
glutSolidTorus(0.03,0.03,2.5,150);
glTranslatef(0.2, 0.0, 0.0);
glutSolidTorus(0.03,0.03,2.5,150);
glTranslatef(0.2, 0.0, 0.0);
glutSolidTorus(0.03,0.03,2.5,150);
glTranslatef(0.2, 0.0, 0.0);
glutSolidTorus(0.03,0.03,2.5,150);
glPopMatrix();
//fim dos objetos a serem iluminados a noite
glPopMatrix();
//Voltando a especularidade para não ficar tudo
branco
especularidade [0] = 0.0;
especularidade [1] = 0.0;
especularidade [2] = 0.0;
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION, especularidade);
glPopMatrix();
/* termina a composicao do submarino*/
glEndList();
}
//---------------------------------------------------------------------------
/*Esta função irá construir o modelo
geométrico do barco - */
void constroe_barco(int intPosx, int intPosy)
{
// inicia a composicao do submarino
barco = glGenLists(0);
glNewList(barco, GL_COMPILE);
glPushMatrix();
glColor3f(0.5,0.5,0.8);
glRotatef(-90, 1.0, 0.0, 0.0);
glRotatef(90, 0.0, 0.0, 1.0);
//para movimentar em y e em x, soma sempre 2 em -8.95
e -9.5 respectivamente
glTranslatef(-9.5+(2*intPosx),-8.95+(2*intPosy),-2.85);
glBindTexture ( GL_TEXTURE_2D, texture_id[txId_Prata]
);
//Parede Lateral Esquerda
glPushMatrix();
glTranslatef(-1,0.5,2);
glRotatef(90, 0.0, 1.0, 0.0);
glRotatef(90, 1.0, 0.0, 0.0);
glRotatef(-20, 0.0, 1.0, 0.0);
glScalef(1.5, 5.0, 1.0);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f (0.25, 0.25, 0.0);
glTexCoord2f(0.0f, 1.0f); glVertex3f (0.75, 0.35, 0.0);
glTexCoord2f(1.0f, 1.0f); glVertex3f (0.75, 0.65, 0.0);
glTexCoord2f(1.0f, 0.0f); glVertex3f (0.25, 0.75, 0.0);
glEnd();
glPopMatrix();
//Parede Lateral Direita
glPushMatrix();
glTranslatef(-1.0, -0.8, 2.0);
glRotatef(90, 0.0, 1.0, 0.0);
glRotatef(90, 1.0, 0.0, 0.0);
glRotatef(20, 0.0, 1.0, 0.0);
glScalef(1.5, 5.0, 1.0);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f (0.25, 0.25, 0.0);
glTexCoord2f(0.0f, 1.0f); glVertex3f (0.75, 0.35, 0.0);
glTexCoord2f(1.0f, 1.0f); glVertex3f (0.75, 0.65, 0.0);
glTexCoord2f(1.0f, 0.0f); glVertex3f (0.25, 0.75, 0.0);
glEnd();
glPopMatrix();
//Parede Topo
glPushMatrix();
glBindTexture ( GL_TEXTURE_2D, texture_id[txId_Metal2]
);
glTranslatef(4.0, -1.2, 1.65);
glRotatef(90, 0.0, 0.0, 1.0);
glScalef(2.1, 5.0, 1.0);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f (0.25, 0.25, 0.0);
glTexCoord2f(0.0f, 1.0f); glVertex3f (0.75, 0.25, 0.0);
glTexCoord2f(1.0f, 1.0f); glVertex3f (0.75, 0.75, 0.0);
glTexCoord2f(1.0f, 0.0f); glVertex3f (0.25, 0.75, 0.0);
glEnd();
glPopMatrix();
//Parede fundo
glPushMatrix();
glBindTexture ( GL_TEXTURE_2D, texture_id[txId_Prata]
);
glTranslatef(3.0, -0.68, 0.94);
glRotatef(90, 0.0, 0.0, 1.0);
glScalef(1.05, 3.0, 1.0);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f (0.25, 0.25, 0.0);
glTexCoord2f(0.0f, 1.0f); glVertex3f (0.75, 0.25, 0.0);
glTexCoord2f(1.0f, 1.0f); glVertex3f (0.75, 0.75, 0.0);
glTexCoord2f(1.0f, 0.0f); glVertex3f (0.25, 0.75, 0.0);
glEnd();
glPopMatrix();
//Parede Frente
glPushMatrix();
glTranslatef(1.75, -0.68, 0.21);
glRotatef(-55.0, 0.0, 35.0, 1.0);
glRotatef(1.0, 1.0, 0.0, 1.0);
glScalef(1.20, 1.2, 1.0);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f (1.46, 0.01, 0.0);
glTexCoord2f(0.0f, 1.0f); glVertex3f (0.74, 0.23, 0.0);
glTexCoord2f(1.0f, 1.0f); glVertex3f (0.74, 0.68, 0.0);
glTexCoord2f(1.0f, 0.0f); glVertex3f (1.46, 0.91, 0.0);
glEnd();
glPopMatrix();
//Parede fundo
glPushMatrix();
glTranslatef(1.25, -0.68, 0.22);
glRotatef(-125.5, 0.0, 35.0, 1.0);
glRotatef(1.0, 0.0, 0.0, 1.0);
glRotatef(2.0, 1.0, 0.0, 0.0);
glScalef(1.20, 1.15, 1.0);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f (1.46, 0.01, 0.0);
glTexCoord2f(0.0f, 1.0f); glVertex3f (0.74, 0.23, 0.0);
glTexCoord2f(1.0f, 1.0f); glVertex3f (0.74, 0.68, 0.0);
glTexCoord2f(1.0f, 0.0f); glVertex3f (1.46, 0.91, 0.0);
glEnd();
glPopMatrix();
//Cabine
glPushMatrix();
glTranslatef(1.0, -0.15, 1.9);
glScalef(-1.5, 1.0, 0.8);
glutSolidCube(0.7);
glPopMatrix();
//Chaminé
glPushMatrix();
glBindTexture ( GL_TEXTURE_2D, texture_id[txId_MetalEncaixe]
);
GLUquadricObj* q = gluNewQuadric ( );
gluQuadricTexture ( q, GL_TRUE );
glTranslatef(1.0, -0.15, 2.15);
gluCylinder(q, 0.1, 0.1, 0.5, 12, 3); //raio base, raio
topo, altura, slices, stacks
glBindTexture ( GL_TEXTURE_2D, 0 );
gluDeleteQuadric ( q ); //textura - fim - SP
glPopMatrix();
glPushMatrix();
//Iluminação da janela do barco
GLfloat especularidade[4]={0.0,0.0,0.0,1.0}; //capacidade
de brilho do material
if (EhDia == 0)
{
especularidade [0] = 2.0;
especularidade [1] = 1.0;
especularidade [2] = 1.0;
}
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION, especularidade);
//----------
//janela frontal
glPushMatrix();
glColor3f(0,0.2,0.9); //azul claro da janela
glScalef(0.5, 2.2, 1.9);
glTranslatef(3.0, -0.07, 1.02);
glutSolidCube(0.2);
glPopMatrix();
//janelas laterais
glPushMatrix();
glColor3f(0,0.2,0.9);
glRotatef(90, 0.0, 0.0, 1.0);
glScalef(7.5, 3.2, 2.9);
glTranslatef(-0.021, -0.25, 0.68);
glutSolidCube(0.1);
glPopMatrix();
//Porta
glPushMatrix();
glColor3f(0,0.2,0.9);
glRotatef(90, 0.0, 0.0, 1.0);
glScalef(0.45, 3.0, 4.5);
glTranslatef(0.45, -0.42, 0.42);
glutSolidCube(0.1);
glPopMatrix();
glPopMatrix();
//Voltando a especularidade para não ficar tudo
branco
especularidade [0] = 0.0;
especularidade [1] = 0.0;
especularidade [2] = 0.0;
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION, especularidade);
glPopMatrix();
// termina a composicao do barco
glEndList();
}
//---------------------------------------------------------------------------
/*Esta função irá construir o modelo
geométrico do navio*/
void constroe_navio(int intPosx, int intPosy){
// inicia a composicao do navio
navio = glGenLists(0);
glNewList(navio, GL_COMPILE);
glPushMatrix();
glColor3f(0.8,0.8,0.8);
//Posicionando na coordenada
glTranslatef(9-(2*intPosy),-2,8.5-(2*intPosx));
glRotatef(90,0.0, 1.0, 0.0);
glRotatef(-90, 0.0, 0.0, 1.0);
glTranslatef(-0.8,0,0); //deixando um pouco do casco imerso...
glScalef(1,1.15,1);
glPushMatrix();
//Escolhendo a textura SP
glBindTexture ( GL_TEXTURE_2D, texture_id[txId_Metal1]
);
//bico
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 0.0f);glVertex3f (0.0, -1.0, 0.0);
//vértices textura - início SP
glTexCoord2f(1.0f, 1.0f);glVertex3f (1.0, 0.3, 0.0);
glTexCoord2f(0.0f, 1.0f);glVertex3f (1, 0.5, -0.5);
glTexCoord2f(0.0f, 0.0f);glVertex3f (0, 0.5, -0.5); //vértices
textura - fim
glEnd();
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 0.0f);glVertex3f (0.0, -1.0, 0.0);
glTexCoord2f(1.0f, 1.0f);glVertex3f (1.0, 0.3, 0.0);
glTexCoord2f(0.0f, 1.0f);glVertex3f (1, 0.5, 0.5);
glTexCoord2f(0.0f, 0.0f);glVertex3f (0, 0.5, 0.5);
glEnd();
//lateral
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 0.0f);glVertex3f (0.3, 3.0, 0.5);
glTexCoord2f(0.0f, 0.0f);glVertex3f (0.0, 0.5, 0.5);
glTexCoord2f(0.0f, 1.0f);glVertex3f (1.0, 0.5, 0.5);
glTexCoord2f(1.0f, 1.0f);glVertex3f (1.0, 3.0, 0.5);
glEnd();
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 0.0f);glVertex3f (0.3, 3.0, -0.5);
glTexCoord2f(0.0f, 0.0f);glVertex3f (0.0, 0.5, -0.5);
glTexCoord2f(0.0f, 1.0f);glVertex3f (1.0, 0.5, -0.5);
glTexCoord2f(1.0f, 1.0f);glVertex3f (1.0, 3.0, -0.5);
glEnd();
glBindTexture ( GL_TEXTURE_2D, 0);
//'chão'
glBindTexture ( GL_TEXTURE_2D, texture_id[txId_Metal2]
);
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 0.0f);glVertex3f (1.0, 3.0, -0.5);
glTexCoord2f(0.0f, 0.0f);glVertex3f (1.0, 0.5, -0.5);
glTexCoord2f(0.0f, 1.0f);glVertex3f (1.0, 0.5, 0.5);
glTexCoord2f(1.0f, 1.0f);glVertex3f (1.0, 3.0, 0.5);
glEnd();
//sobe
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 0.0f);glVertex3f (1.0, 3.0, -0.5);
//1
glTexCoord2f(0.0f, 0.0f);glVertex3f (0.7, 5.0, -0.5);
//2
glTexCoord2f(0.0f, 1.0f);glVertex3f (0.7, 5.0, 0.5); //3
glTexCoord2f(1.0f, 1.0f);glVertex3f (1.0, 3.0, 0.5); //4
glEnd();
glBindTexture ( GL_TEXTURE_2D, texture_id[txId_Metal1]
);
//fechamento lateral 1 (final)
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f);glVertex3f (1.0, 3.0, 0.5);
glTexCoord2f(0.0f, 0.0f);glVertex3f (0.3, 3.0, 0.5);
glTexCoord2f(1.0f, 0.0f);glVertex3f (0.4, 5.0, 0.5);
glTexCoord2f(1.0f, 1.0f);glVertex3f (0.7, 5.0, 0.5);
glEnd();
//fechamento lateral 2 (final)
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f);glVertex3f (1.0, 3.0, -0.5);
glTexCoord2f(0.0f, 0.0f);glVertex3f (0.3, 3.0, -0.5);
glTexCoord2f(1.0f, 0.0f);glVertex3f (0.4, 5.0, -0.5);
glTexCoord2f(1.0f, 1.0f);glVertex3f (0.7, 5.0, -0.5);
glEnd();
glBindTexture ( GL_TEXTURE_2D, texture_id[txId_Metal2]
);
//Plano traseiro
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);glVertex3f (0.5, 0.5, -0.5);
//1
glTexCoord2f(0.0f, 1.0f);glVertex3f (0.5, 5.0, -0.5);
//2
glTexCoord2f(1.0f, 1.0f);glVertex3f (0.5, 5.0, 0.5); //3
glTexCoord2f(1.0f, 0.0f);glVertex3f (0.5, 0.5, 0.5); //4
glEnd();
//fechamento traseiro
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);glVertex3f (0.7, 5.0, -0.5);
//2
glTexCoord2f(0.0f, 1.0f);glVertex3f (0.5, 5.0, -0.5);
//4
glTexCoord2f(1.0f, 1.0f);glVertex3f (0.5, 5.0, 0.5); //1
glTexCoord2f(1.0f, 0.0f);glVertex3f (0.7, 5.0, 0.5); //1
glEnd();
glBindTexture( GL_TEXTURE_2D, 0 ); // desabilitando textura
SP
//cabine
glPushMatrix();
glColor3f(1.0,0.0,0.0);
glBindTexture ( GL_TEXTURE_2D, texture_id[txId_Metal1]
);
//glColor3f(1.0,0.0,0.0);
glTranslatef(-0.1, 1.50, -0.45);
glScalef(0.6, 2, 0.9);
CuboUnitario();
glBindTexture ( GL_TEXTURE_2D, 0 );
glPopMatrix();
glPopMatrix();
//cabine menor
glPushMatrix();
glColor3f(0.8,0.3,0.3);
glTranslatef(-0.5, 1.6, -0.4);
glScalef(0.45, 0.8, 0.8);
glBindTexture ( GL_TEXTURE_2D, texture_id[txId_Prata]
);
CuboUnitario();
glBindTexture ( GL_TEXTURE_2D, 0 );
glPopMatrix();
glColor3f(0.0,0.2,0.8); //azul da janela
glPushMatrix();
//glColor3f(0,0.2,0.8);
//Iluminação da janela do navio
GLfloat especularidade[4]={0.0,0.0,0.0,1.0}; //capacidade
de brilho do material
if (EhDia == 0)
{
especularidade [0] = 2.0;
especularidade [1] = 1.0;
especularidade [2] = 1.0;
}
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION, especularidade);
//janela frontal
glPushMatrix();
glTranslatef(0, -0.02, 0);
glBegin(GL_QUADS);
glColor3f(0.0,0.0,1.0); //azul da janela
glVertex3f (-0.15, 1.61, -0.35);
glVertex3f (-0.40, 1.61, -0.35);
glColor3f(0.5,0.5,0.9); //azul claro da janela
glVertex3f (-0.40, 1.61, 0.30);
glVertex3f (-0.15, 1.61, 0.30);
glEnd();
glPopMatrix();
glPopMatrix();
//janelinhas laterais
glPushMatrix();
glTranslatef(-0.3, 1.8, 0.4);
glutSolidTorus(0.05,0.04,5,10);
glTranslatef(0, 0, -0.8);
glutSolidTorus(0.05,0.04,5,10);
glTranslatef(0, 0.21, 0);
glutSolidTorus(0.05,0.04,5,10);
glTranslatef(0, 0, 0.8);
glutSolidTorus(0.05,0.04,5,10);
glTranslatef(0, 0.21, 0);
glutSolidTorus(0.05,0.04,5,10);
glTranslatef(0, 0, -0.8);
glutSolidTorus(0.05,0.04,5,10);
glPopMatrix();
//Luz sobre a torre
glPushMatrix();
glColor3f(1.0,0.0,0.0);
glTranslatef(-1.4, 3.15, 0);
glutSolidSphere(0.03,8,8);
glPopMatrix();
//Voltando a especularidade para não ficar tudo
branco
especularidade [0] = 0.0;
especularidade [1] = 0.0;
especularidade [2] = 0.0;
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION, especularidade);
//Bóia
glPushMatrix();
glColor3f(1.0,0.5,0.0);
glTranslatef(0.25, 3.56, 0);
glScalef(0.5,0.5,0.5);
glRotatef(90, 1, 0,0);
glutSolidTorus(0.10,0.20,5,10);
glRotatef(-90, 1, 0,0);
glPopMatrix();
//torre da antena
glPushMatrix();
glColor3f(0.2,0.2,0.2);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glTranslatef(0, 0, 0);
glBegin(GL_QUADS);
glVertex3f (-0.1, 3.00, -0.2);
glVertex3f (-1.3, 3.05, -0.1); //sup.esq.
glVertex3f (-1.3, 3.20, -0.1); //up. dir.
glVertex3f (-0.1, 3.25, -0.2);
glEnd();
glBegin(GL_QUADS);
glVertex3f (-0.1, 3.00, 0.2);
glVertex3f (-1.3, 3.05, 0.1);
glVertex3f (-1.3, 3.20, 0.1);
glVertex3f (-0.1, 3.25, 0.2);
glEnd();
glBegin(GL_QUADS);
glVertex3f (-0.1, 3.00, -0.2);
glVertex3f (-1.3, 3.05, -0.1);
glVertex3f (-1.3, 3.05, 0.1);
glVertex3f (-0.1, 3.00, 0.2);
glEnd();
glBegin(GL_QUADS);
glVertex3f (-0.1, 3.25, -0.2);
glVertex3f (-1.3, 3.20, -0.1);
glVertex3f (-1.3, 3.20, 0.1);
glVertex3f (-0.1, 3.25, 0.2);
glEnd();
//triângulo do topo + antena final
glBegin(GL_TRIANGLE_FAN);
glVertex3f (-1.4, 3.15, 0);
glVertex3f (-1.3, 3.05, -0.1);
glVertex3f (-1.3, 3.05, 0.1);
glVertex3f (-1.3, 3.20, -0.1);
glVertex3f (-1.3, 3.20, 0.1);
glEnd();
glBegin(GL_LINES);
glVertex3f (-1.4, 3.15, 0);
glVertex3f (-1.55, 3.15, 0);
glEnd();
//fios que atravessam o topo da antena
glBegin(GL_LINES);
glVertex3f (-1.2, 3.05, -0.3);
glVertex3f (-1.2, 3.05, 0.3);
glVertex3f (-1.1, 3.05, -0.3);
glVertex3f (-1.1, 3.05, 0.3);
glVertex3f (-1.2, 3.20, -0.3);
glVertex3f (-1.2, 3.20, 0.3);
glVertex3f (-1.1, 3.20, -0.3);
glVertex3f (-1.1, 3.20, 0.3);
glEnd();
//linhas do corpo da antena ('Z' dentro da antena)
glBegin(GL_LINES);
glVertex3f (-0.1, 3.00, -0.2);
glVertex3f (-0.4, 3.23, -0.18);
glVertex3f (-0.4, 3.23, -0.18);
glVertex3f (-0.4, 3.02, -0.18);
glVertex3f (-0.4, 3.02, -0.18);
glVertex3f (-0.7, 3.21, -0.15);
glVertex3f (-0.7, 3.21, -0.15);
glVertex3f (-0.7, 3.02, -0.15);
glVertex3f (-0.7, 3.02, -0.15);
glVertex3f (-1.0, 3.21, -0.13);
glVertex3f (-1.0, 3.21, -0.13);
glVertex3f (-1.0, 3.02, -0.13);
glVertex3f (-1.0, 3.02, -0.13);
glVertex3f (-1.3, 3.21, -0.1);
glVertex3f (-1.3, 3.21, -0.1);
glVertex3f (-1.3, 3.02, -0.1);
//'Z' da face 2
glVertex3f (-0.1, 3.00, 0.2);
glVertex3f (-0.4, 3.23, 0.18);
glVertex3f (-0.4, 3.23, 0.18);
glVertex3f (-0.4, 3.02, 0.18);
glVertex3f (-0.4, 3.02, 0.18);
glVertex3f (-0.7, 3.21, 0.15);
glVertex3f (-0.7, 3.21, 0.15);
glVertex3f (-0.7, 3.02, 0.15);
glVertex3f (-0.7, 3.02, 0.15);
glVertex3f (-1.0, 3.21, 0.13);
glVertex3f (-1.0, 3.21, 0.13);
glVertex3f (-1.0, 3.02, 0.13);
glVertex3f (-1.0, 3.02, 0.13);
glVertex3f (-1.3, 3.21, 0.1);
glVertex3f (-1.3, 3.21, 0.1);
glVertex3f (-1.3, 3.02, 0.1);
//retas das outras duas faces da antena
glVertex3f (-0.4, 3.02, -0.18);
glVertex3f (-0.4, 3.02, 0.18);
glVertex3f (-0.7, 3.02, -0.18);
glVertex3f (-0.7, 3.02, 0.18);
glVertex3f (-1.0, 3.02, -0.18);
glVertex3f (-1.0, 3.02, 0.18);
glVertex3f (-0.4, 3.21, -0.18);
glVertex3f (-0.4, 3.21, 0.18);
glVertex3f (-0.7, 3.21, -0.18);
glVertex3f (-0.7, 3.21, 0.18);
glVertex3f (-1.0, 3.21, -0.18);
glVertex3f (-1.0, 3.21, 0.18);
glEnd();
glPopMatrix();
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
//Voltando a especularidade para não ficar tudo
branco
/* especularidade [0] = 0.0;
especularidade [1] = 0.0;
especularidade [2] = 0.0;
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION, especularidade);*/
glPopMatrix();
// termina a composicao do navio
glEndList();
}
//---------------------------------------------------------------------------
/*Esta função irá construir o modelo
geométrico da bandeira, usada para marcar o
local onde o usuário errar os navios - */
void constroe_bandeira(int x, int y)
{
//array de pontos da grid que formará a onda
float pontos[45][45][3];
int i, j;
glPushMatrix();
glTranslatef(9.7-(2*y),0.0,9.7-(2*x));
//mastro da bandeira
glPushMatrix();
glColor3f(0.5,0.5,0.3);
glRotatef(90,1.0,0.0,0.0);
//textura - início - SP
glBindTexture ( GL_TEXTURE_2D, texture_id[txId_Madeira]
);
GLUquadricObj* q = gluNewQuadric ( );
gluQuadricTexture ( q, GL_TRUE );
gluCylinder(q, 0.1, 0.1, 2.0, 12, 3); //raio base, raio
topo, altura, slices, stacks
glBindTexture ( GL_TEXTURE_2D, 0 );
gluDeleteQuadric ( q ); //textura - fim - SP
glPopMatrix();
//bandeira
glPushMatrix();
glColor3f(1,1,1);
glScalef(0.5,0.5,0.5);
glRotatef(-90,0.0,1.0,0.0); //rotacionando no sentido
horário em y
glTranslatef(2.3,2.5,0.8);
for(i=0; i<45; i++) // Loop em x
{
for(j=0; j<45; j++) // Loop em y
{
//Gerando os pontos da malha
pontos[i][j][0] = float((i/5.0f)-4.5f);
pontos[i][j][1] = float((j/5.0f)-4.5f);
pontos[i][j][2] = float(sin((((i+2/1.0f)*40.0f)/360.0f)*3.141592654*1.2f));
}
}
glBindTexture ( GL_TEXTURE_2D, texture_id[txId_Tecido]
); //SP
glBegin(GL_QUADS);
//gerando os quadrados utilizando os pontos gerados
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
glTexCoord2f(1.0f, 0.0f); //SP
glVertex3f(pontos[i][j][0], pontos[i][j][1], pontos[i][j][2]);
glTexCoord2f(1.0f, 1.0f); //SP
glVertex3f(pontos[i][j+1][0], pontos[i][j+1][1], pontos[i][j+1][2]);
glTexCoord2f(0.0f, 1.0f); //SP
glVertex3f(pontos[i+1][j+1][0], pontos[i+1][j+1][1], pontos[i+1][j+1][2]);
glTexCoord2f(0.0f, 0.0f); //SP
glVertex3f(pontos[i+1][j][0], pontos[i+1][j][1], pontos[i+1][j][2]);
}
}
glEnd();
glPopMatrix();
glBindTexture ( GL_TEXTURE_2D, 0 ); //SP
glPopMatrix();
}
void CuboUnitario(void){
glPushMatrix();
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 0.0f, 1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 0.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 0.0f, 0.0f, 0.0f);
glEnd();
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, 0.0f, 0.0f);
glEnd();
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 0.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 0.0f, 0.0f, 1.0f);
glEnd();
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 0.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 0.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 0.0f, 0.0f, 0.0f);
glEnd();
glBegin(GL_QUADS); //tampa superior
glTexCoord2f(0.0f, 1.0f); glVertex3f( 0.0f, 1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 0.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
glEnd();
glBegin(GL_QUADS); //tampa inferior
glTexCoord2f(0.0f, 1.0f); glVertex3f( 0.0f, 0.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 0.0f, 0.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 0.0f, 1.0f, 0.0f);
glEnd();
glPopMatrix();
}
//---------------------------------------------------------------------------
|