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 :

probleme rendu triangles


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 17
    Par défaut probleme rendu triangles
    Bonjour,

    Je suis en train d'implémenter un rendu 3D dans mon programme et j'obtiens des effets curieux sur le rendu en mode ombrage "smooth".



    mon volume est composé de triangle définit par 3 points ayant 1 normale chacun.
    le sens des points de chaque face est :

    1 4
    |
    V
    2->3

    1-2-3 et 1-3-4

    Mon rendu n'affiche que les faces "externes" (fonctions : glEnable( GL_CULL_FACE ) et glFrontFace( GL_CCW )).

    je construit mon volume :

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
     
    glBegin(GL_TRIANGLES);
    			// mes 3 points de chaque triangle
    			P1.x = vdata[0] = pMere->m_vol.points[pMere->m_vol.Triangles[i].x].Pt.x;
    			P1.y = vdata[1] = pMere->m_vol.points[pMere->m_vol.Triangles[i].x].Pt.y;
    			P1.z = vdata[2] = pMere->m_vol.points[pMere->m_vol.Triangles[i].x].Pt.z;
    			P2.x = vdata[0] = pMere->m_vol.points[pMere->m_vol.Triangles[i].y].Pt.x;
    			P2.y = vdata[1] = pMere->m_vol.points[pMere->m_vol.Triangles[i].y].Pt.y;
    			P2.z = vdata[2] = pMere->m_vol.points[pMere->m_vol.Triangles[i].y].Pt.z;
    			P3.x = vdata[0] = pMere->m_vol.points[pMere->m_vol.Triangles[i].z].Pt.x;
    			P3.y = vdata[1] = pMere->m_vol.points[pMere->m_vol.Triangles[i].z].Pt.y;
    			P3.z = vdata[2] = pMere->m_vol.points[pMere->m_vol.Triangles[i].z].Pt.z;
     
    			glColor3f(0.7f,0.7f,0.7f);
    			// 2 vecteurs du plan partant de P1
    			V1.x = P2.x-P1.x;
    			V1.y = P2.y-P1.y;
    			V1.z = P2.z-P1.z;
     
    			V2.x = P3.x-P1.x;
    			V2.y = P3.y-P1.y;
    			V2.z = P3.z-P1.z;
    			// produit scalaire 
    			vdata[0] = (V1.y*V2.z)-(V1.z*V2.y);
    			vdata[1] = (V1.z*V2.x)-(V1.x*V2.z);
    			vdata[2] = (V1.x*V2.y)-(V1.y*V2.x);
    			norm = sqrt(vdata[0]*vdata[0] + vdata[1]*vdata[1] + vdata[2]*vdata[2]);
     
    			vdata[0]/=norm;
    			vdata[1]/=norm;
    			vdata[2]/=norm;
    			// normale en P1
    			glNormal3fv(&vdata[0]);
    			vdata[0] = P1.x;
    			vdata[1] = P1.y;
    			vdata[2] = P1.z;
    			glVertex3fv(&vdata[0]);
     
    			glColor3f(0.7f,0.7f,0.7f);
    			// 2 vecteurs du plan partant de P2
    			V1.x = P3.x-P2.x;
    			V1.y = P3.y-P2.y;
    			V1.z = P3.z-P2.z;
     
    			V2.x = P1.x-P2.x;
    			V2.y = P1.y-P2.y;
    			V2.z = P1.z-P2.z;
    			// produit scalaire 
    			vdata[0] = (V1.y*V2.z)-(V1.z*V2.y);
    			vdata[1] = (V1.z*V2.x)-(V1.x*V2.z);
    			vdata[2] = (V1.x*V2.y)-(V1.y*V2.x);
    			norm = sqrt(vdata[0]*vdata[0] + vdata[1]*vdata[1] + vdata[2]*vdata[2]);
     
    			vdata[0]/=norm;
    			vdata[1]/=norm;
    			vdata[2]/=norm;
    			// normale en P2
    			glNormal3fv(&vdata[0]);
    			vdata[0] = P2.x;
    			vdata[1] = P2.y;
    			vdata[2] = P2.z;
    			glVertex3fv(&vdata[0]);
     
    			glColor3f(0.7f,0.7f,0.7f);
    			// 2 vecteurs du plan partant de P3
    			V1.x = P1.x-P3.x;
    			V1.y = P1.y-P3.y;
    			V1.z = P1.z-P3.z;
     
    			V2.x = P2.x-P3.x;
    			V2.y = P2.y-P3.y;
    			V2.z = P2.z-P3.z;
    			// produit scalaire
    			vdata[0] = (V1.y*V2.z)-(V1.z*V2.y);
    			vdata[1] = (V1.z*V2.x)-(V1.x*V2.z);
    			vdata[2] = (V1.x*V2.y)-(V1.y*V2.x);
    			norm = sqrt(vdata[0]*vdata[0] + vdata[1]*vdata[1] + vdata[2]*vdata[2]);
     
    			vdata[0]/=norm;
    			vdata[1]/=norm;
    			vdata[2]/=norm;
    			// normale en P3
    			glNormal3fv(&vdata[0]);
    			vdata[0] = P3.x;
    			vdata[1] = P3.y;
    			vdata[2] = P3.z;
    			glVertex3fv(&vdata[0]);
    		glEnd();
    Dois-je changer l'ordre des points ou calculer autrement les normales?

    Merci d'avance.

  2. #2
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Salut,

    j'ai juste survolé ton code, mais à priori tu calcules une normale par triangle, que tu appliques aux 3 sommets.

    Le problème vient de là, car comme tu as un mesh chaque sommet n'appartient pas à un mais à 8 triangles.

    ce qu'il faut faire:
    - pour chaque sommet, calculer la normale de chacun des 8 triangles auquel il appartient
    - faire la moyenne de ces 8 normales et l'appliquer à ce sommet

    pour des raisons évidentes de performance je te conseille de faire ce calcul une seule fois lors de la création de ton mesh, et de sauvegarder les normales pour chaque sommet

  3. #3
    Membre confirmé Avatar de LaDeveloppeuse
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Par défaut
    passé un certain nombre de triangle dans des maillages, mon pc affiche des truc de ce genre en me coloriant les triangle en bleu... C'est la faute a ma carte graphique qui n'est pas top...
    Serai-ce peut-être aussi ton soucis...

    Mais bon je ferai plus confiance au post du dessus lol

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 17
    Par défaut
    Merci pour ta réponse,

    ce qu'il faut faire:
    - pour chaque sommet, calculer la normale de chacun des 8 triangles auquel il appartient
    - faire la moyenne de ces 8 normales et l'appliquer à ce sommet
    Il serait peut être plus simple de calculer la normale moyenne des 3 points et l'appliquer sur la face? enfin si on peut définir une normale par triangle (ou face)?

    Un truc comme ça est-il possible?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    glBegin();
        glColor3f(0.7f,0.7f,0.7f);
        glNormal3fv(&vdata[0]); // normale au triangle\face
        glVertex3fv(&vdata[0]); // p1
        glVertex3fv(&vdata[0]); // P2
        glVertex3fv(&vdata[0]); // P3
    glEnd();

  5. #5
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Non désolé mais à ma connaissance tu ne peux qu'assigner les normales par vertex.

    Et de toute facon, appliquer la normale du triangle en question à tout ton triangle c exactement la même chose que ce que tu fais dans ta méthode présentée dans le 1er post: tu as beau recalculer la normale pour chaque point avec a chaque fois 2 vecteurs différents, au final tes 3 normales, une fois normalisées, sont les mêmes puisque tous tes vecteurs sont dans le même plan (même triangle...)

    T'inquietes, ca peut paraître un peu lourd de devoir moyenner sur 8 triangles pour chaque vertex mais tu ne le fais qu'une fois au début. C un peu de code à écrire mais bon, je ne vois pas comment faire autrement

Discussions similaires

  1. Probleme rendu d'une application GWT
    Par passion_info dans le forum GWT et Vaadin
    Réponses: 1
    Dernier message: 25/11/2010, 12h12
  2. [2.5.1] Probleme rendu pdf
    Par reportPer dans le forum BIRT
    Réponses: 15
    Dernier message: 14/10/2009, 16h13
  3. [C#] problème rendu custom web control
    Par Johnny Boy dans le forum ASP.NET
    Réponses: 1
    Dernier message: 08/03/2006, 17h23
  4. probleme de rendu de lumiere couleur metal
    Par dnaprotector dans le forum OpenGL
    Réponses: 4
    Dernier message: 12/07/2005, 01h11
  5. [COULEUR + LUMIERE] Probleme de rendu
    Par gamerome dans le forum OpenGL
    Réponses: 3
    Dernier message: 06/07/2005, 18h57

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