Hi,
I’m doing a project in OpenGL and i’m having some problems… I’m trying to implement a texture (“Textura.bmp”) nd every time I run the program the texture doesn’t appear… why !!! Please Help Me !! Here goes the code:
#include <windows.h>
#include <gl/glut.h>
//#include <Fstream.h> esta incluido em textura.h
#include <math.h>
#include “textura.h”
#ifndef M_PI
#define M_PI 3.14159265
#endif
#define heightMnt 450
#define lenghtYmnt 62
#define lenghtXmnt 62
#define stepXmnt 96.0
#define stepYmnt 96.0
#define WIDTH 640
#define HEIGHT 480
#define FOV 85
#define OBSSTARTX 300
#define OBSSTARTY 400
#define OBSSTARTZ 150
static char frbuf[80];
static float alpha=75.0;
static float beta=90.0;
static float teta=0.0;
static float v=0.0;
static int poutline=0;
static int joyavailable=0;
static int usetex=1;
static int help=1;
static int fog=1;
static int bfcull=1;
static int joyactive=0;
static float obs[3]={OBSSTARTX,OBSSTARTY,OBSSTARTZ};
static float dir[3],v1[2],v2[2];
static float eyex, eyey,eyez;
static float scale = 1.;
static int scrwidth=WIDTH;
static int scrheight=HEIGHT;
int is_depth;
//Chamada de X vector de pixeis
RGBpixmap pix[1];
//Controlo e cálculo da posição da câmera
static void calcposobs(void)
{
float alpha1,alpha2;
dir[0]=sin(alpha*M_PI/180.0);
dir[1]=cos(alpha*M_PI/180.0)*sin(beta*M_PI/180.0);
dir[2]=cos(beta*M_PI/180.0);
alpha1=alpha+FOV/2.0;
v1[0]=sin(alpha1*M_PI/180.0);
v1[1]=cos(alpha1*M_PI/180.0);
alpha2=alpha-FOV/2.0;
v2[0]=sin(alpha2*M_PI/180.0);
v2[1]=cos(alpha2*M_PI/180.0);
obs[0]+=v*dir[0];
obs[1]+=v*dir[1];
obs[2]+=v*dir[2];
//Controlo da câmera em torno do eixo dos ZZ (circulo)
//Para obter uma elipse com centro em ZZ acrescentar +100 ... em ambos os membros
teta+=1;
eyex=(400+v)*cos((alpha)*M_PI/180.0);
eyey=(400+v)*sin((alpha)*M_PI/180.0);
eyez=100+beta; //para manter somente dar uma constante
if(obs[1]<0.0)
obs[1]=0.0;
}
//Refresca a imagem a cada momento
static void reshape( int width, int height )
{
scrwidth=width;
scrheight=height;
glViewport(0, 0, (GLint)width, (GLint)height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(50.0, ((GLfloat) width/(GLfloat)height), lenghtXmntstepYmnt0.01,
lenghtXmntstepYmnt0.7);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
//Escreve uma string com o tipo de letra desejado- para ver o tipo de letras ver o file glut.h
static void printstring(void *font, char *string)
{
int len,i;
len=(int)strlen(string);
for(i=0;i<len;i++)
glutBitmapCharacter(font,string[i]);
}
//Escreve o texto inicial com tipo de letra desejado
static void printhelp(void)
{
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glColor4f(0.3,0.3,0.3,0.0);
glRecti(40,40,600,440);
glDisable(GL_BLEND);
glColor3f(0.0,0.0,0.0);
glRasterPos2i(300,400);
printstring(GLUT_BITMAP_TIMES_ROMAN_24,“AJUDA”);
glRasterPos2i(70,350);
printstring(GLUT_BITMAP_TIMES_ROMAN_24,“H - Ajuda (Ligar/Desligar)”);
glRasterPos2i(70,300);
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"S - Sair ");
glRasterPos2i(70,250);
printstring(GLUT_BITMAP_TIMES_ROMAN_24,“C - Chao (Ligar/Desligar)”);
glRasterPos2i(70,200);
printstring(GLUT_BITMAP_TIMES_ROMAN_24,“A - Aproximar”);
glRasterPos2i(70,150);
printstring(GLUT_BITMAP_TIMES_ROMAN_24,“Z - Afastar”);
glRasterPos2i(70,100);
printstring(GLUT_BITMAP_TIMES_ROMAN_24,“Setas - Mudar camera”);
}
//Inicializa o diplay de boiças e dispoe as texturas
void boicasInit(void){
glClearColor(0.4f,0.4f,1.0f,0.0f); //fundo azul
//glColor3f(0.0f,0.0f,0.0f);
//glPointSize(4.0);
//glLineWidth(2.0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
pix[0].readBMPFile("c:\\Telhado.bmp");
pix[0].setTexture(2001);
glViewport(0,0,640,480);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
}
//Futuramente deverá ser o desenho do terreno
void drawTerrainBoicas(void)
{
}
//Constroi paredes com a largura e posição desejadas
void wall(double largura, double x, double y, double z)
{
glPushMatrix();
glTranslated(x, y, z);
glScaled(1.0, largura, 1.0);
glutSolidCube(50.0);
glPopMatrix();
}
int gl_define_forma(char gl_define[20])
{
if (strcmp("*GL_POINTS",gl_define) == 0)
return 0x0000;
if (strcmp("*GL_LINES",gl_define) == 0)
return 0x0001;
if (strcmp("*GL_TRIANGLES",gl_define) == 0)
return 0x0004;
if (strcmp("*GL_QUADS",gl_define) == 0)
return 0x0007;
if (strcmp("*GL_POLYGON",gl_define) == 0)
return 0x0009;
}
void drawPontosBoicas(char * fileName)
{
fstream inStream;
inStream.open(fileName, ios ::in);
if(inStream.fail())
return;
glClear(GL_COLOR_BUFFER_BIT);
GLdouble numpolys, numLines,r, g, b, x, y, z;
char n_des[100];
char gl_define[20];
inStream >> numpolys;
for(int j=0; j<numpolys; j++)
{
inStream >> n_des;
inStream >> gl_define;
inStream >> numLines;
glBegin(gl_define_forma(gl_define));
for (int i = 0; i<numLines; i++)
{
inStream >> r>> g>> b>> x >> y >> z;
glColor3f(r,g,b);
glVertex3d(x,y,z);
}
glEnd();
}
inStream.close();
}
//Desenho da casa - atenção às texturas
void drawCasaBoicas(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glRotated(90, 1,0,0);
glTranslated(50,50,200);
drawPontosBoicas(“data_casa.geo”);
/*
//Nebbbbbbboeêeeeiro
GLfloat FockColor[4]={1.0,1.0,1.0,1.0};
glEnable(GL_FOG);
glFogf(GL_FOG_DENSITY,0.0014);
glFogi(GL_FOG_MODE,GL_EXP2);
glFogfv(GL_FOG_COLOR,FockColor);
//Luzes
glEnable(GL_LIGHTING);
//Define
GLfloat ambientLight[] = {0.4f, 0.4f, 0.4f, 1.0f};
GLfloat diffuseLight[] = {0.7f, 0.7f, 0.7f, 1.0f};
GLfloat specular[] = {0.7f,0.7f,0.7f,1.0f};
GLfloat LightPos [] = {-707.0f, 707.0f,707.0f , 1.0f};
GLfloat specref[] = {0.6f,0.6f,0.6f,1.0f};
//Set up da Luz 0
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambientLight);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
glLightfv(GL_LIGHT0, GL_POSITION, LightPos);
//Acende
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
glMaterialfv(GL_FRONT,GL_SPECULAR,specref);
glMateriali(GL_FRONT,GL_SHININESS,32);
*/
//////////////////////////////////////////////////////////
/*
glBegin(GL_POLYGON);
glColor3f(1.0,0.0,0.0);
glVertex3f(167.842,28,-193);
glVertex3f(75,54,-193);
glVertex3f(-18.374,28,-193);
glVertex3f(75,26,-193);
glEnd();
*/
// glTranslated(50,50,300);
// glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glPushMatrix();
// Aplicação das texturas desejadas
glBindTexture(GL_TEXTURE_2D,2001);
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); // não distorce a imagem
glBegin(GL_QUADS);
glTexCoord2f(0.0,1.0); glVertex3f(75,-10.416,-193); // 6 (1,0,1)
glTexCoord2f(1.0,1.0); glVertex3f(75,-10.416,-293); // 7 (1,1,1)
glTexCoord2f(1.0,0.0); glVertex3f(137,-32.816,-293); // 2 (1,1,0)
glTexCoord2f(0.0,0.0); glVertex3f(137,-32.816,-193); // 1 (1,0,0)
glEnd();
//eixos coordenados para ajuda de orientação
//glTranslated(0,0,0);
/* glBegin(GL_LINES);
glColor3f(1, 0, 0);
glVertex3d(0,0,0);
glVertex3d(1000,0,0);
glVertex3d(0,0,0);
glVertex3d(0,0,1000);
glVertex3d(0,0,0);
glVertex3d(0,1000,0);
glEnd();
*/
/*glPushMatrix();
glColor3f(1,0,0.7);
glTranslated(50,50,200);
glutSolidSphere(30,30,30);
glPopMatrix();
*/
// wall(0.3, 30, 30, 30);
/* glPushMatrix();
glColor3f(1, 1, 0.7);
glTranslated(50, 50, 50);
glutSolidCube(100);
glPopMatrix();
*/
////////////////////////////////////////////////////////////
/*
glPushMatrix();
glTranslated(1.5,0,-193);
glRotated(90,1,0,0);
GLUquadricObj * qobj;
qobj = gluNewQuadric();
gluQuadricDrawStyle(qobj,GLU_LINE);
gluCylinder(qobj,12.5,12.5,26,40,40);
glPopMatrix();
*/
glFlush();
// glPopMatrix();
// glutSwapBuffers(); // não sei o que é
}
//Comandos de visualização e chamada das funções para desenhar o terreno e a casa
void displayBoicas(void)
{
/* glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-200.0, 200.0, -200.0, 200.0, 400, -400);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// gluLookAt(2 , 3, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
*/
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
if(usetex)
glEnable(GL_TEXTURE_2D);
else
glDisable(GL_TEXTURE_2D);
/*
if(fog)
glEnable(GL_FOG);
else
glDisable(GL_FOG);
*/
// glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
calcposobs();
/*gluLookAt(300,400,150,
0,0,0,
0.0,0.0,1.0); // vista sem rotações
/*gluLookAt(obs[0],obs[1],obs[2],
dir[0]*10,dir[1]*10,dir[2]*10,
0.0,0.0,1.0); // atenção que o view plane estava em Y e passou para z
gluLookAt(obs[0],obs[1],obs[2],
obs[0]+dir[0],obs[1]+dir[1],obs[2]+dir[2],
0.0,0.0,1.0); // este é a melhor rotação mas primeiro tem de se recuar com z
gluLookAt(obs[0],obs[1],obs[2],
0,0,0,
0.0,0.0,1.0); // rotação em torno do lado esquerdo da casa - não se deve mexer nas arrow keys (só para outras persrpectivas) só em a e z
*/
gluLookAt(eyex,eyey,eyez,
-20,-20,-100,
0.0,0.0,1.0); // rotação em torno dos ZZ funciona com up e down key
/* gluLookAt(obs[0],obs[1],obs[2],
obs[0]+dir[0],obs[1]+dir[1],obs[2]+dir[2],
0.0,0.0,1.0); // este é a melhor rotação mas primeiro tem de se recuar com z
glColor3d(0,0,0);
*/
/*
//Luzes
GLfloat mat_ambient[] = {0.7f, 0.7f, 0.7f, 1.0f};
GLfloat mat_diffuse[] = {0.6f, 0.6f, 0.6f, 1.0f};
GLfloat mat_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};
GLfloat mat_shininess[] = {50.0f};
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
GLfloat lightIntensity[] = {0.7f, 0.7f, 0.7f, 1.0f};
GLfloat light_position[] = {2.0f, 6.0f, 3.0f, 0.0f};
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightIntensity);
GLfloat light_position[] = {200.0f,200.0f, 300.0f, 1.0f};
// glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
/////
*/
drawTerrainBoicas();
drawCasaBoicas();
glDisable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glDisable(GL_FOG);
glShadeModel(GL_FLAT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-0.5,639.5,-0.5,479.5,-1.0,1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor3f(0.0,0.0,0.0);
glRasterPos2i(10,10);
printstring(GLUT_BITMAP_HELVETICA_18,frbuf);
glRasterPos2i(320,10);
printstring(GLUT_BITMAP_HELVETICA_10,"Boicas Written by Miguel Nunes e Tiago Silva (macx@clix.pt)");
if(help)
printhelp();
reshape(scrwidth,scrheight);
glutSwapBuffers();
}
/* Teclas de opções */
static void key(unsigned char k, int x, int y)
{
switch (k) {
case ‘s’:
exit(0);
break;
case ‘a’:
v-=5;
break;
case ‘z’:
v+=5;
break;
case ‘c’:
if(poutline) {
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
poutline=0;
} else {
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
poutline=1;
}
break;
case ‘j’:
joyactive=(!joyactive);
break;
case ‘h’:
help=(!help);
break;
case ‘f’:
fog=(!fog);
break;
case ‘t’:
usetex=(!usetex);
break;
case ‘b’:
if(bfcull) {
glDisable(GL_CULL_FACE);
bfcull=0;
} else {
glEnable(GL_CULL_FACE);
bfcull=1;
}
break;
}
}
/* Teclas de controlo da camara */
static void special(int k, int x, int y)
{
switch(k) {
case GLUT_KEY_LEFT:
alpha-=3.0;
break;
case GLUT_KEY_RIGHT:
alpha+=3.0;
break;
case GLUT_KEY_DOWN:
beta-=6.0;
break;
case GLUT_KEY_UP:
beta+=6.0;
break;
}
}
int main(int argc, char** argv){
glutInitWindowPosition(100,150);
glutInitWindowSize(WIDTH,HEIGHT);
glutInit(&argc, argv);
//glutInitDisplayMode(GLUT_RGB|GLUT_DEPTH|GLUT_DOUBLE);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutCreateWindow("Boiças");
boicasInit();
glutReshapeFunc(reshape);
glutDisplayFunc(displayBoicas);
glutKeyboardFunc(key);
glutSpecialFunc(special);
glutIdleFunc(displayBoicas);
/*
//Luzes
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glEnable(GL_NORMALIZE);
*/
glutMainLoop();
return 0; /* ANSI C requires main to return int. */
}
Thank YOU a lot,
Pedro Silva
P.S.: All the comments are in Portuguese…