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();
} |
Partager