gKit2 light
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.
15 Mesh make_grid( const int n= 10 )
16 {
17  Mesh grid= Mesh(GL_LINES);
18 
19  // grille
20  grid.color(White());
21  for(int x= 0; x < n; x++)
22  {
23  float px= float(x) - float(n)/2 + .5f;
24  grid.vertex(px, 0, - float(n)/2 + .5f);
25  grid.vertex(px, 0, float(n)/2 - .5f);
26  }
27 
28  for(int z= 0; z < n; z++)
29  {
30  float pz= float(z) - float(n)/2 + .5f;
31  grid.vertex(- float(n)/2 + .5f, 0, pz);
32  grid.vertex(float(n)/2 - .5f, 0, pz);
33  }
34 
35  // axes XYZ
36  grid.color(Red());
37  grid.vertex(0, .1, 0);
38  grid.vertex(1, .1, 0);
39 
40  grid.color(Green());
41  grid.vertex(0, .1, 0);
42  grid.vertex(0, 1, 0);
43 
44  grid.color(Blue());
45  grid.vertex(0, .1, 0);
46  grid.vertex(0, .1, 1);
47 
48  glLineWidth(2);
49 
50  return grid;
51 }
52 
53 Mesh make_camera( )
54 {
55  Mesh camera= Mesh(GL_LINES);
56 
57  camera.color(Yellow());
58  camera.vertex(0,0,0);
59  camera.vertex(-0.5, -0.5, -1);
60  camera.vertex(0,0,0);
61  camera.vertex(-0.5, 0.5, -1);
62  camera.vertex(0,0,0);
63  camera.vertex(0.5, 0.5, -1);
64  camera.vertex(0,0,0);
65  camera.vertex(0.5, -0.5, -1);
66 
67  camera.vertex(-0.5, -0.5, -1);
68  camera.vertex(-0.5, 0.5, -1);
69 
70  camera.vertex(-0.5, 0.5, -1);
71  camera.vertex(0.5, 0.5, -1);
72 
73  camera.vertex(0.5, 0.5, -1);
74  camera.vertex(0.5, -0.5, -1);
75 
76  camera.vertex(0.5, -0.5, -1);
77  camera.vertex(-0.5, -0.5, -1);
78 
79  // axes XYZ
80  camera.color(Red());
81  camera.vertex(Point(0, 0, 0));
82  camera.vertex(Point(1, 0, 0));
83 
84  camera.color(Green());
85  camera.vertex(Point(0, 0, 0));
86  camera.vertex(Point(0, 1, 0));
87 
88  camera.color(Blue());
89  camera.vertex(Point(0, 0, 0));
90  camera.vertex(Point(0, 0, 1));
91 
92  glLineWidth(2);
93 
94  return camera;
95 }
96 
97 class TP : public AppCamera
98 {
99 public:
100  // constructeur : donner les dimensions de l'image, et eventuellement la version d'openGL.
101  TP( ) : AppCamera(1024, 640) {}
102 
103  // creation des objets de l'application
104  int init( )
105  {
106  // decrire un repere / grille
107  m_repere= make_grid(20);
108  m_local= make_grid(2);
109  m_proxy= make_camera();
110 
111  // charge l'element
112  m_objet= read_mesh("data/cube.obj");
113 
114  // position initiale de l'objet
115  m_position= Identity();
116 
117  // si l'objet est "gros", il faut regler la camera pour l'observer entierement :
118  // recuperer les points extremes de l'objet (son englobant)
119  Point pmin, pmax;
120  m_repere.bounds(pmin, pmax);
121  // parametrer la camera de l'application, renvoyee par la fonction camera()
122  camera().lookat(pmin, pmax);
123 
124  // etat openGL par defaut
125  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
126 
127  glClearDepth(1.f); // profondeur par defaut
128  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
129  glEnable(GL_DEPTH_TEST); // activer le ztest
130 
131  return 0; // ras, pas d'erreur
132  }
133 
134  // destruction des objets de l'application
135  int quit( )
136  {
137  m_objet.release();
138  m_repere.release();
139  m_local.release();
140  m_proxy.release();
141  return 0;
142  }
143 
144  // dessiner une nouvelle image
145  int render( )
146  {
147  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
148 
149  // modifie la position de l'objet en fonction des fleches de direction
150  if(key_state(SDLK_UP))
151  m_position= m_position * Translation(0, 0, 0.25); // en avant
152  if(key_state(SDLK_DOWN))
153  m_position= m_position * Translation(0, 0, -0.25); // en arriere
154 
155  if(key_state(SDLK_LEFT))
156  m_position= m_position * RotationY(4); // tourne vers la droite
157  if(key_state(SDLK_RIGHT))
158  m_position= m_position * RotationY(-4); // tourne vers la gauche
159 
160 
161  // 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.
162  // par exemple, a la verticale au dessus du premier cube :
163  // 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
164  Transform t= Translation(0, 2, 0);
165 
166  float time= global_time();
167  static Transform r;
168  if(!key_state('f'))
169  // rotation en fonction du temps...
170  r= RotationX(time / float(20));
171  else
172  {
173  // place la camera derriere le cube
174  r= RotationX(15) * RotationY(180);
175  t= Translation(1, 1, 4);
176  }
177  // et pour placer et orienter, les 2 a la fois ? on compose les 2 transformations, et il suffit de multiplier les 2 matrices
178  // mais attention : l'ordre de la multiplication des matrices change le resultat...
179  Transform m= r * t;
180 
181  // transformations de la camera de l'application
182  Transform view= camera().view();
183  Transform projection= camera().projection();
184 
185  if(key_state(' '))
186  {
187  view= Inverse(m_position * m);
188  projection= Perspective(60, float(window_width()) / float(window_height()), float(0.1), float(40));
189  }
190 
191  draw(m_objet, /* model */ m_position, view, projection);
192 
193  // dessine le 2ieme objet par rapport au premier objet...
194  // compose leurs 2 transformations, les coordonnees du 2ieme objet sont connues dans le repere local du premier objet
195  draw(m_proxy, /* model */ m_position * m, view, projection);
196 
197  // dessine aussi le repere local, pour le meme point de vue
198  draw(m_local, m_position, view, projection);
199 
200  // dessine le repere global, pour le meme point de vue
201  draw(m_repere, Identity(), view, projection);
202 
203  // screenshot
204  if(key_state('s'))
205  {
206  clear_key_state('s');
207  static int id= 1;
208  screenshot("camera", id++);
209  }
210 
211  // continuer...
212  return 1;
213  }
214 
215 protected:
216  Mesh m_objet;
217  Mesh m_repere;
218  Mesh m_local;
219  Mesh m_proxy;
220  Transform m_position;
221 };
222 
223 
224 int main( int argc, char **argv )
225 {
226  printf("appuyez sur 'espace' pour fixer la position de la camera\n");
227  printf("appuyez sur 'c' pour dessiner avec la camera\n");
228  printf("appuyez sur 'c' et 'espace' pour dessiner avec la camera attachee derriere le cube\n");
229  printf("deplacez le cube avec les fleches de directions\n");
230 
231  // il ne reste plus qu'a creer un objet application et la lancer
232  TP tp;
233  tp.run();
234 
235  return 0;
236 }
classe application.
Definition: app_camera.h:19
const Orbiter & camera() const
renvoie l'orbiter gere par l'application.
Definition: app_camera.h:37
int run()
execution de l'application.
Definition: app.cpp:36
representation d'un objet / maillage.
Definition: mesh.h:112
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:109
void bounds(Point &pmin, Point &pmax) const
renvoie min et max les coordonnees des extremites des positions des sommets de l'objet (boite engloba...
Definition: mesh.cpp:501
void release()
detruit les objets openGL.
Definition: mesh.cpp:62
Mesh & color(const vec4 &c)
definit la couleur du prochain sommet.
Definition: mesh.cpp:78
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:47
Transform view() const
renvoie la transformation vue.
Definition: orbiter.cpp:40
Definition: alpha.cpp:59
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:29
void clear_key_state(const SDL_Keycode key)
desactive une touche du clavier.
Definition: window.cpp:48
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:42
int window_width()
renvoie la largeur de la fenetre de l'application.
Definition: window.cpp:25
float global_time()
renvoie le temps ecoule depuis le lancement de l'application, en millisecondes.
Definition: window.cpp:128
Color Red()
utilitaire. renvoie une couleur rouge.
Definition: color.cpp:41
Color Yellow()
utilitaire. renvoie une couleur jaune.
Definition: color.cpp:56
Color Blue()
utilitaire. renvoie une couleur bleue.
Definition: color.cpp:51
Color Green()
utilitaire. renvoie une couleur verte.
Definition: color.cpp:46
Color White()
utilitaire. renvoie une couleur blanche.
Definition: color.cpp:36
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:194
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