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 :

Calculer la normale d'une surface


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 465
    Par défaut Calculer la normale d'une surface
    Bonjour,
    Je suis entrain d'écrire un module pour la gestion de la lumière dans une scène OpenGL. Je suis obligé de calculer la normale de chaque surface pour avoir un rendu réaliste. Pour ce faire, j'ai écrit une pétite fonction pour claculer la normale d'une surface. Elle a comme paramètres les coordonnées x, y et z de 3 points de la surface concernée comme sit:
    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
     
    double[] SurfaceNormal(double point1X,double point1Y,double point1Z,double point2X,double point2Y,double point2Z,double point3X,double point3Y,double point3Z)
    {
     
    //The first vector corresponding to P1 and P2
      double v1[]= new double[3];
    //   // The second vector corresponding to P1 and P3
      double v2[]= new double[3];
    //   The result vector
      double v[]= new double[3];
     
    //   The first vector corresponding to the first and the second points of the surface
      v1[0]=point1X-point2X;// X1
      v1[1]=point1Y-point2Y;// Y1
      v1[2]=point1Z-point2Z;// Z1
     
    //  The second vector corresponding to the second and the third points of the surface
      v2[0]=point1X-point3X;;// X2
      v2[1]=point1Y-point3Y;// Y2
      v2[2]=point1Z-point3Z;// Z2
     
    //   We calculate the vector V : vector product  of v1 and v2
      v[0]=v1[1]*v2[2]- v1[2]*v2[1];// Y1*Z2-Z1*Y2
      v[1]=v1[2]*v2[0]-v1[0]*v2[2];//Z1*X2-X1*Z2
      v[2]=v1[0]*v2[1]-v1[1]*v2[0];//X1*Y2-Y1*X2
     
    //   We normalize the vector V
      double var=Math.sqrt(Math.pow(v[0], 2)+Math.pow(v[1], 2)+Math.pow(v[2], 2));
     
      v[0]=-v[0]/var;
      v[1]=-v[1]/var;
      v[2]=-v[2]/var;
     
      return v;
    }
    J'obtient un rendu bizare (surfaces qui n'apparaissenet pas, surface blanches, sufaces grises et surfaces noires), donc je me demande si le calcul de la normale que j'effectue est correct ou non? si non quels sont les causes probables de mon problème? Merci d'avance.

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Par défaut
    Fais gaffe t'as un memory leak pour v1 et v2. Ensuite essaye avec v1 = -v1 et v2=-v2. Sinon ça m'a l'air correct. Fais gaffe de puis donner les bons points pour le calcul (le problème peut aussi venir de là).

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 465
    Par défaut
    Citation Envoyé par TanEk Voir le message
    Fais gaffe t'as un memory leak pour v1 et v2.
    Comment corrige-t-on les memory leak?
    Citation Envoyé par TanEk Voir le message
    Ensuite essaye avec v1 = -v1 et v2=-v2. Sinon ça m'a l'air correct. Fais gaffe de puis donner les bons points pour le calcul (le problème peut aussi venir de là).
    J'ai déjà fait ça, mais j'ai eu toujours le même résultat.
    Citation Envoyé par TanEk Voir le message
    Fais gaffe de puis donner les bons points pour le calcul (le problème peut aussi venir de là).
    Bein, les surfaces que j'utilise sont des surfaces planes, et les point que j'utilise pour caluculer la normales sont les sommets de cette surface (qui se situent au même plan).

  4. #4
    Membre émérite

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Par défaut
    Tu enlèves les memory leak (en français fuites mémoire) en faisante des delete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    delete [] v1;
    delete [] v2;
    Ensuite pourquoi faire une allocation dynamique alors qu'une simple allocation sur la pile marche ? Il me semble que les allocations dynamiques sont plus lentes (à confirmer), donc remplace la création de v par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    double v1[3];
    double v2[3];
    Mais pas v ! Car v doit exister après la fin de la fonction.

    Ensuite ton code est normalement correct, le problème doit venir autre part. Désolé je ne vois pas.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 465
    Par défaut
    Ah j'ai compris, c'est le garbage collector de java qu'il faut utiliser je crois?

  6. #6
    Membre émérite

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Par défaut
    Oh mon dieu ! J'ai confondu le Java avec le C++ ! A force de coder dans les deux langages je les confonds parfois J'ai rien dis ! Ton code est bon .

Discussions similaires

  1. [Débutant] Calcul et tracé d'une surface 3D
    Par mantus dans le forum MATLAB
    Réponses: 13
    Dernier message: 10/06/2011, 12h01
  2. Calculer les facettes d'une surface via Numpy
    Par rambc dans le forum Calcul scientifique
    Réponses: 0
    Dernier message: 24/12/2009, 16h25
  3. Calcul de la normale d'une surface (raytracing)
    Par aerendil dans le forum Mathématiques
    Réponses: 0
    Dernier message: 02/06/2009, 17h57
  4. Calcul normale facette d'une surface
    Par yabbiyou dans le forum MATLAB
    Réponses: 2
    Dernier message: 13/12/2007, 13h55
  5. calcul de surface : exclusion d'une surface qelconque
    Par zax-tfh dans le forum Mathématiques
    Réponses: 4
    Dernier message: 26/02/2007, 13h07

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