Debut d'un moteur3d open gl (utilisant glut)

Soyez le premier à donner votre avis sur cette source.

Vue 5 692 fois - Téléchargée 438 fois

Description

Soyer indulgent je debute ! :-)

Compiler avec Visual C++ 6

Source / Exemple :


//******************************************
// Moteur 3d Opengl par Dufour Christophe **
//******************************************

#include <stdio.h>
#include <GL/glut.h>
#include <math.h>

#define	PI	3.1415926535898

//***************************
// Prototype des fonctions  *
//***************************

void Init();
void Display();
void Reshape(int w, int h);
void Clavier(unsigned char key, int x, int y);

int LoadBMP(char *File);

double a=0,b=-5,angle=0;	// Pour la mise au point camera (mouvement)

GLuint		Mur,Sol;

//***************************
// Programme Principal      *
//***************************

int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
	glutInitWindowSize(800, 600);
	glutCreateWindow("Moteur 3D");
	Init();
	glutDisplayFunc(Display);
	glutReshapeFunc(Reshape);
	glutKeyboardFunc(Clavier);
 	glutMainLoop();
	return 0;
}

//***************************
// Definition des fonctions *
//***************************

////////////////////////////////////////////////////////
//LoadBMP : charge une image 24bpp
#define EXIT {fclose(fichier);return -1;}
#define CTOI(C) (*(int*)&C)	//récupère en int un nombre pointé par un char*

int LoadBMP(char *File)
{
	unsigned char	*Data;
	FILE			*fichier;
	unsigned char	Header[0x36];
	GLuint			DataPos,DataSize;
	GLint			Components;
	GLsizei			Width,Height;
	GLenum			Format,Type;
	GLuint			Name[1];
	
//Lit le fichier et son header
	fichier = fopen(File,"rb");if (!fichier) return -1;
	if (fread(Header,1,0x36,fichier)!=0x36) EXIT;
	if (Header[0]!='B' || Header[1]!='M')	EXIT;
	if (CTOI(Header[0x1E])!=0)				EXIT;
	if (CTOI(Header[0x1C])!=24)				EXIT;

//Récupère les infos du fichier
	DataPos			= CTOI(Header[0x0A]);
	DataSize		= CTOI(Header[0x22]);
//Récupère les infos de l'image
	Width			= CTOI(Header[0x12]);
	Height			= CTOI(Header[0x16]);	
	Type = GL_UNSIGNED_BYTE;
	Format = GL_RGB;
	Components = 3;
	
	//!!!!
	if (DataSize==0) DataSize=Width*Height*Components;
	if (DataPos==0)  DataPos=0x36;

//Charge l'image
	fseek(fichier,DataPos,0);
	Data = new unsigned char[DataSize];
	if (!Data) EXIT;

	if (fread(Data,1,DataSize,fichier)!=DataSize) 
	{
		delete Data;
		fclose(fichier);
		return -1;
	}
	
	fclose(fichier);

//Inverse R et B
	unsigned char t;
	for (int x=0;x<Width*Height;x++) 
	{
		t=Data[x*3];
		Data[x*3]=Data[x*3+2];
		Data[x*3+2]=t;
	}

//Envoie la texture à OpenGL
	glPixelStorei(GL_UNPACK_ALIGNMENT,1);
	glGenTextures(1, Name);
	glBindTexture(GL_TEXTURE_2D, Name[0]);
	
	
	glTexImage2D
	( 	
		GL_TEXTURE_2D, 	//target
		0,				//mipmap level
		Components,		//nb couleurs
		Width,			//largeur
		Height,			//hauteur
		0,			 	//largeur du bord
		Format,			//type des couleurs
		Type,			//codage de chaque composante
		Data			//Image
	); 
	
	return Name[0];
}

///////////////////////////

void Init()
{
	glClearColor(0.0,0.0,0.0, 0.0);
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_COLOR);
	glEnable(GL_TEXTURE_2D);
} 

void Display()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	
	gluLookAt(a, 6, b, a+(sin(angle)), 6, b+(cos(angle)), 0.0, 1.0, 0.0); // point de vue visé grace a l'angle

	
	Mur = LoadBMP("Texture.bmp");
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
	
	/*glRotated(a,0,1,0);
	glRotated(b,1,0,0);	
	a+=2;
	b+=1.6;

  • /
glBegin(GL_QUADS); glColor3d(1,0,0);glVertex3i(1,5,1); glColor3d(0,1,0);glVertex3i(1,3,1); glColor3d(0,0,1);glVertex3i(-1,3,1); glColor3d(1,0,1);glVertex3i(-1,5,1); glColor3d(1,1,0);glVertex3i(1,5,-1); glColor3d(0,1,1);glVertex3i(1,3,-1); glColor3d(1,0,0);glVertex3i(-1,3,-1); glColor3d(1,1,1);glVertex3i(-1,5,-1); glColor3d(1,0,0);glVertex3i(1,5,1); glColor3d(0,1,0);glVertex3i(1,3,1); glColor3d(0,1,1);glVertex3i(1,3,-1); glColor3d(1,1,0);glVertex3i(1,5,-1); glColor3d(1,0,1);glVertex3i(-1,5,1); glColor3d(0,0,1);glVertex3i(-1,3,1); glColor3d(1,0,0);glVertex3i(-1,3,-1); glColor3d(1,1,1);glVertex3i(-1,5,-1); glColor3d(1,1,1);glVertex3i(-1,5,-1); glColor3d(1,0,1);glVertex3i(-1,5,1); glColor3d(1,0,0);glVertex3i(1,5,1); glColor3d(1,1,0);glVertex3i(1,5,-1); glColor3d(1,0,0);glVertex3i(-1,3,-1); glColor3d(0,0,1);glVertex3i(-1,3,1); glColor3d(0,1,0);glVertex3i(1,3,1); glColor3d(0,1,1);glVertex3i(1,3,-1); glEnd(); // Dessin de la scene /*glBegin(GL_QUADS); // 1ere face glColor3d(1,0,0); glVertex3i(0,2,0); glVertex3i(1,2,0); glVertex3i(1,3,0); glVertex3i(0,3,0); //2eme face glColor3d(0,1,0); glVertex3i(0,3,0); glVertex3i(0,3,1); glVertex3i(1,3,1); glVertex3i(1,3,0); //3eme face glColor3d(0,0,1); glVertex3i(1,3,0); glVertex3i(1,3,1); glVertex3i(1,2,1); glVertex3i(1,2,0); //4eme face glColor3d(1,0,1); glVertex3i(0,2,0); glVertex3i(0,2,1); glVertex3i(1,2,1); glVertex3i(1,2,0); //5eme face glColor3d(1,1,0); glVertex3i(0,2,1); glVertex3i(0,3,1); glVertex3i(1,3,1); glVertex3i(1,2,1); //6eme face glColor3d(0,1,1); glVertex3i(0,2,0); glVertex3i(0,3,0); glVertex3i(0,3,1); glVertex3i(0,2,1);
  • /
glBegin(GL_QUADS); // Les 4 murs glColor3d(0.5,0.5,0.5); glTexCoord2i(0,0);glVertex3i(-30,0,-30); glTexCoord2i(5,0);glVertex3i(-30,0,30); glTexCoord2i(5,5);glVertex3i(-30,30,30); glTexCoord2i(0,5);glVertex3i(-30,30,-30); glTexCoord2i(0,0);glVertex3i(-30,0,30); glTexCoord2i(5,0);glVertex3i(30,0,30); glTexCoord2i(5,5);glVertex3i(30,30,30); glTexCoord2i(0,5);glVertex3i(-30,30,30); glTexCoord2i(0,0);glVertex3i(30,0,30); glTexCoord2i(5,0);glVertex3i(30,0,-30); glTexCoord2i(5,5);glVertex3i(30,30,-30); glTexCoord2i(0,5);glVertex3i(30,30,30); glTexCoord2i(0,0);glVertex3i(-30,0,-30); glTexCoord2i(5,0);glVertex3i(30,0,-30); glTexCoord2i(5,5);glVertex3i(30,30,-30); glTexCoord2i(0,5);glVertex3i(-30,30,-30); glEnd(); Sol = LoadBMP("Sol.bmp"); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glBegin(GL_QUADS); // Le sol glColor3d(0.5,0.5,0.5); glTexCoord2i(0,0);glVertex3i(-50,0,-50); glTexCoord2i(5,0);glVertex3i(-50,0,50); glTexCoord2i(5,5);glVertex3i(50,0,50); glTexCoord2i(0,5);glVertex3i(50,0,-50); glEnd(); glutSwapBuffers(); glutPostRedisplay(); } void Reshape(int w, int h) { glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Vide la matrice gluPerspective(45,float(w)/float(h),0.01,100); glMatrixMode(GL_MODELVIEW); // Pour revenir toujours a ModelView } void Clavier(unsigned char key, int x, int y) { // sin et cos marche pas en degré mais en radian // marche avant if (key==27) exit(0); // Touche echap if (key=='t') { a=a-0.3*cos((PI/2)+angle); // D'apres trigo : x=-1*cos a b=b+0.3*sin((PI/2)+angle); // D'apres trigo : y=1*sin a } // marche arriere if (key=='g') { a=a+0.3*cos((PI/2)+angle); // Inverse de marche avant b=b-0.3*sin((PI/2)+angle); } // tourner a gauche if (key=='f') { angle=angle+PI/60; // Angle permet de calculer sin et cos du point de visé } // tourner a droite if (key=='h') { angle=angle-PI/60; } }

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
20
Date d'inscription
vendredi 12 mars 2004
Statut
Membre
Dernière intervention
11 novembre 2005

Oui, on ne recharge pas les bmp sinon on a un fps minable, on le charge on uli attribut un index avec la fonction qui va et on le bind quand on a besoin.
Messages postés
20
Date d'inscription
vendredi 12 mars 2004
Statut
Membre
Dernière intervention
11 novembre 2005

Oui, on ne recharge pas les bmp sinon on a un fps minable, on le charge on uli attribut un index avec la fonction qui va et on le bind quand on a besoin.
Messages postés
85
Date d'inscription
jeudi 7 février 2002
Statut
Membre
Dernière intervention
8 février 2007

bon je voudrais pas etre mauvaise langue mais c'est bien beau tout ca le lblabla sur tel ou tel language

mais le fait qu'il charge a chaque frame la texture ca vous choque pas?
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

Environnement de Développement Intégré
Integrated Development Environment

Kif kif bouriko.

"Si on prend le compilateur de VB (Pascal ou je ne sais quoi)"

Pascal, à ma connaissance du moins, c'est un langage de programmation, pas un compilateur VB.

"DevC++ et OpenGl s'est moin bon en Fps que avec vc++7 avec DirectX et opengl"

Mais c'est ce que je viens de dire dans mon message: tu mets ce que tu veux comme compilo avec ce que tu veux comme EDI/IDE, ça ne tient qu'à toi (et à ton budget). Dev-C++ ça n'a jamais compilo le moindre code-source, ça ne fait qu'appeler le compilo que tu lui indiques. Aucun rapport quoi.
Messages postés
156
Date d'inscription
mardi 17 décembre 2002
Statut
Membre
Dernière intervention
23 novembre 2011

??? déja pas EDI mais IDE tu voulais surment dire.
Et se que je voulais dire est que l'on peu choisir n'importe quelle language le plus important est le compilateur.
Si on prend le compilateur de VB (Pascal ou je ne sais quoi) il sera assez performant pour de petite application, petit utilitaire, mais souvent les petits jeunes l'oubli et se tape des moteurs 3D en VB résultat les jeux tourn a 25 Fps au lieux de 60 a 70 fps.
Vc++ 6 ou 7 non pas le même compilateur ni devc++ ni bc++ ... Il sont spécifique a chacun, je ne suis pas un pro des compilateurs mais se que j'en est retenu s'est qu'avec DevC++ et OpenGl s'est moin bon en Fps que avec vc++7 avec DirectX et opengl voila mon avis, après tous le monde prend se qu'il veu comme il veu !
Thyraël
Afficher les 12 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.