Partage
  • Partager sur Facebook
  • Partager sur Twitter

les surfaces de Bézier

    2 août 2011 à 10:57:27

    Bonjour tout le monde,

    Voilà, je cherche désespérément depuis quelques jours à comprendre comment fonctionne les surfaces de Bézier. J'ai parfaitement (enfin je crois...) compris les courbes de Bézier. Certes, sans les formules (mais je préfère un bon schéma que des formules imbuvables) mais je butte vraiment sur les surfaces.
    Donc, ce que je demande ici, si ce n'est pas trop demandé, ce serait un schéma ou une petite animation expliquant très clairement et simplement ces surfaces. Ou quelque'un qui aurait la patience de m'expliquer ceci sans sortir de grosse formules.
    Ce qui m'a particulièrement aidé à comprendre les courbes de Bézier, c'est la petite animation flash sur Wikipedia: ici.
    Donc si vous êtes capable de m'expliquer ceci avec des explications dans ce style, merci d'avance.

    P.S.: J'ai un niveau fin de terminale STI (c'était pour vous donner un ordre d'idée de ce que je peux comprendre).
    • Partager sur Facebook
    • Partager sur Twitter
      5 août 2011 à 12:02:48

      Salut,

      Premier conseil : connaître à fond les courbes de Bézier. Y compris les formules compliquées.

      Citation : momo l'plus bô

      (mais je préfère un bon schéma que des formules imbuvables)

      Et quels schéma tu fais pour bien comprendre ce sujet sans aucune formules ?
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        5 août 2011 à 17:59:14

        Bonsoir,
        Pour compléter la remarque de tit-toinou, les courbes de Bezier pour quoi en faire?
        Cela pourrait aider à comprendre ce que tu cherches et mieux cibler une explication.

        Mais comprendre réellement cette démarche sans aucune formule (qui ne sont pas si compliquées d'ailleurs,...des polynômes selon un développement du type binome de Newton) me paraît une vue de l'esprit.

        Je ne vois pas bien ce que le gadget animé de Wikipedia apporte ( sa construction est d'ailleurs basée sur un calcul récursif expliquée plus loin et qui est sans doute le passage le moins simple de la page!)

        remarque:
        le principe en 3D est le même qu'en 2D ( avec des polynômes à 2 variables au lieu d'une)
        Donc comprendre parfaitement la courbe, cela devrait normalement permettre de comprendre la surface, au moins au niveau des principes.
        • Partager sur Facebook
        • Partager sur Twitter
          5 août 2011 à 20:27:04

          Bonjour tout le monde et merci de vos réponses.

          Citation

          Citation : tit-toinoi

          Et quels schéma tu fais pour bien comprendre ce sujet sans aucune formules ?


          Voici le schéma que j'utilise:
          Image utilisateur
          Je ne sais pas si il est très explicite, mais en gros, je prends une fraction, je la reporte sur chaque segment entre deux points côte à côte, je relis deux par deux les nouveaux points que j'ai créé, je recommence jusqu'à ce que je n'ai qu'un point. Celui-ce se trouvera sur la courbe. Je fais cela en incrémentant ma fraction: ex. 1/9 -> 2/9... jusqu'à 9/9.

          Citation : nabucos

          les courbes de Bezier pour quoi en faire?


          Mon but est de "lisser" une heighmap que j'ai réalisé.

          Et aussi:

          Citation : nabucos

          des polynômes selon un développement du type binome de Newton


          quésako??? J'ai rapidement regardé sur Wikipedia, c'est vrai que ça na pas l'air savant, mais je n'en vois pas l’intérêt.

          Et enfin:

          Citation : nabucos

          le principe en 3D est le même qu'en 2D ( avec des polynômes à 2 variables au lieu d'une)


          Un petit exemple pourrait peut-être être le bien venu... :o Parce que je ne vois pas comment je pourrais avoir 2 variables. (Après, c'est vrai qu'avec ma méthode, je n'en ai aucune).
          Pour en faire de la 3d, j'avais pensé faire ceci dans un sens sur ma heighmap pour trouver d'avantages de points dans un sens, refaire ceci dans l'autre sens et relier tout ça... C'est vrai que j'ai pensé que ça risquerais d'être un peu long en calcul. Mais avec ma "super" méthode, ça reste des calculs simple pour l'ordinateur.
          Je me trompe??? :euh:
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            5 août 2011 à 20:41:16

            Bonsoir,

            Citation

            Celui-ce se trouvera sur la courbe.



            Et comment justifies tu qu'il est sur la courbe si tu ne te raccroches pas aux formules ?
            • Partager sur Facebook
            • Partager sur Twitter
              5 août 2011 à 20:43:17

              Et bien c'est ce que j'ai compris avec wikipedia et les autres sites. Et vu que c'est le seul point qu'il me restera au bout d'un moment, c'est forcément celui-ci...
              Vrai ou faux??? :euh:
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                5 août 2011 à 21:23:21

                Bonsoir,

                Si tu fais vraiment de la surface de Bezier , tu as obligatoirement deux paramètres!
                Donc ce que tu cherches à faire en 3D, je ne le comprends pas bien mais ce n'est certainement pas de la surface de Bezier.
                Mais c'est peut être un ajustement qui suffit pour réaliser ce que tu cherches .En fait je n'en sais rien.
                Pour la courbe, tu sembles recopier Wikipédia sans vraiment comprendre le fond donc ... je ne suis pas sur que ton itération soit juste, mais si le point que tu trouves colle pour ton application...

                Aprés désolé, mais comme tu ne veux pas entendre parler du moindre calcul,
                je te cite

                Citation

                c'est vrai que ça na pas l'air savant, mais je n'en vois pas l’intérêt.


                je ne sais pas t'aider d'avantage sur la façon de faire vraiment "du Bézier" , encore moins sur un exemple en 3D !
                • Partager sur Facebook
                • Partager sur Twitter
                  5 août 2011 à 21:41:42

                  Je comprend tout à fait comment tu vois les courbes de Bézier. Mais ce n'est qu'une partie du sujet.

                  Avec ton truc, tout ce qu'on sait c'est qu'apparemment on a une courbe qui passe par les deux premiers points, et les autres points "influencent" la courbe. A quoi ça te sert ?
                  Le vrai intérêt des courbes de Bézier est que l'on décide des multiples dérivées au premier et dernier point. Avec quatre points par exemple, on décide la dérivée première du premier et dernier point (la vitesse de départ et la vitesse d'arrivée, vitesse = direction + sens + norme).

                  Un peu plus d'explications ici.

                  Pour finir, une courbe de Bézier ne passant pas par tous les points, ta surface de Bézier ne passera pas par tous les points de ta heightmap. Elle ne sera donc pas lissée comme tu le voulais, désolé.


                  Sinon pour passer de 2D à 3D il faut comprendre la paramétrisation en 2D par un indice temporel (le résultat est une courbe), puis passer par une paramétrisation en 3D par deux variables (le résultat est une surface).

                  Cependant si tu veux comprendre les surfaces de Bézier comme tu comprend les courbes de Bézier, j'imagine que tu peux faire le même raisonnement en 3D avec des "bouts" de plan au lieu de segment (= "bout" de droite).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 août 2011 à 10:56:43

                    Bon, je me suis mis au formules...

                    J'ai lu le sujet que m'a présenté tit-toinou, vraiment pas mal... :)
                    J'aurais juste une petite question, au risque de dire une grosse bêtise:
                    Lorsque je vois ceci pour un plan:

                    <math>\(\left( \begin{matrix} x(t) \\ y(t) \end{matrix} \right) = \left( \begin{matrix} x_0 (1 - t)^3 + 3 x_1 t (1 - t)^3 + 3 x_2 t^2 (1 - t) + x_3 t^3 \\ y_0 (1 - t)^3 + 3 y_1 t (1 - t)^3 + 3 y_2 t^2 (1 - t) + y_3 t^3 \end{matrix} \right)\)</math>

                    Est-ce que j'ai le droit de faire ceci pour une surface:

                    <math>\(\left( \begin{matrix} x(t) \\ y(t) \\ z(t) \end{matrix} \right) = \left( \begin{matrix} x_0 (1 - t)^3 + 3 x_1 t (1 - t)^3 + 3 x_2 t^2 (1 - t) + x_3 t^3 \\ y_0 (1 - t)^3 + 3 y_1 t (1 - t)^3 + 3 y_2 t^2 (1 - t) + y_3 t^3 \\ z_0 (1 - t)^3 + 3 z_1 t (1 - t)^3 + 3 z_2 t^2 (1 - t) + z_3 t^3 \end{matrix} \right)\)</math>

                    Mais à ce moment, il faut que je traite tout les points en même temps, et non seulement une ligne. Je me trompe??? :euh:
                    Et si j'ai bien compris, il suffit que je fasse ce calcul pour déterminer chaque point de ma heighmap? J'ai l'impression de dire une grosse bêtise... :euh::euh::euh:

                    Et j'avais bien compris que ma heighmap ne sera pas lissée en passant par tout les points, mais c'est ce que j'ai trouvé qui correspondait le mieux sans partir en sucette (comme les B-splines par exemple).
                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 août 2011 à 11:50:01

                      Citation : momo l'plus bô

                      Lorsque je vois ceci pour un plan:Est-ce que j'ai le droit de faire ceci pour une surface:


                      Non. Une variable = résultat uni dimensionnel = une courbe.
                      Après une courbe peut "vivre" dans une droite (1D), un plan (2D), un espace (3D), voire plus.
                      Donc la formule que tu as donnée c'est celle d'une courbe de Bézier cubique dans l'espace (et c'est <math>\(t(1-t)^2\)</math> pas <math>\(t(1-t)^3\)</math>).


                      Il faut que tu comprenne le paramétrage à deux variables. J'ai trouvé avec Google une animation très intéréssante. Cliques en bas sur l'animation Java, puis modifie la position de quelques points, puis séléctionnes "u,v parametrization". Enfin change les paramétres u et v (compris tous les deux entre 0 et 1, donc compris dans le "carré unité") en changeant la position du point en bas à droite.
                      Tu trouveras exactement ta façon de raisonner, mais en 2D cette fois-ci ;) .

                      Autre façon de voir les choses : imagines que avec un paramètre tu obtiennes une courbe (comme les courbes de Bézier). Maintenant avec un second paramètre(qui brasse aussi <math>\([0;1]\)</math>), l'ensemble des courbes dessine une surface.


                      Sinon réfléchis dans le plan à une courbe polynomiale paramétrée qui passerais par un ensemble de points donnés. Tu peux par exemple raccorder plusieurs courbes de Bézier cubiques. Indice : chaque point (à part le premier point et le dernier point) est à la fois le point de départ et le point d'arrivée de deux courbes de Bézier qui se raccordent parfaitement au niveau de la dérivée.

                      Après tu pourras trouver une surface polynomiale paramétrée dans l'espace qui passe par un ensemble de points donnés en adaptant la formule que tu as trouvée.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        6 août 2011 à 11:51:23

                        Le problème avec ta dernière formule, c'est que tu traites encore une ligne, mais qui se baladera dans l'espace au lieu de se balader dans un plan. Sans être un spécialiste des courbes et surface de bezier, je pense qu'il faut à la place de <math>\(t\)</math>, avoir deux paramètres <math>\(t_1\)</math> et <math>\(t_2\)</math> qui vont varier indépendamment l'un de l'autre.

                        Cela dit, c'est vrai que ton problème correspondrait plus à l'utilisation de B-spline, cela dit, pour lisser ta heighmap, il faut passer au moins par des B-splines d'ordre 2 ou 3, ce qui complique un peu les choses (les ordres 0 et 1 sont biens plus facile à mettre en place). Cela dit, vu que la précision sur les points de ta heighmap ne semble pas si importante pour toi (sinon tu ne passerais pas par les surfaces de Bezier), tu peux sauter le calcul préliminaire pour obtenir une méthode relativement simple.
                        Je peux t'expliquer plus en détail si cela t'intéresse.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          8 août 2011 à 10:36:04

                          Bonjour tout le monde, me revoilà,

                          Bon, je me suis mis au grosse formules imbuvable donnée par notre ami Wikipédia (l'anglais, bien sûr, qui était mieux fournit que le notre sur ce sujet).
                          Avant de les coder, je voulais être bien sûr de les avoir comprise.
                          Donc, sans oublier que je part d'une image pour en faire une heighmap:
                          Je commence par calculer le coefficient binomial:

                          <math>\(\left( \begin{matrix} n \\ i \end{matrix} \right) = \frac{n!}{i!(n-i)!}\)</math>
                          <math>\(\left( \begin{matrix} m \\ j \end{matrix} \right) = \frac{m!}{j!(m-j)!}\)</math>

                          • - où "n" = image->w (comme ce doit être compris entre 0 et 1, elle vaudra toujours 1).
                          • - où "i" et "j" sont des compteurs que j'incrémenterais pour une autre formule plus tard.
                          • - où "m" = image->h (toujours entre 0 et 1).

                          Pour calculer cette formule, je l'ai ramenée comme ceci:

                          <math>\(\left( \begin{matrix} n \\ i \end{matrix} \right) = \frac{n(n-1)(n-2)...(n-i+1)}{i}\)</math>

                          Après avoir calculer le coefficient binomial, je calcul le polynôme de Bernstein:
                          <math>\(B\begin{matrix} n \\ i \end{matrix}(u) = \left( \begin{matrix} n \\ i \end{matrix}\right)u^i(1-u)^{n-i}\)</math>
                          <math>\(B\begin{matrix} m \\ j \end{matrix}(v) = \left( \begin{matrix} m \\ j \end{matrix}\right)v^j(1-v)^{m-j}\)</math>

                          • -où "u" représente les coordonnées en x du nouveau point que je calcul.
                          • -où "v" représente les coordonnées en y du nouveau point que je calcul.


                          Enfin, je peux calculer les coordonnées en z de mon point grâce à la formule de Béziers:
                          <math>\(p(u,v) = \sum_{i=0}^n\sum_{j=0}^mB\begin{matrix} n \\ i \end{matrix}(u)B\begin{matrix} m \\ j \end{matrix}(v)Kij\)</math>

                          Ici, j'ai juste un doute: Est-ce que le <math>\(Kij\)</math> représente les coordonnées du point en i et j?

                          Donc une petite correction serait la bien venu. J'ai juste un petit doute sur la fin, sinon je pense que le reste est bon. Et après je pourrais commencer à coder tout ça...

                          Merci.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            13 août 2011 à 10:23:44

                            Il n'y a personne qui pourrait juste confirmer ce que j'ai écrit? :(
                            • Partager sur Facebook
                            • Partager sur Twitter
                              13 août 2011 à 13:37:10

                              Salut,

                              J'ai l'impression que tu n'as toujours pas compris ce que j'ai dit.

                              Le degré de ta surface polynomiale augmente avec le nombre de points et ça devient énorme à calculer (à part si ta heightmap c'est 8 points).
                              Il faut donc que tu relies plusieurs surfaces polynomiales entre elles (regarde par exemple un logiciel de dessin vectoriel qui relie les courbes cubique de Bézier entre elles, il faut que tu fasse pareil en plus dur).


                              Tes n et m ne sont pas compris entre 0 et 1, ce sont des entiers. Pour construire ta surface, tu as une grille de n*m points (ou (n+1)*(m+1) peu importe).

                              Citation

                              Ici, j'ai juste un doute: Est-ce que le représente les coordonnées du point en i et j?

                              Oui.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                14 août 2011 à 13:58:30

                                Merci de ta réponse,

                                Donc, si je comprends bien, il faut que je m'arrange pour que toutes les valeurs de ma heighmap soit comprise entre 0 et 1? sur touts les axes ou seulement sur la largeur et la longueur?

                                Et deuxième question: Est-ce que tu pourrais me donner une petite idée de départ pour relier des surfaces de Béziers entre-elles? Parce que je ne vois pas trop comment on peux retrouver ceci dans les calculs:

                                Citation : tit-toinou

                                Tu peux par exemple raccorder plusieurs courbes de Bézier cubiques. Indice : chaque point (à part le premier point et le dernier point) est à la fois le point de départ et le point d'arrivée de deux courbes de Bézier qui se raccordent parfaitement au niveau de la dérivée.



                                Merci.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  15 août 2011 à 11:14:03

                                  Pour ta première question je ne pense pas, tout dépend de comment tu implémenteras la formule mathématique.


                                  Je veux bien t'aider pour la version "courbe" (1D), à toi de trouver comment on fait en version "sufarce" (2D).

                                  Rappel : on cherche une fonction d'une courbe paramétrée dérivable passant par 3 points dans le plan (pour simplifier).
                                  Maintenant on va "séparer" notre problème en plusieurs... Ce que l'on cherche alors c'est 2 fonctions.
                                  La première devra passer par le premier point et le second point. La seconde devra passer par le second point et le troisième.
                                  Et pour que la courbe soit dérivable, il faut que les dérivées des deux fonctions se raccordent (soit égales) au second point.

                                  En fin de compte, on cherche une fonction <math>\(f : \mathbb{R} \rightarrow \mathbb{R}^2\)</math> telle que <math>\(f(0)=P_0\)</math>, <math>\(f(1)=P_1\)</math>, <math>\(f'(0)=\alpha\)</math> et <math>\(f'(1)=\beta\)</math> (attention ces nombres ont deux composantes puisqu'on est dans le plan, mais peu importe).
                                  Pour faire simple, on fixe deux valeurs de la fonction et deux valeurs de la dérivée de la fonction recherchée. En supposant qu'elle est polynomiale de degré 3, on tombe sur des courbes de Bézier cubiques (même si ça n'en a pas l'air, cf. autre topic).

                                  Si nos deux fonctions sont f et g, on aura : <math>\(f'(1)=g'(0)\)</math> (dérivées égale au second point). Maitenant que vaut justement cette dérivée ? N'importe quoi.
                                  Conseil pour que cela soit esthétique : que la dérivée soit proportionnelle à <math>\(P_2 - P_0\)</math> (d'où dans les calculs <math>\(f'(1)=k(P_2 - P_0), k \in \mathbb{R}\)</math>).

                                  Attention passer en 2D demande plus de connaissances que la Terminale S, puisqu'il faut savoir dériver avec deux variables.

                                  Même si tu n'appliques pas tout ce que j'ai dit et que tu veux juste implémenter la formule sans travail mathématique derrière, je te conseille d'essayer de programmer la version 1D pour bien comprendre (ce qui n'est déjà pas évident).
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  les surfaces de Bézier

                                  × 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