Partage
  • Partager sur Facebook
  • Partager sur Twitter

Normales de points en Opengl

Sujet résolu
    9 juin 2008 à 14:20:47

    Bonjour a tous ami(e)s Zeros,

    Quelqu'un pourrait t'il m'expliquer comment on calcul la normal d'un point svp ?(pour l'instant je l'utilise dans le cas du smooth shading).

    En fait je sais comment faire pour une face, comme un carré par exemple, mais j'ai beacoup de mal a me représenter géométriquement la normale d'un point, comme dans une sphere par exemple.

    Merci d'avance ^^
    • Partager sur Facebook
    • Partager sur Twitter
      9 juin 2008 à 14:24:13

      un algo automatique pour calculer la normale a un point, dans un mesh, c'est d'abord de calculer la normale de chaque triangle (avec un produit vectoriel)
      Puis ensuite, pour un sommet donné, recencer les triangles dont il fait parti, et faire la moyenne des normales de chacun de ces triangles.
      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        9 juin 2008 à 14:35:56

        ok merci beaucoup beaucoup beaucoup ^^
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          9 juin 2008 à 22:21:15

          escuser moi d'intervenir et pire de poser des questions ridicules... Mais en fait, j'ai souvent vu le concept de normale sans jamais comprendre de quoi il s'agissait vraiment et surtout ... Comment ou la calcule. Bizaremrnt, j'ai vu les vecteur mais ma prof de math a été incapable de m'explique ce s'était la normale d'une surface...

          Alors, quel est le procédé mathématique ?

          Merci !
          • Partager sur Facebook
          • Partager sur Twitter
            9 juin 2008 à 23:02:37

            C'est le vecteur perpendiculaire a la surface

            par exemple pour une surface avec les 4 points :

            A(1,1,1)
            B(1,1,-1)
            C(1,-1,1)
            D(1,-1,-1)

            Sa normale est : (1,0,0).(En gros c'est ca)


            • Partager sur Facebook
            • Partager sur Twitter
              10 juin 2008 à 0:12:59

              Sur ma page, j'ai un paragraphe sur les normales.

              http://perso.numericable.fr/fvirtman/t [...] im/index.html

              Ta prof n'a probablement pas fait d'image de synthese, ça ne veut pas dire qu'elle est nulle.
              La normale a une surface est orthogonale a la surface.

              Elle va servir pour un calcul d'éclairage, mais aussi, par exemple, pour gérer des rebonds !
              Si par exemple, tu veux rebondir contre une surface, la normal a cette surface, au point de rebond, sera la bissectrice entre ta direction d'arrivée et ta direction de rebond :)
              • Partager sur Facebook
              • Partager sur Twitter

              Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

              Anonyme
                10 juin 2008 à 14:12:51

                ok...mais mathématiquement, c'est quoi la formule ? Parce que pour moi, ab x ac, c'est un produitscalaire et ça donne un réel, pas un vecteur. Et la notation ab^ac, je connais pas! Donc, je vous demanderai juste comment on fait un produit vectoriel. Tout bêtement en multipliant ses coordonnées une a une ? Et c'est ca la normale ?
                • Partager sur Facebook
                • Partager sur Twitter
                  10 juin 2008 à 14:24:05

                  Pour le produit vectoriel en dimension 3 :

                  <math>\(\vec{a} \times \vec{b} = \begin{pmatrix}x_a \\ y_a \\ z_a\end{pmatrix} \times \begin{pmatrix}x_b \\ y_b \\ z_b\end{pmatrix} = \begin{pmatrix}y_a z_b - z_a y_b \\ z_a x_b - x_a z_b \\ x_a y_b - y_a x_b\end{pmatrix}\)</math>

                  Voilà, je pense que je ne me suis pas trompé.

                  EDIT : j'ai lu un peu plus haut qu'on parlait de "moyenne des normales des surfaces dont fait partie le point"...
                  Attention !! Ca dépend beaucoup du sens des normales !
                  Le produit vectoriel n'est pas commutatif : <math>\(\vec{a} \times \vec{b} = - \left(\vec{b} \times \vec{a}\right)\)</math>

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Zeste de Savoir, le site qui en a dans le citron !
                  Anonyme
                    10 juin 2008 à 17:09:15

                    je commence a cmprendre... Maintenant, ça c'est pour 2 vecteur. Pour trois 4 ou plus ... Est ce que par exemple :
                    a^b^c = (a^b)^c ? En gros, est ce que on doit d'abord calculer le produit des 2 premier avant de faire le résultat par le troisieme? Ou est ce que on doit le faire direct dans la formule... ? Ce qui la rendrait plus compliquée. C'est pas grave, mais j'aimerai savoir comment elle est transformée.

                    Note 1: j'ai jamais vu moi ça! Et pourtant je suis en math fortes vous en êtes ou au niveau scolaire ? Et vous en étiez ou quand vous avez après ça ? Flou!

                    Note 2 : wikipedia, c'est compreensible mais vachement hard. Je vais prendre une aspirine !
                    • Partager sur Facebook
                    • Partager sur Twitter
                      10 juin 2008 à 17:22:34

                      Citation : pierre_24

                      je commence a cmprendre... Maintenant, ça c'est pour 2 vecteur. Pour trois 4 ou plus ... Est ce que par exemple :
                      a^b^c = (a^b)^c ?


                      ????? le produit vectoriel permet de donner un vecteur normale à ces deux vecteur. Donc (a^b) donne une normal à a et b et (a^b)^c donne une normale à (a^b) et c. Ce n'est pas la même chose
                      Ce que l'on t'as dit est de faire une normale sur chaque surface contenant un point(utilisant deux vecteur contenant ce point par surface) et ensuite de faire la somme de toute ces normales et ensuite de normaliser. Cela te donnera une approximation de la normal au point


                      Citation

                      Note 1: j'ai jamais vu moi ça! Et pourtant je suis en math fortes vous en êtes ou au niveau scolaire ? Et vous en étiez ou quand vous avez après ça ? Flou!


                      IUT
                      • Partager sur Facebook
                      • Partager sur Twitter
                        10 juin 2008 à 17:32:48

                        En effet, dans ton cas, il est inutile de faire plusieurs produits vectoriels dans ton cas, comme l'a dit justement mongaulois.

                        Citation

                        Note 1: j'ai jamais vu moi ça! Et pourtant je suis en math fortes vous en êtes ou au niveau scolaire ? Et vous en étiez ou quand vous avez après ça ? Flou!



                        Sur le monde du travail, bac +5 en maths/informatique spécialité imagerie
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                        Anonyme
                          10 juin 2008 à 17:40:59

                          on renormalise après somme des normale ? Mais avec quel deuxième vecteur ?

                          Note : a je suis rassuré! Il est donc logique que je n'ai pas vu ça! Je suis encore dans le général!
                          • Partager sur Facebook
                          • Partager sur Twitter
                            10 juin 2008 à 17:44:58

                            Citation : pierre_24

                            je commence a cmprendre... Maintenant, ça c'est pour 2 vecteur. Pour trois 4 ou plus ... Est ce que par exemple :
                            a^b^c = (a^b)^c ? En gros, est ce que on doit d'abord calculer le produit des 2 premier avant de faire le résultat par le troisieme? Ou est ce que on doit le faire direct dans la formule... ? Ce qui la rendrait plus compliquée. C'est pas grave, mais j'aimerai savoir comment elle est transformée.



                            oui le produit vectoriel est associatif :

                            <math>\(\vec a \times \vec b \times \vec c = \left( \vec a \times \vec b \right) \times \vec c = \vec a \times \left( \vec b \times \vec c \right)\)</math>

                            Citation : pierre_24


                            Note 1: j'ai jamais vu moi ça! Et pourtant je suis en math fortes vous en êtes ou au niveau scolaire ? Et vous en étiez ou quand vous avez après ça ? Flou!

                            Note 2 : wikipedia, c'est compreensible mais vachement hard. Je vais prendre une aspirine !



                            Je termine un Master de recherche en mathématiques/informatique donc Bac+5 bientôt en thèse :p .
                            Sinon le produit vectoriel j'ai vu ça en tout début de première année de prépa (maths sup MPSI) .

                            Attention quand même : le produit vectoriel de deux vecteurs donne un vecteur de direction normale aux deux autres, mais pour que ce soit une "normale" il faut que la norme du résultat soit égale à 1, et donc que les deux vecteurs que l'on multiplie soient unitaires ( = de norme égale à 1).

                            EDIT : Oups, j'avais dit une bêtise :p
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Zeste de Savoir, le site qui en a dans le citron !
                              10 juin 2008 à 17:55:02

                              par exemple
                              ....e
                              .../|
                              ../.|
                              ./..|
                              a---d
                              |\..|
                              |.\.|
                              |..\|
                              b---c
                              tu as trois surfaces (imagine en 3D en non coplanaire bien sûre) abc, acd et ade.
                              Pour calculer la norme en a, tu calcul la norme des trois surface :
                              v1 = ab^ac
                              v2 = ac^ad
                              v3 = ad^ae

                              ensuite ta norme en a sera
                              Va =v1 +v2 +v3
                              Il suffit de la normer.
                              Attention
                              ab^ac = -1 * ac^ab


                              Aprés tout dépend comment tu utilise les normale bien sur. Le fait d'utiliser des normales aux sommet améliore le rendu car tu pourra ainsi calculer une norme différente sur chaque point de la surface
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                10 juin 2008 à 20:36:58

                                voilà, j'ai pigé ... Merci a tous !
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  10 juin 2008 à 23:27:05

                                  "car tu pourra ainsi calculer une norme différente sur chaque point de la surface"

                                  Je ne suis pas tout a fait d'accord, le lissage utilisé (sans shaders) est celui de Gouraud. c'est a dire qu'a chaque sommet de chaque triangle, en fonction de la normale et de la lumiere, est calculé une couleur, et Gouraud fait une interpolation entre les 3 couleurs des sommets
                                  C'est a dire qu'il n'y a pas de normale sur toute la surface, mais un dégradé, interpolation des couleurs des sommets.

                                  Avec les shaders, on peut faire le lissage de Phong, qui lui interpole les normales, et recalcule pour chaque pixel la couleur en fonction de la lumiere. C'est bien sur infiniment plus calculatoire, mais plus "parfait" si j'ose dire. Meme si Gouraud a longtemps été l'algo pas trop calculatoire qui permettait de tres bons rendus
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                                    11 juin 2008 à 0:01:12

                                    ahhhh les espaces vectoriels muni de l'addition et de la multiplication par un scalaire, quels bons souvenirs ça faire surgir en moi, j'en suis tout emoustillé ^^
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      11 juin 2008 à 0:17:42


                                      Citation

                                      Je ne suis pas tout a fait d'accord, le lissage utilisé (sans shaders) est celui de Gouraud



                                      C'est un rendu comme un autre.
                                      Mais indirectement (mais de moins bonne facture certes) ca reviens à modifier la normale pour les point d'une surface.
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Normales de points en Opengl

                                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                      • Editeur
                                      • Markdown