7.1.4 Le push et le pop de Matrice4

Voici la raison pour laquelle nous avons fait du C++ et pas du C, non que c'est impossible à faire en C, mais c'est que c'est plus difficile (et d'ailleurs nous le ferons un peu plus tard).

Heu, ben, je ne sais pas ce que c'est.

Oups, une explication s'impose alors...

Avec OpenGl 3 nous manipulons des matrices :

  • de projection pour afficher nos objets à l'écran
  • de rotation et de translation pour les positionner

Ce dernier point est gourmand en calcul, pour chaque objet à placer vous avez un changement de repère à faire.

Pour modifier votre repère vous devez créer une matrice de rotation pour de translation, multiplier la matrice modelview par elle (et non l'inverse), et votre repère sera changer.

Pour modifier votre repère vous avez fait autant de multiplication de matrices que de modifications de votre repère, si vous voulez re-décaler votre repère à un endroit ou il était précédemment vous n'allez pas refaire des multiplications à l'envers, ça prendrait trop de temps, la solution est de sauvegarder le repère avant de faire la modification, puis de revenir à la valeur de la matrice que l'on à sauvegarder, ce qui gagne énormément de temps.

C'est pour cela que nous allons faire ces trois petites fonctions, qui nous serons très utile plus tard :

1
2
3
bool push();
bool pop();
void depiler();

Ajoutons les à la classe :

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
#ifndef ___Matrice4_H__
#define ___Matrice4_H__
#include <math.h>
#include <iostream>
#include "Vecteur4.h"

void produitVectoriel(float & x, float & y, float & z, float x1, float y1, float z1, float x2, float y2, float z2);
void normaliseVecteur(float & x, float & y, float & z);

class Matrice4{
	public:
		Matrice4();
		Matrice4(const Vecteur4 & v1, const Vecteur4 & v2, const Vecteur4 & v3, const Vecteur4 & v4);
		Matrice4(float x1, float y1, float z1, float t1,
			float x2, float y2, float z2, float t2,
			float x3, float y3, float z3, float t3,
			float x4, float y4, float z4, float t4
		);
		Matrice4(const Matrice4 & other);
		virtual ~Matrice4();
		
		void setMatrice4(const Vecteur4 & v1, const Vecteur4 & v2, const Vecteur4 & v3, const Vecteur4 & v4);
		void setMatrice4(float x1, float y1, float z1, float t1,
			float x2, float y2, float z2, float t2,
			float x3, float y3, float z3, float t3,
			float x4, float y4, float z4, float t4
		);
		
		void loadIdentity();
		void loadNull();
		void translated(float x, float y, float z);
		void scale(float x, float y, float z);
		void rotateRad(float angle, float x, float y, float z);
		void rotateDeg(float angle, float x, float y, float z);
		void perspectiveRad(float angle, float ratio, float near, float far);
		void perspectiveDeg(float angle, float ratio, float near, float far);
		void lookAt(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ);
		
		bool push();
		bool pop();
		void depiler();
};

#endif //classe Matrice4

Vous comprendrez mieux quand on écrira ces fonctions.