Bonjour, j'ai calcule mes normales lorsque je crée mes faces. Cette etape marche, car j'ai bien la meme normal pour tout les points de la face et les resultats concordent avec la position de la lumiere.

J'ai ensuite fait une fonction qui calcule la normale moyenne de ces points. Je regroupe les points qui ont les mêmes coordonnées, je fait la somme de leurs normale, puis je normalise le résultat. Et le resultat n'est pas celui attendu, jugez plutot :

http://www.mathieueylert.com/normale.bmp

Sachant que la lumière se trouve en hauteur, au milieu de la face, on peut donc constater qu'une face sur 2 renvoie bien la lumière.

Voici le code de ma fonction :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
/*************************************************************************************************************************************************
 * Cette fonction calcule les normales moyennes des points identiques des faces appartenant a un vecteur, et les affecte a ces points
 *************************************************************************************************************************************************/
void average_normales(vector<Face3D*>* faces){
 /* Va contenir la liste des points identiques qui seront groupes */
 vector<vector<Point3D*>* > same_points;
 
 /*
  * On parcours toutes les faces
  */
 for(vector<Face3D*>::iterator it = faces->begin(); it != faces->end(); ++it){
  /*
   * On appelle un fonction qui va essayer de caser les points de la face dans le vecteur de groupe
   */
  place_point(&same_points, (*it)->d_p1);
  place_point(&same_points, (*it)->d_p2);
  place_point(&same_points, (*it)->d_p3);
 }
 
 
 /*
  * On parcours nos groupes de points et on fait la moyenne de la normales de chacun des points appartenant a un groupe
  */
 for(vector<vector<Point3D*>* >::iterator it = same_points.begin(); it != same_points.end(); ++it){
  /* Les sommes des coordonnees en x, y et z */
  GLfloat average_norm_x = 0.0, average_norm_y = 0.0, average_norm_z = 0.0;
 
  /* On parcours tous les points du groupe courant et on calcul la somme des coordonnees de chaque normales */
  for(vector<Point3D*>::iterator it2 = (*it)->begin(); it2 != (*it)->end(); ++it2){
   average_norm_x += (*it2)->d_norm_x;
   average_norm_y += (*it2)->d_norm_y;
   average_norm_z += (*it2)->d_norm_z;
  }
 
  /* On cree un vecteur avec notre normale, que l'on va normaliser dans la foulee */
  CVector3 norm(average_norm_x, average_norm_y, average_norm_z);
  norm.Normalize();
 
  /* On affecte la normale calculee a chaque point du groupe */
  for(vector<Point3D*>::iterator it2 = (*it)->begin(); it2 != (*it)->end(); ++it2){
   (*it2)->d_norm_x = norm.x;
   (*it2)->d_norm_y = norm.y;
   (*it2)->d_norm_z = norm.z;
  }
 }
 
 /*
  * On supprime le vecteur contenant les groupes de points
  */
 for(vector<vector<Point3D*>* >::iterator it = same_points.begin(); it != same_points.end(); ++it){
  (*it)->clear(); 
 }
 same_points.clear();
}
Les points sont bien groupés (la fonction place_point fonctionne), j'ai vérifier, le probleme vient donc de ce qui suit, mais je ne vois pas où...

Merci pour votre aide...