IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

Problème dans le calcul des normales moyennes,


Sujet :

OpenGL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 24
    Points : 13
    Points
    13
    Par défaut Problème dans le calcul des normales moyennes,
    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...

  2. #2
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Ton lien est mort
    Et si tu peux mettre du JPEG a la place du BMP stp

Discussions similaires

  1. [2D/3D] Calcul des normales dans le vertex shader
    Par freedom144 dans le forum Qt
    Réponses: 3
    Dernier message: 23/10/2016, 01h51
  2. problème dans le traitement des couleurs
    Par sironimo dans le forum Graphisme
    Réponses: 33
    Dernier message: 22/12/2005, 13h52
  3. Réponses: 2
    Dernier message: 11/05/2005, 13h23
  4. problème de calcul des normales par sommet
    Par captainSeb dans le forum OpenGL
    Réponses: 2
    Dernier message: 21/01/2005, 13h42
  5. [ORACLE 9.2] Problème dans le Manager des tâches Win
    Par vempiria dans le forum Oracle
    Réponses: 25
    Dernier message: 12/10/2004, 09h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo