Jeux Libres

Envie de créer un jeu vidéo ?   Le site qui vous accompagne de A à Z.


» Les Forums » Création de jeux en C++ » deplacer la camera sous opengl


Aller à la page : 1.

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

  Profil Mail
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.

  Profil Mail
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 :
1
2
3
4
5
-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 ! :-)
  Profil Mail
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
  Profil Mail
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]
  Profil Mail
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 :
1
Dessiner(positionX, positionY, 0.0, 0.0);

Tu devras faire, par exemple :
1
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 ! :-)
  Profil Mail
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?

  Profil Mail
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 ! :-)
  Profil Mail
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 ! :-)
  Profil Mail
 


Aller à la page : 1.


Hébergeur du site : 1and1.fr



Site de création de Jeux Vidéo
Apprenez à créer vos propres Jeux Video

1389637 pages ont été consultées sur le site !
Dont 1569 pages pendant les 24 dernières heures.

Page générée en 0.399 secondes


Nos partenaires
- Otium Production : Aide aux débutants à créer leurs jeux
- Les bibliothèques de développement de jeux vidéo


  © 2005-2012 www.jeux-libres.com - Toute reproduction totale ou partielle du contenu de ce site est strictement interdite.