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 :

OpenGL et les normales


Sujet :

OpenGL

  1. #21
    Membre actif Avatar de Robxley
    Homme Profil pro
    Docteur ingénieur traitement d'image
    Inscrit en
    Mai 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Docteur ingénieur traitement d'image

    Informations forums :
    Inscription : Mai 2009
    Messages : 158
    Points : 228
    Points
    228
    Par défaut
    Moi c'est matlab qui m'a dit : "Warning: Matrix is close to singular or badly scaled.", donc j'ai testé le déterminant sous matlab qui me donne bien 0. Je sais que matlab donne aussi un résultat pour les matrices non inversible qui est une approximation de la transformé inverse mais avec ce warning, ça doit être pareil sous octave, mais pas de warning peut être

    Après j'utilise pas octave donc je peux me tromper.
    Rien ne sert de courir, mieux vaut partir à point. Programmer aussi d'ailleurs.
    Surtout, mais surtout pas d’astuces !
    Pas de bras, pas de chocolat. Les deux mains sur le clavier.

  2. #22
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Pour l'inverse de la matrice, tu as raison. J'utlise pinv() qui donne toujours un résultat


    Un peu de lecture dans les livres...

    Dans OpenGL SuperBible :
    Instead, we usually pass in a normal matrix as a uniform, which consists of just the rotational component of the Modelview matrix.
    Donc juste une transposition.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    in vec3 vNormal;
    uniform mat 3 normalMatrix;
     
    vec3 vEyeNormal = normalMatrix * vNormal;
    float diff = max(0.0, dot(vEyeNormal, vLightDir));
    Dans Interactive Computer Graphics :
    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
    // matrice model vue
    point4 at( 0.0, 0.0, 0.0, 1.0 );
    point4 eye( 0.0, 0.0, 2.0, 1.0 );
    vec4 up( 0.0, 1.0, 0.0, 0.0 );
    mat4 model_view = LookAt( eye, at, up );
    glUniformMatrix4fv( ModelView, 16, GL_TRUE, model_view );
     
    // matrice projection
    mat4 projection = Ortho( left, right, bottom, top, zNear, zFar );
    glUniformMatrix4fv( Projection, 1, GL_TRUE, projection );
     
    // shader
    vec3 vNormal;
    uniform mat4 ModelView;
     
    vec3 N = normalize( ModelView*vec4(vNormal, 0.0) ).xyz;
    Donc pas d'inverse et de transposition ici...


    L'explication est dans OpenGL SuperGuide :
    Now that we have the normal, we can determine whether it faces toward or away from our user-defined viewpoint. To do this, we need to transform the normal into the same coordinate space as the viewpoint, which is world space. Assuming we have the modelview matrix in a uniform, simply multiply the normal by this matrix. To be more accurate, we should multiply the vector by the inverse of the transpose of the upper left three-by-three submatrix of the modelview matrix. This is known as the normal matrix, and you’re free to implement this and put it in its own uniform if you like. However, if your modelview matrix only contains translation, uniform scale (no shear), and rotation, you can use it directly. Don’t forget, the normal is a three-element vector, and the modelview matrix is a four-by-four matrix. We need to extend the normal to a four-element vector before we can multiply the two. We can then take the dot product of the resulting vector with the vector from the viewpoint to any point on the triangle.
    Maintenant que nous avons la normale, nous pouvons déterminer si elle est tournée dans la direction ou à l'opposée du point de vue de l'utilisateur. Pour faire cela, nous devons transformer la normale dans le même espace de coordonnées que le point de vue, qui est l'espace "world". En supposant que nous avons la matrice modèle-vue dans un uniform, il suffit de multiplier la normale par cette matrice. Pour être plus précis, nous devrions multiplier le vecteur par l'inverse de la transposition de la sous-matrice trois par trois de la partie supérieure gauche de la matrice modèle-vue. Ceci est connu comme étant la matrice normale et vous êtes libre de mettre en œuvre cela et la mettre dans son propre uniform, si vous le souhaitez. Toutefois, si votre matrice modèle-vue ne contient que des translations, des mise à l'échelle uniforme (pas de cisaillement) et des rotation, vous pouvez l'utiliser directement. N'oubliez pas, la normale est un vecteur à trois éléments et la matrice modèle-vue est une matrice quatre par quatre. Nous avons besoin de convertir la normale en un vecteur de quatre éléments avant de pouvoir multiplier les deux. On peut alors prendre le produit scalaire entre le vecteur résultant et le vecteur dans l'espace du point de vue de n'importe quel point sur ​​le triangle
    Donc, si on utilise des transformations "classiques", on fait un peu comme on veut

    Par contre, si quelqu'un sait ce qu'est le shear dont il est question ?

  3. #23
    Membre éprouvé
    Homme Profil pro
    Ingénieur 3D
    Inscrit en
    Avril 2008
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur 3D

    Informations forums :
    Inscription : Avril 2008
    Messages : 400
    Points : 968
    Points
    968
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Par contre, si quelqu'un sait ce qu'est le shear dont il est question ?
    C'est quand tu fais un scale de valeur différente sur différents axes. Penses a une face qui aurait une rotation de 45 degrés sur l'axe Z. Si tu fais un scale de 200% sur l'axe x, la composante x de la normale sera doublée alors qu'en réalité elle aurait du diminuer (puisque la face est maintenant un peu plus horizontale qu'avant).

  4. #24
    Membre actif Avatar de Robxley
    Homme Profil pro
    Docteur ingénieur traitement d'image
    Inscrit en
    Mai 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Docteur ingénieur traitement d'image

    Informations forums :
    Inscription : Mai 2009
    Messages : 158
    Points : 228
    Points
    228
    Par défaut
    Pour le no shear c'est pas le fait de mettre une valeur de scale à 0 ?

    Edit : j'ai rien dit
    Rien ne sert de courir, mieux vaut partir à point. Programmer aussi d'ailleurs.
    Surtout, mais surtout pas d’astuces !
    Pas de bras, pas de chocolat. Les deux mains sur le clavier.

  5. #25
    Membre régulier Avatar de Sahengette
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 79
    Points : 94
    Points
    94
    Par défaut
    Super réponse, donc en fait tant que je n'utilise pas de scale non-uniforme, je peux utiliser la matrice modelview directement sur la normale ?
    Ca tombe bien car je n'utilise pas de scale du tout .
    Et au fait pour transformer ma normale vec3 en vec4, il faut que je lui rajoute un composant w qui vaut 1 ou 0 ?

  6. #26
    Membre actif Avatar de Robxley
    Homme Profil pro
    Docteur ingénieur traitement d'image
    Inscrit en
    Mai 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Docteur ingénieur traitement d'image

    Informations forums :
    Inscription : Mai 2009
    Messages : 158
    Points : 228
    Points
    228
    Par défaut
    Et au fait pour transformer ma normale vec3 en vec4, il faut que je lui rajoute un composant w qui vaut 1 ou 0 ?
    Composante w à 0.

    Tu peux rester avec la matrice mat3 et vec3 si tu préféres ça change rien, pour t'en convaincre fait le calcul par toi même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #version mat4*vec4
       a b c 0      x       ax + by + cz + 0*0
       d e f 0  *   y    =  dx + ey + fz + 0*0
       g h i 0      z       gx + hy + iz + 0*0
       0 0 0 1      0       0x + 0y + 0z + 0*1
     
    #version mat3*vec3
       a b c      x       ax + by + cz
       d e f  *   y    =  dx + ey + fz
       g h i      z       gx + hy + iz
    donc c'est pareil sauf que mat4*vec4 fait des calculs en plus. Par contre après point de vue GPU ca veut pas dire forcement que la version mat4*vec4 est plus lent, les GPU sont sensés être optimisés pour des calculs sur les mat4 et vec4 mais bon après pour savoir qui est le plus rapide des deux

    Et puis je ne suis pas sur que dans ton cas l'optimisation soit primordiale mais je peux me tromper.
    Rien ne sert de courir, mieux vaut partir à point. Programmer aussi d'ailleurs.
    Surtout, mais surtout pas d’astuces !
    Pas de bras, pas de chocolat. Les deux mains sur le clavier.

  7. #27
    Membre régulier Avatar de Sahengette
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 79
    Points : 94
    Points
    94
    Par défaut
    L'optimisation, c'est quand j'aurais un truc qui fonctionne, donc ca peut attendre

    Donc si je résume, il faut que dés le chargement du mesh, je me débrouille pour calculer une normale par vertex, et pour la trouver, je la calcule à partir du triangle ou des normales de faces ?

  8. #28
    Membre éprouvé
    Homme Profil pro
    Ingénieur 3D
    Inscrit en
    Avril 2008
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur 3D

    Informations forums :
    Inscription : Avril 2008
    Messages : 400
    Points : 968
    Points
    968
    Par défaut
    Oui. Mais c'est que si tu veux des objets adoucis et pas de cubes.

  9. #29
    Membre régulier Avatar de Sahengette
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 79
    Points : 94
    Points
    94
    Par défaut
    OK, bon et bien maintenant j'ai tout pour commencer, c'est parti, je vous donne des retours ... dés que j'en ai.

  10. #30
    Membre actif Avatar de Robxley
    Homme Profil pro
    Docteur ingénieur traitement d'image
    Inscrit en
    Mai 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Docteur ingénieur traitement d'image

    Informations forums :
    Inscription : Mai 2009
    Messages : 158
    Points : 228
    Points
    228
    Par défaut
    En faite pour une surface non planes mais sans angles (une surface dérivable) on calcul une normale par vertex. Comme pour un visage, un terrain ou plus simplement une sphère.

    Après si ton objet possède des angles comme (un cube, pyramide) on calcul une normale par face.

    Mais si je me souviens bien avec le format .obj tu as directement les normales définies pour l'ensemble des 3 vertexs de ta face, genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    f v/n v/n v/n
    f 5/10 4/12 7/8    //pas la même normal, surface "adoucie"
    f 5/10 4/10 7/10  //même normal, surface "non adoucie"
    Normalement ce lissage il est fait sous ton modeleur 3D (tu peux avoir un cube et une sphère dans ton .obj avec l'un normale adouci et l'autre non). Je ne pense pas qu'il soit nécessaire de t’embêter à savoir si tu veux des normales adoucies ou pas tu prends celle qui sont données dans le fichier, c'est le plus simple. Et tu as bien une normale associé à chaque vertex.
    Rien ne sert de courir, mieux vaut partir à point. Programmer aussi d'ailleurs.
    Surtout, mais surtout pas d’astuces !
    Pas de bras, pas de chocolat. Les deux mains sur le clavier.

  11. #31
    Membre régulier Avatar de Sahengette
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 79
    Points : 94
    Points
    94
    Par défaut
    Aargh, je retombe case départ :
    Mon mesh est effectivement déjà en "smooth".
    Comment je dois faire pour récuperer mes vertices et mes normales pour les envoyer, sachant que j'ai deux tableaux d'indices (un pour les positions, l'autre pour les normales) ?

    En effet quand je dessine avec OpenGL, je donne mes vertices et mes normales comme elles sont et SEULEMENT APRES, je lui donne UN tableau d'indices, et seulement pour les positions !

    Ma question est donc, comment envoyer ces fichus normales AVEC mes fichus positions, sachant que ces deux attributs sont indéxés séparement ?

  12. #32
    Membre éprouvé
    Homme Profil pro
    Ingénieur 3D
    Inscrit en
    Avril 2008
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur 3D

    Informations forums :
    Inscription : Avril 2008
    Messages : 400
    Points : 968
    Points
    968
    Par défaut
    Il faut réorganiser tes normales pour qu'elles coïncident avec les positions, donc en gros, les normales dans le fichier ne servent pas a grand chose en l’état.

Discussions similaires

  1. Probleme avec les normales! :(
    Par Happy dans le forum OpenGL
    Réponses: 4
    Dernier message: 09/08/2006, 18h46
  2. OpenGL et les cartes multi-écrans
    Par jcs2 dans le forum OpenGL
    Réponses: 1
    Dernier message: 14/02/2006, 14h08
  3. Question théorique sur les normales
    Par Pedro dans le forum DirectX
    Réponses: 5
    Dernier message: 16/10/2005, 19h24
  4. Inverser toutes les normales
    Par Pedro dans le forum DirectX
    Réponses: 2
    Dernier message: 13/01/2005, 13h53
  5. OpenGL et les ATI ?
    Par Twofy dans le forum OpenGL
    Réponses: 4
    Dernier message: 11/09/2002, 16h13

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