gKit2 light
Loading...
Searching...
No Matches
tuto_transformations_camera.cpp
Go to the documentation of this file.
1
3
4
5#include "wavefront.h"
6#include "texture.h"
7
8#include "orbiter.h"
9#include "draw.h"
10#include "app_camera.h" // classe Application a deriver
11
12
13// utilitaire. creation d'une grille / repere.
14// n= 0 ne dessine que les axes du repere.
15Mesh make_grid( const int n= 10 )
16{
17 Mesh grid= Mesh(GL_LINES);
18
19 // grille
20 grid.color(White());
21 float w= float(n-1) / 2;
22 for(int x= 0; x < n; x++)
23 {
24 grid.vertex(x -w, 0, -w);
25 grid.vertex(x -w, 0, w);
26 }
27
28 for(int z= 0; z < n; z++)
29 {
30 grid.vertex(-w, 0, z -w);
31 grid.vertex( w, 0, z -w);
32 }
33
34 // axes XYZ
35 grid.color(Red());
36 grid.vertex(0, .1, 0);
37 grid.vertex(1, .1, 0);
38
39 grid.color(Green());
40 grid.vertex(0, .1, 0);
41 grid.vertex(0, 1, 0);
42
43 grid.color(Blue());
44 grid.vertex(0, .1, 0);
45 grid.vertex(0, .1, 1);
46
47 glLineWidth(2);
48
49 return grid;
50}
51
52Mesh make_camera( )
53{
54 Mesh camera= Mesh(GL_LINES);
55
56 camera.color(Yellow());
57 camera.vertex(0,0,0);
58 camera.vertex(-0.5, -0.5, -1);
59 camera.vertex(0,0,0);
60 camera.vertex(-0.5, 0.5, -1);
61 camera.vertex(0,0,0);
62 camera.vertex(0.5, 0.5, -1);
63 camera.vertex(0,0,0);
64 camera.vertex(0.5, -0.5, -1);
65
66 camera.vertex(-0.5, -0.5, -1);
67 camera.vertex(-0.5, 0.5, -1);
68
69 camera.vertex(-0.5, 0.5, -1);
70 camera.vertex(0.5, 0.5, -1);
71
72 camera.vertex(0.5, 0.5, -1);
73 camera.vertex(0.5, -0.5, -1);
74
75 camera.vertex(0.5, -0.5, -1);
76 camera.vertex(-0.5, -0.5, -1);
77
78 // axes XYZ
79 camera.color(Red());
80 camera.vertex(Point(0, 0, 0));
81 camera.vertex(Point(1, 0, 0));
82
83 camera.color(Green());
84 camera.vertex(Point(0, 0, 0));
85 camera.vertex(Point(0, 1, 0));
86
87 camera.color(Blue());
88 camera.vertex(Point(0, 0, 0));
89 camera.vertex(Point(0, 0, 1));
90
91 glLineWidth(2);
92
93 return camera;
94}
95
96class TP : public AppCamera
97{
98public:
99 // constructeur : donner les dimensions de l'image, et eventuellement la version d'openGL.
100 TP( ) : AppCamera(1024, 640) {}
101
102 // creation des objets de l'application
103 int init( )
104 {
105 // decrire un repere / grille
106 m_repere= make_grid(20);
107 m_local= make_grid(2);
108 m_proxy= make_camera();
109
110 // charge l'element
111 m_objet= read_mesh("data/cube.obj");
112
113 // position initiale de l'objet
114 m_position= Identity();
115
116 // si l'objet est "gros", il faut regler la camera pour l'observer entierement :
117 // recuperer les points extremes de l'objet (son englobant)
118 Point pmin, pmax;
119 m_repere.bounds(pmin, pmax);
120 // parametrer la camera de l'application, renvoyee par la fonction camera()
121 camera().lookat(pmin, pmax);
122
123 // etat openGL par defaut
124 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
125
126 glClearDepth(1.f); // profondeur par defaut
127 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
128 glEnable(GL_DEPTH_TEST); // activer le ztest
129
130 return 0; // ras, pas d'erreur
131 }
132
133 // destruction des objets de l'application
134 int quit( )
135 {
136 m_objet.release();
137 m_repere.release();
138 m_local.release();
139 m_proxy.release();
140 return 0;
141 }
142
143 // dessiner une nouvelle image
144 int render( )
145 {
146 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
147
148 // modifie la position de l'objet en fonction des fleches de direction
149 if(key_state(SDLK_UP))
150 m_position= m_position * Translation(0, 0, 0.25); // en avant
151 if(key_state(SDLK_DOWN))
152 m_position= m_position * Translation(0, 0, -0.25); // en arriere
153
154 if(key_state(SDLK_LEFT))
155 m_position= m_position * RotationY(4); // tourne vers la droite
156 if(key_state(SDLK_RIGHT))
157 m_position= m_position * RotationY(-4); // tourne vers la gauche
158
159
160 // dessine le meme objet a un autre endroit. il faut modifier la matrice model, qui sert a ca : placer un objet dans le monde, ailleurs qu'a l'origine.
161 // par exemple, a la verticale au dessus du premier cube :
162 // la transformation est une translation le long du vecteur Y= (0, 1, 0), si on veut placer le cube plus haut, il suffit d'utiliser une valeur > 1
163 Transform t= Translation(0, 2, 0);
164
165 float time= global_time();
166 static Transform r;
167 if(!key_state('f'))
168 // rotation en fonction du temps...
169 r= RotationX(time / float(20));
170 else
171 {
172 // place la camera derriere le cube
173 r= RotationX(15) * RotationY(180);
174 t= Translation(1, 1, 4);
175 }
176 // et pour placer et orienter, les 2 a la fois ? on compose les 2 transformations, et il suffit de multiplier les 2 matrices
177 // mais attention : l'ordre de la multiplication des matrices change le resultat...
178 Transform m= r * t;
179
180 // transformations de la camera de l'application
181 Transform view= camera().view();
182 Transform projection= camera().projection();
183
184 if(key_state(' '))
185 {
186 view= Inverse(m_position * m);
187 projection= Perspective(60, float(window_width()) / float(window_height()), float(0.1), float(40));
188 }
189
190 draw(m_objet, /* model */ m_position, view, projection);
191
192 // dessine le 2ieme objet par rapport au premier objet...
193 // compose leurs 2 transformations, les coordonnees du 2ieme objet sont connues dans le repere local du premier objet
194 draw(m_proxy, /* model */ m_position * m, view, projection);
195
196 // dessine aussi le repere local, pour le meme point de vue
197 draw(m_local, m_position, view, projection);
198
199 // dessine le repere global, pour le meme point de vue
200 draw(m_repere, Identity(), view, projection);
201
202 // screenshot
203 if(key_state('s'))
204 {
205 clear_key_state('s');
206 static int id= 1;
207 screenshot("camera", id++);
208 }
209
210 // continuer...
211 return 1;
212 }
213
214protected:
215 Mesh m_objet;
216 Mesh m_repere;
217 Mesh m_local;
218 Mesh m_proxy;
219 Transform m_position;
220};
221
222
223int main( int argc, char **argv )
224{
225 printf("appuyez sur 'espace' pour fixer la position de la camera\n");
226 printf("appuyez sur 'c' pour dessiner avec la camera\n");
227 printf("appuyez sur 'c' et 'espace' pour dessiner avec la camera attachee derriere le cube\n");
228 printf("deplacez le cube avec les fleches de directions\n");
229
230 // il ne reste plus qu'a creer un objet application et la lancer
231 TP tp;
232 tp.run();
233
234 return 0;
235}
classe application.
Definition app_camera.h:19
const Orbiter & camera() const
renvoie l'orbiter gere par l'application.
Definition app_camera.h:37
AppCamera(const int width, const int height, const int major=3, const int minor=3, const int samples=0)
constructeur, dimensions de la fenetre et version d'openGL.
Definition app_camera.cpp:5
int run()
execution de l'application.
Definition app.cpp:36
representation d'un objet / maillage.
Definition mesh.h:121
unsigned int vertex(const vec3 &p)
insere un sommet de position p, et ses attributs (s'ils sont definis par color(), texcoord(),...
Definition mesh.cpp:97
Mesh & color(const vec4 &c)
definit la couleur du prochain sommet.
Definition mesh.cpp:66
void lookat(const Point &center, const float size)
observe le point center a une distance size.
Definition orbiter.cpp:7
Transform projection(const int width, const int height, const float fov)
fixe la projection reglee pour une image d'aspect width / height, et une demi ouverture de fov degres...
Definition orbiter.cpp:48
Transform view() const
renvoie la transformation vue.
Definition orbiter.cpp:41
Definition alpha.cpp:58
int render()
a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int quit()
a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int init()
a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int window_height()
renvoie la hauteur de la fenetre de l'application.
Definition window.cpp:27
void clear_key_state(const SDL_Keycode key)
desactive une touche du clavier.
Definition window.cpp:46
void printf(Text &text, const int px, const int py, const char *format,...)
affiche un texte a la position x, y. meme utilisation que printf().
Definition text.cpp:140
int key_state(const SDL_Keycode key)
renvoie l'etat d'une touche du clavier. cf la doc SDL2 pour les codes.
Definition window.cpp:40
int window_width()
renvoie la largeur de la fenetre de l'application.
Definition window.cpp:23
float global_time()
renvoie le temps ecoule depuis le lancement de l'application, en millisecondes.
Definition window.cpp:126
Color Red()
utilitaire. renvoie une couleur rouge.
Definition color.cpp:28
Color Yellow()
utilitaire. renvoie une couleur jaune.
Definition color.cpp:43
Color Blue()
utilitaire. renvoie une couleur bleue.
Definition color.cpp:38
Color Green()
utilitaire. renvoie une couleur verte.
Definition color.cpp:33
Color White()
utilitaire. renvoie une couleur blanche.
Definition color.cpp:23
Transform Inverse(const Transform &m)
renvoie l'inverse de la matrice.
Definition mat.cpp:197
Transform Identity()
construit la transformation identite.
Definition mat.cpp:187
Transform RotationX(const float a)
renvoie la matrice representation une rotation de angle degree autour de l'axe X.
Definition mat.cpp:230
Transform RotationY(const float a)
renvoie la matrice representation une rotation de a degree autour de l'axe Y.
Definition mat.cpp:242
Transform Perspective(const float fov, const float aspect, const float znear, const float zfar)
renvoie la matrice representant une transformation projection perspective.
Definition mat.cpp:329
Transform Translation(const Vector &v)
renvoie la matrice representant une translation par un vecteur.
Definition mat.cpp:216
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes....
Definition wavefront.cpp:14
int screenshot(const char *filename)
enregistre le contenu de la fenetre dans un fichier. doit etre de type .png / .bmp
Definition texture.cpp:178
representation d'un point 3d.
Definition vec.h:21
representation d'une transformation, une matrice 4x4, organisee par ligne / row major.
Definition mat.h:21