gastoudou
Messages postés17Date d'inscriptionlundi 23 décembre 2002StatutMembreDernière intervention12 novembre 2004
-
23 oct. 2004 à 21:21
gastoudou
Messages postés17Date d'inscriptionlundi 23 décembre 2002StatutMembreDernière intervention12 novembre 2004
-
25 oct. 2004 à 14:41
Bonjour à tous,
Et oui encore moi pour une question, que dis-je, une mission pour une âme charitable.
Je suis en train de faire un labyrinthe en 3D style l'écran de veille de windows, mais j'ai un pb de déplacement de caméra et aussi de collisions.
Je vous lache le code. Si vous voulez y jeter un coup d'oeil, me dire ce qu'il y a à améliorer, je vous remercie franchement. Sinon, c'est pas grave, je retravaille dessus demain, pasque là, je commence à en avoir marre d'opengl...
Enfin, merci d'avance en tout cas.
...Gast...
Voici le code :
HEADER.H *********************
/** INCLUDES ***********************************************************************************/
#include<stdio.h>
#include<glut.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
/** DEFINITIONS ********************************************************************************/
#define EXIT {fclose(fichier);return -1;}
#define CTOI(C) (*(int*)&C) //récupère en int un nombre pointé par un char*
/*** CLAVIER ************************************************************************************/
void clavier(unsigned char touche, int x, int y)
/************************************************************************************************/
{
float R=sqrt(pow(poscamX-ptvueX,2)+pow(poscamY-ptvueY,2));
float tempX,tempY;
switch(touche)
{
case 'e':
// On avance
tempX=poscamX-(poscamX-ptvueX)/R;
tempY=poscamY-(poscamY-ptvueY)/R;
// on vérifie qu'on n'est pas dans un mur
if(!RechercheCoord(tempX,tempY))
{
poscamX=tempX;
poscamY=tempY;
}
break;
case 'x':
// On recule
tempX=poscamX+(poscamX-ptvueX)/R;
tempY=poscamY+(poscamY-ptvueY)/R;
// on vérifie qu'on n'est pas dans un mur
if(!RechercheCoord(tempX,tempY))
{
poscamX=tempX;
poscamY=tempY;
}
break;
case 's':
// On tourne vers la gauche
angle=angle+0.1;
ptvueX=poscamX+R*cos(angle);
ptvueY=poscamY+R*sin(angle);
break;
case 'd':
// On tourne vers la droite
angle=angle-0.1;
ptvueX=poscamX+R*cos(angle);
ptvueY=poscamY+R*sin(angle);
break;
case 9:
AfficheSoluce();
break;
case 27:
exit(0);
}
glutPostRedisplay();
}
/************************************************************************************************/
/************************************************************************************************/
void clavier_soluce(unsigned char touche, int x, int y)
/************************************************************************************************/
{
switch(touche)
{
case 9:
glutDestroyWindow(glutGetWindow());
break;
}
}
/************************************************************************************************/
//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;
}
// on charge l'image "mur" en mémoire
Nom = LoadBMP("ciel.bmp", UneTexture);
// on charge l'image "ciel" en mémoire
Nom = LoadBMP("mur.bmp", UneTexture+1);
// on charge l'image "sol" en mémoire
Nom = LoadBMP("sol.bmp", UneTexture+2);
// on récupère 3 identifiants de textures
glGenTextures(3, TextureName);
// préparation de la texture 1
glBindTexture(GL_TEXTURE_2D, TextureName[0]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
// préparation de la texture 2
glBindTexture(GL_TEXTURE_2D, TextureName[1]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
// préparation de la texture 3
glBindTexture(GL_TEXTURE_2D, TextureName[2]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
}
/************************************************************************************************/
/************************************************************************************************/
void ActiveTexture(int No)
/************************************************************************************************/
{
glTexImage2D
(
GL_TEXTURE_2D, //target
0, //mipmap level
UneTexture[No].NbCouleurs, //nb couleurs
UneTexture[No].Largeur, //largeur
UneTexture[No].Hauteur, //hauteur
0, //largeur du bord
UneTexture[No].TypeCouleurs, //type des couleurs
UneTexture[No].CodageCouleurs, //codage de chaque composante
UneTexture[No].Data //Image BMP
);
}
/************************************************************************************************/
Arnaud16022
Messages postés1329Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention16 juin 20102 23 oct. 2004 à 23:25
nan mais ca va pas la tete?
moi j'y compends rien, on lache pas comme ca une source de 1000 lignes sans dire ou est le probleme.
et en plus il est 11h du soir :)
précise ton probleme stp, dis ce qui se passe, ce qui devrait se passer normalement, ou tu penses que ca cloche,etc.
mais ca sert a riende nous donner la fonction qui afficheles murs...
autre chose, je compends pas pourquoi tu as besoin de collisions, dans l'écran de veille de windows ya pas ca, la caméra reste tjs bien au milieu dee chemin, et ne rentre jamais dans les murs car elle sait (c'et enregistré dans un fichier) ou ele peut aller et ou elle peut pas.
j'ai pas regardé la src, mais ca serait pas un pb de rotations?
gastoudou
Messages postés17Date d'inscriptionlundi 23 décembre 2002StatutMembreDernière intervention12 novembre 2004 24 oct. 2004 à 11:23
Oups, désolé mais vraiment désolé...
Mais après une journée à bosser dessus, j'ai tout lâché...
Alors je reprends, avec un peu plus de fraicheur et de motivation.
Voici le sujet : Faire un labyrinthe en 3D avec la possibilité donnée à l'utilisateur de se mouvoir à l'intérieur. Le dessin du labyrinthe est donné par un fichier texte de 10*10 caractères. Le déplacement de l'utilisateur est effectué par un déplacement de la caméra (dans mon cas, avec les touches e,d,s et x).
Les problèmes rencontrés : le déplacement (e ou x) n'est pas terrible avec des pas trop importants, mais ce n'est pas le plus important. La rotation (s ou d) est quelque fois capricieuse (je ne sais pas trop comment l'expliquer on tourne on tourne et pouf pouf on tourne plus on est bloqué :( ) Les "collisions" (un bien grand mot) ne sont pas terriblement bien gérées non plus, vu que l'utilisateur n'est pas sensé traverser les murs.
Et enfin, un gros problème d'affichage. J'ai des trous dans mes murs ?? C'est vachement bizarre.
Ah oui, encore un truc. J'ai vu que le dernière texture affichée cachait celles qui étaient affichées avant, du coup, ça me fait des rendus très spéciaux. Je voulait savoir s'il n'y avait pas un moyen de gérer mieux tout ça, si opengl ne permettait pas au programmer de dire "euh oui, euh tout ça, cette texture, tu ne me l'affiche pas pas qu'elle est derrière, mais que si je tourne la caméra, ça serait bien qu'on la voie, vu qu'elle passera devant".
Voilà, j'espère que ces petits eclaircissements vous aideront à mieux cerner mon problème global.
Et encore désolé d'avoir lâché le code comme ça hier soir, mais ça commençait à me prendre mignon...
Arnaud16022
Messages postés1329Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention16 juin 20102 24 oct. 2004 à 17:31
voila beaucoup de problemes pour un seul prog :)
va voir la source de Belzel, Cube 2.0; ya tout ce que tu veux dedans et meme plus.
Vecchio -> "Arnaud16022 tu n'a pas bien regardé, l'erreur est située au caractère numero 456 ": ben c'est bien ce que j'ai dit, non, que j'avais pas regardé? tu sais, a 11 heures du soir, on a moyennement envie de se farcir tout ca ;)
et je ne comprends pas le "l'erreur est située au caractère numero 456", tu peux expliquer?
bon maintenant il est 5 heures je vais jeter un coup d'oeuil a tt ca, ca ira mieux.
Vous n’avez pas trouvé la réponse que vous recherchez ?
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 25 oct. 2004 à 01:58
Un conseil pour tes collisions, apparemment ton niveau est tres petit puisque réprésenté par 10*10 caractères.
Il me parait efficace de créer une matrice 10*10 contenant 1 ou 0 signifiant mur ou pas. Eivdemment si l'épaisseur de tes murs est nul, ca sera plus difficile.
En tout cas, deux produits scalaires te donnent facilement les coordonnées du joueur sur ton niveau. D'où tu en déduis sur quel carreau de la matrice il se trouve. Tu sais donc facilement, ou sont les murs d'après la matrice, tu considères ensuite les vecteurs normals au mur ki s'y trouve, et tu fais des tests sur la distance du joueur par rapport au mur.
Il faudrait donc créer une class mur avec un point appartenant au mur, et un vecteur normal ainsi évidemment que ses coordonnées. De plus tu pourrais créer une variable static qui contiendrait le nombre de mur. Pour les afficher suffirait de les faire défiler un a un dans une fonction.
Arnaud16022
Messages postés1329Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention16 juin 20102 25 oct. 2004 à 10:50
je suis d'accord avec toi pour le principe; mais a mon avis gastoudou a plus intéret a faire comme belzel (c'est en gros ce que tu dis au début de ton msg)
gastoudou
Messages postés17Date d'inscriptionlundi 23 décembre 2002StatutMembreDernière intervention12 novembre 2004 25 oct. 2004 à 14:16
ben le problème, c'est qu'on ne peut pas joindre de fichiers et que je n'ai aucun moyen de le poser qqpart. du coup, j'ai tout lâché ici, en ne pensant pas que ça allait gêner qqun