| deplacer la camera sous opengl |
Nicoco

Grade : Membre motivé
Inscrit le: 04 Août 2011, 13:41
|
| Ecrit le: 04 Août 2011, 14:44 Message non corrigé | |
|
bonjour,
après ma présentation, je poste mon problème :
tout d'abord je doit vous dire que je compile toujours en C++ pour avoir plus de flexibilité mais je programme qu'avec des fonctions (façon C ) mais, un jours, je m'y mettrait à la POO !
le but, serait de pouvoir deplacer et tourner la camera.
et c'est là que réside mon problème. je n'arrive pas à faire tourné la camera sur elle même puis avancé , puis la faire retourné ... j'ai pourtant l'impression d'avoir tout essayer.
le code si dessous réalise bien une translation mais la rotation se fait par rapport à la position initiale du personnage.
en faite, je voudrait qu'il tourne sur lui même et pas autour de la position de départ.
alors, voici mon code:
void Dessiner(double positionX, double positionY, double cibleX, double cibleY,double angleHorizontal,double distance)
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity( );
positionY += distance * sin(angleHorizontal * M_PI / 180.0);
positionX += distance * cos(angleHorizontal * M_PI / 180.0);
// Position de l'oeil
gluLookAt(positionX, positionY, 0.8,
// Point regarde
positionX - cos(-angleHorizontal * 0.0174532925199),
positionY + sin(-angleHorizontal * 0.0174532925199),
0.8,
// Verticale en Z+
0,0,1);
glBegin(GL_QUADS); // petite surface pour voir où nous somme
glColor3ub(255,0,0);
glVertex3d(10,10,-1);
glVertex3d(-10,10,-1);
glVertex3d(-10,-10,-1);
glVertex3d(10,-10,-1);
glEnd();
glFlush();
SDL_GL_SwapBuffers();
}
j'espère que vous pourrez m'apporter un début de réponse .
à bientôt
|
|
| |
|
|
Nicoco

Grade : Membre motivé
Inscrit le: 04 Août 2011, 13:41
|
| Ecrit le: 04 Août 2011, 15:27 Message non corrigé | |
|
si mes explication ne sont pas très claire et que vous avez un petit peu de temps, je vous donne le code que j'ai modifier pour qu'il puisse être mis dans le fichier main par un simple copier coller .
il vous faut par contre la bibliothèque SDL et avoir linker libopengl32.a et glu32.a . il ne faut pas non plus oublier d'inclure SDL.dll dans votre dossier.
le code : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | #include <SDL/SDL.h> #include <GL/gl.h> #include <GL/glu.h> #include <cstdlib> #include <math.h>
void Dessiner(double positionX, double positionY, double cibleX, double cibleY,double angleHorizontal,double distance);
int main(int argc, char *argv[]) {
double distance = 0; double angleHorizontal = 0; double indiceRotation = 0; double positionY = 1; double positionX = 1;
double cibleX = 0; double cibleY = 0;
SDL_Event event;
SDL_Init(SDL_INIT_VIDEO); atexit(SDL_Quit); SDL_WM_SetCaption("SDL GL Application", NULL); SDL_SetVideoMode(640, 480, 32, SDL_OPENGL);
glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluPerspective(70,(double)640/480,1,1000); glEnable(GL_DEPTH_TEST);
SDL_EnableKeyRepeat(1,1); for (;;) { SDL_PollEvent(&event);
switch(event.type) { case SDL_QUIT: exit(0); break;
case SDL_MOUSEMOTION: ;
break;
case SDL_KEYDOWN: switch(event.key.keysym.sym) { case SDLK_ESCAPE: exit(0); break;
case SDLK_UP: distance = distance- 0.5; break;
case SDLK_DOWN: distance = distance+ 0.5; break;
case SDLK_LEFT: angleHorizontal = angleHorizontal - 5; break;
case SDLK_RIGHT: angleHorizontal = angleHorizontal + 5; break;
} } Dessiner(positionX, positionY,cibleX,cibleY, angleHorizontal,distance);
}
return 0; }
void Dessiner(double positionX, double positionY, double cibleX, double cibleY,double angleHorizontal,double distance) {
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode( GL_MODELVIEW ); glLoadIdentity( );
positionY += distance * sin(angleHorizontal * M_PI / 180.0); positionX += distance * cos(angleHorizontal * M_PI / 180.0);
// Position de l'oeil gluLookAt(positionX, positionY, 0.8,
// Point regarde positionX - cos(-angleHorizontal * 0.0174532925199), positionY + sin(-angleHorizontal * 0.0174532925199), 0.8,
// Verticale en Z+ 0,0,1);
glBegin(GL_QUADS);
glColor3ub(255,0,0); //face rouge glVertex3d(10,10,-1); glVertex3d(-10,10,-1); glVertex3d(-10,-10,-1); glVertex3d(10,-10,-1);
glEnd();
glFlush(); SDL_GL_SwapBuffers(); } |
j'aimerais tellement comprendre mon erreur...
merci pour votre patience.
|
|
| |
|
|
David

Grade : Expert
Inscrit le: 11 Mai 2005, 20:30
|
| Ecrit le: 04 Août 2011, 16:00 Message non corrigé | |
|
La fonction gluLookAt prend 3 "paramètres", chacun composé de X, Y et Z. Ce qui fait 9 paramètres au total.
Le premier paramètre : la position de la camera dans la scène.
Le deuxième paramètre : la position du point observé par la caméra (milieu de l'écran).
Le troisième paramètre : la vertical. Dans notre cas, on choisi la vertical en Z. Cela a pour effet que les X viennent vers nous et les Y vers la droite.
Voici le code qui permet de faire ce que tu veux faire. N'hésite pas à "jouer" avec.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | #include <SDL/SDL.h> #include <GL/gl.h> #include <GL/glu.h> #include <cmath> #define LARGEUR_FENETRE 640 #define HAUTEUR_FENETRE 480 #define TITRE_APPLICATION "Application de test OpenGL" #define PRET 0.1 #define LOIN 1000.0 #define ANGLE_VISION 70.0 void initSDL(); void initOpenGL(); void Dessiner(double positionX, double positionY, double cibleX, double cibleY); int main(int argc, char *argv[]) { double positionX = 20.0, positionY = -30.0; // Initialisation de la fenetre initSDL(); initOpenGL(); // Gestion des evenements bool continuer = true; SDL_Event event; while (continuer) { while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_QUIT: continuer = false; } } // Deplacement de l'oeil vers les Y+ positionY += 0.1; // Dessin de la scene Dessiner(positionX, positionY, 0.0, 0.0); } SDL_Quit(); return 0; } void Dessiner(double positionX, double positionY, double cibleX, double cibleY) { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity( ); gluLookAt(positionX, positionY ,2 , cibleX, cibleY, 0, 0,0,1); glBegin(GL_QUADS); glColor3ub(255,0,0); glVertex3d(10,10,-1); glVertex3d(-10,10,-1); glVertex3d(-10,-10,-1); glVertex3d(10,-10,-1); glEnd(); glFlush(); SDL_GL_SwapBuffers(); } void initSDL(void) { // Démarrage de la SDL avec le module vidéo if(SDL_Init(SDL_INIT_VIDEO) < 0) { fprintf(stderr, "Erreur d'initialisation de la SDL : %s\n", SDL_GetError()); exit(EXIT_FAILURE); } // Création de la fenetre initialisée pour fonctionner avec OpenGL SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_OPENGL); // Titre de l'application SDL_WM_SetCaption(TITRE_APPLICATION, NULL); } void initOpenGL(void) { glEnable( GL_CULL_FACE ); // Activer le masquage des faces cachées glCullFace(GL_BACK); // Face cachées = faces arrières glFrontFace(GL_CCW); // Face avant = sens trigo // Couleur rgba de vidage de l'écran glClearColor(0, 0, 0, 0); // Définition de la fenetre glViewport(0, 0, LARGEUR_FENETRE, HAUTEUR_FENETRE); glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Définition de la zone visible gluPerspective(ANGLE_VISION, (GLdouble) LARGEUR_FENETRE / (GLdouble)HAUTEUR_FENETRE, PRET, LOIN); } |
Linker :
| -lmingw32 -lSDLmain -lSDL -lopengl32 -lglu32 |
Si tu as d'autres questions, n'hésite pas à les poser.
________ Apprenez à créer votre propre FPS en C++ avec OpenGL. C'est pas dur ! :-)
|
|
| |
|
|
Nicoco

Grade : Membre motivé
Inscrit le: 04 Août 2011, 13:41
|
| Ecrit le: 04 Août 2011, 16:16 Message non corrigé | |
|
merci beaucoup !
je vais regarder tout ça et je te tiens au courant
|
|
| |
|
|
Nicoco

Grade : Membre motivé
Inscrit le: 04 Août 2011, 13:41
|
| Ecrit le: 04 Août 2011, 16:52 Message non corrigé | |
|
j'ai modifier le code pour pouvoir interagir avec les touches flèchés mais j'obtient des réaction bizard :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | #include <SDL/SDL.h> #include <GL/gl.h> #include <GL/glu.h> #include <cmath>
#define LARGEUR_FENETRE 640 #define HAUTEUR_FENETRE 480
#define TITRE_APPLICATION "Application de test OpenGL"
#define PRET 0.1 #define LOIN 1000.0
#define ANGLE_VISION 70.0
void initSDL(); void initOpenGL(); void Dessiner(double positionX, double positionY, double cibleX, double cibleY);
int main(int argc, char *argv[]) { double positionX = 20.0, positionY = -30.0;
// Initialisation de la fenetre initSDL(); initOpenGL(); SDL_EnableKeyRepeat(1,1); // Gestion des evenements bool continuer = true; SDL_Event event;
while (continuer) { while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_QUIT: continuer = false; break;
// Deplacement de l'oeil vers les Y+ case SDL_KEYDOWN: switch(event.key.keysym.sym) { case SDLK_ESCAPE: exit(0); break;
case SDLK_UP: positionX ++; break;
case SDLK_DOWN: positionX--; break;
case SDLK_LEFT: positionY ++; break;
case SDLK_RIGHT: positionY--; break;
} break; } }
// Dessin de la scene Dessiner(positionX, positionY, 0.0, 0.0);
}
SDL_Quit();
return 0; }
void Dessiner(double positionX, double positionY, double cibleX, double cibleY) { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode( GL_MODELVIEW ); glLoadIdentity( );
gluLookAt(positionX, positionY ,2 , cibleX, cibleY, 0, 0,0,1);
glBegin(GL_QUADS);
glColor3ub(255,0,0); glVertex3d(10,10,-1); glVertex3d(-10,10,-1); glVertex3d(-10,-10,-1); glVertex3d(10,-10,-1);
glEnd();
glFlush(); SDL_GL_SwapBuffers(); }
void initSDL(void) { // Démarrage de la SDL avec le module vidéo if(SDL_Init(SDL_INIT_VIDEO) < 0) { fprintf(stderr, "Erreur d'initialisation de la SDL : %s\n", SDL_GetError()); exit(EXIT_FAILURE); }
// Création de la fenetre initialisée pour fonctionner avec OpenGL SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_OPENGL);
// Titre de l'application SDL_WM_SetCaption(TITRE_APPLICATION, NULL); }
void initOpenGL(void) { glEnable( GL_CULL_FACE ); // Activer le masquage des faces cachées glCullFace(GL_BACK); // Face cachées = faces arrières glFrontFace(GL_CCW); // Face avant = sens trigo
// Couleur rgba de vidage de l'écran glClearColor(0, 0, 0, 0);
// Définition de la fenetre glViewport(0, 0, LARGEUR_FENETRE, HAUTEUR_FENETRE);
glMatrixMode(GL_PROJECTION); glLoadIdentity();
// Définition de la zone visible gluPerspective(ANGLE_VISION, (GLdouble) LARGEUR_FENETRE / (GLdouble)HAUTEUR_FENETRE, PRET, LOIN); } |
ne faudrait il pas inclure les formules décrite dans le tutoriel "créé un jeu vidéo" ?
[code]
positionY -= distance * sin(angleHorizontal * M_PI / 180.0);
positionX -= distance * cos(angleHorizontal * M_PI / 180.0);
// Position de l'oeil
gluLookAt(positionX, positionY, 0.8,
// Point regarde
positionX - cos(-angleHorizontal * RADIANS_PAR_DEGRES),
positionY + sin(-angleHorizontal * RADIANS_PAR_DEGRES),
0.8,
// Verticale en Z+
0,0,1);
[/code]
|
|
| |
|
|
David

Grade : Expert
Inscrit le: 11 Mai 2005, 20:30
|
| Ecrit le: 04 Août 2011, 18:30 Message non corrigé | |
|
Ton programme fonctionne.
En appuyant sur les flèches, la caméra bouge de position suivant les axes X et Y.
La position du point visé (cible) est maintenue à (0;0), ce qui explique que le carré reste au centre de l'écran. Il en résulte une sorte de "rotation".
Si tu ne veux "annuler" cette "rotation", tu dois t'assurer que le vecteur (position -> cible) reste inchangé.
Au lieu de faire :
| Dessiner(positionX, positionY, 0.0, 0.0); |
Tu devras faire, par exemple :
| Dessiner(positionX, positionY, positionX + 1.0, positionY + 0.0); |
Pour tester cette ligne, initialise la position de départ à double positionX = 10.0, positionY = -10.0; sinon tu vas galérer à retrouver le carré.
Pour gérer une rotation comme dans un FPS, tu devras effectivement faire un petit calcule de trigo que tu placeras là où j'ai écrit + 1.0 et + 0.0 au niveau de la cible en X et Y.
________ Apprenez à créer votre propre FPS en C++ avec OpenGL. C'est pas dur ! :-)
|
|
| |
|
|
Nicoco

Grade : Membre motivé
Inscrit le: 04 Août 2011, 13:41
|
| Ecrit le: 05 Août 2011, 20:25 Message non corrigé | |
|
merci beaucoup,
maintenant ça fonctionne et je vais pouvoir continuer mon programme.
s'il aboutit à quelque chose, je posterais des nouvelles .
d’ailleurs , ça n'a rien à voir avec mon problème , mais juste pour le plaisir d'échanger :
mon projet serait d'importer des créations préalablement faite sous Blender dans mon code.
pour que mes créations soit un minimum réaliste il me faut quand même pas mal de polygones et j'ai peur que ça rame et que ça saccade quand je vais lancé mon programme.
pour l'instant, j'ai le minimum vitale pour pouvoir navigué sur le net:
256 mo de ram.
processeur 2 Ghz.
mais, est ce qu'avec 2 Go de ram je vais pouvoir faire évoluer des chose assez lourde ?
genre ce qui est décrit ici : [url]http://www.siteduzero.com/forum-83-662867-p1-wip-ferrari-f458.html[/url]
en gros, est ce que ça va transformer mon vieux PC et je vais pouvoir faire ce que je veux ou ... ça sert à rien de claqué de l'argent là dedans?
|
|
| |
|
|
David

Grade : Expert
Inscrit le: 11 Mai 2005, 20:30
|
| Ecrit le: 05 Août 2011, 22:22 Message non corrigé | |
|
Je ne me rend pas trop compte. Mais ce dont je suis sûr, c'est que le temps de création d'une image OpenGL et le nombre de textures chargés en carte graphique dépend essentiellement de la carte graphique.
L'appel au fonction gl*() sont en réalité des instructions qui sont envoyé à la carte graphique pour effectuer des opérations.
Quand tu joues à des jeux, généralement, ils tournent bien ?
En tout cas, rien ne t’empêche de créer une bibliothèque de fonctions permettant de charger des objets 3D. Ensuite, tu pourras tester tes fonctions en chargeant divers objets et tu verras où se situe la limite de ton ordi.
Même s'il s'agit d'un vieux PC, je pense que tu n'atteindras pas tout de suite la limite.
N'hésite pas à nous tenir au courant. Et si tu a besoin d'aide, je suis prêt à t'aider. Ton projet m'intéresse.
________ Apprenez à créer votre propre FPS en C++ avec OpenGL. C'est pas dur ! :-)
|
|
| |
|
|
David

Grade : Expert
Inscrit le: 11 Mai 2005, 20:30
|
| Ecrit le: 05 Août 2011, 22:25 Message non corrigé | |
|
Au fait, si tu réussi à charger un objet 3D avec Blender, ton programme aura forcément la capacité de le charger. Derrière Blender se cache SDL et OpenGL.
________ Apprenez à créer votre propre FPS en C++ avec OpenGL. C'est pas dur ! :-)
|
|
| |
|
| |