David

Grade : Expert
Inscrit le: 11 Mai 2005, 20:30
|
| Ecrit le: 23 Mai 2011, 16:28 Message corrigé par ryzou | |
|
Salut Mjlayak,
Comment mettre de la 2D sur du 3D ?
Pour dessiner un objet, que tu sois en 2D ou en 3D, tu devras le faire avec OpenGL.
De la 2D avec OpenGL
Actuellement, tu as quelque-chose de semblable à ça :
| // Vidage de l'ecran glClear(GL_COLOR_BUFFER_BIT); // Chargement / Definition du contexte 3D glLoadIdentity( ); glMatrixMode( GL_MODELVIEW ); gluPerspective(70,(double)640/480,1,1000); // Place la camera gluLookAt(2.0,2,3,2.0,0,0,0,1,0); // Dessin de la scene en 3D // . . . |
A la suite de ça, tu devras "basculer" en 2D.
| // Chargement / Definition du contexte 2D glLoadIdentity(); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0, 640.0, 0.0, 480.0); // Dessin du menu, viseur... (2D) // . . . |
Et enfin, afficher le dessin à l'écran :
| glFlush(); SDL_GL_SwapBuffers(); |
De nouvelles primitives
Vu qu'on fait maintenant du la 2D, les primitives ne sont plus les mêmes.
Par exemple, glVertex3i(3, 1, 1); n' "existe plus". Par contre, tu peux maintenant utiliser glVertex2i(20, 400);
Un code d'exemple simple
Voici un exemple de code qui dessine un rectangle 2D et deux cubes en 3D.
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 | #include <SDL/SDL.h> #include <GL/gl.h> #include <GL/glu.h> int main(int argc, char *argv[]) { // Création de la fenetre SDL_Init(SDL_INIT_VIDEO); atexit(SDL_Quit); SDL_WM_SetCaption("Titre", NULL); SDL_SetVideoMode(640, 480, 32, SDL_OPENGL); // Couleur de vidage glClearColor(0.0, 0.0, 0.0, 0.0); // Epaisseur des lignes glLineWidth(5.0); for (;;) { // Gestion des evenements SDL_Event event; SDL_WaitEvent(&event); switch(event.type) { case SDL_QUIT: exit(0); break; } // Vidage de l'ecran glClear(GL_COLOR_BUFFER_BIT); // Chargement / Definition du contexte 3D glLoadIdentity( ); glMatrixMode( GL_MODELVIEW ); gluPerspective(70,(double)640/480,1,1000); // Place la camera gluLookAt(2.0,2,3,2.0,0,0,0,1,0); // Dessin 3D glBegin(GL_LINE_LOOP); glColor3ub(0, 0, 255); glVertex3i(0, 0, 1); glVertex3i(1, 0, 1); glVertex3i(1, 1, 1); glVertex3i(0, 1, 1); glEnd(); glBegin(GL_LINE_LOOP); glVertex3i(0, 0, 0); glVertex3i(1, 0, 0); glVertex3i(1, 1, 0); glVertex3i(0, 1, 0); glEnd(); glBegin(GL_LINES); glVertex3i(0, 1, 0); glVertex3i(0, 1, 1); glVertex3i(0, 0, 0); glVertex3i(0, 0, 1); glVertex3i(1, 1, 0); glVertex3i(1, 1, 1); glVertex3i(1, 0, 0); glVertex3i(1, 0, 1); glEnd(); // Cube 2 décalé glTranslatef(2.5, 0.0, 0.5); glRotatef(45.0, 0.0, 1.0, 0.0); glTranslatef(-2.5, 0.0, -0.5); glBegin(GL_LINE_LOOP); glColor3ub(255, 0, 2); glVertex3i(2, 0, 1); glVertex3i(3, 0, 1); glVertex3i(3, 1, 1); glVertex3i(2, 1, 1); glEnd(); glBegin(GL_LINE_LOOP); glVertex3i(2, 0, 0); glVertex3i(3, 0, 0); glVertex3i(3, 1, 0); glVertex3i(2, 1, 0); glEnd(); glBegin(GL_LINES); glVertex3i(2, 1, 0); glVertex3i(2, 1, 1); glVertex3i(2, 0, 0); glVertex3i(2, 0, 1); glVertex3i(3, 1, 0); glVertex3i(3, 1, 1); glVertex3i(3, 0, 0); glVertex3i(3, 0, 1); glEnd(); // Chargement / Definition du contexte 2D glLoadIdentity(); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0, 640.0, 0.0, 480.0); // Dessin d'un rectangle glBegin(GL_POLYGON); glColor3f(0.0, 1.0, 0.0); glVertex2f(20, 400) ; glVertex2f(620, 400) ; glColor3f(1.0, 0.0, 0.0); glVertex2f(620, 460) ; glColor3f(1.0, 0.0, 1.0); glVertex2f(20, 460) ; glEnd(); glFlush(); SDL_GL_SwapBuffers(); } return 0; } |
Le résultat

Comment crée une surface au sol avec des montagnes ?
Créer des montagnes
Pour créer des montagnes, tu devras utiliser une images de ce style là :

La valeur du pixel détermine la hauteur du point. (blanc = 255 = hauteur max)
Par un système de maillage, tu dessine chaque triangle qui constitue ton terrain.
Un triangle est régit de 3 pixels : celui-ci, celui juste au dessous, et celui juste à droite.
Un seconde triangle est régit de ce pixel, de celui juste au dessus, et de celui juste à gauche.
Et dans une double boucle imbriqué, tu parcours toute ton image pour dessiner ton terrain.
Avec 4 pixels, tu peux dessiner 2 triangles qui se touchent.
A l'aide d'une double boucle imbriquée, tu parcours toute ton image pour dessiner la totalité de ton terrain.
L'attraction
Pour ce qui est de l'attraction, tu pourras te contenter de décrémenter une variable contenant l'altitude de ton personnage.
Ce qui me semble être le plus difficile, c'est de gérer les collisions / éventuels glissements. Je ne suis pas à l'aise avec ce genre de chose. Osasuke te répondra sans doute mieux que moi.
________ Apprenez à créer votre propre FPS en C++ avec OpenGL. C'est pas dur ! :-)
|
|