Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ligne écrite sous forme paramétrique

Sujet résolu
    13 septembre 2018 à 12:45:55

    Bonjour à tous,

    Je viens vers vous car j'ai un petit souci de compréhension, j'aimerai essayer d'implémenter un système de Raycasting pour simuler des ombres dans un petit jeu 2D.

    Le souci c'est que je bloque au niveau de l'équation de droite "paramétrique", pour le moment j'ai toujours manipulé les droites avec cette équation : y = mx + p. Mais dans l'exemple que j'ai trouvé, l'auteur dit qu'il est possible d'écrire une équation de droite sous forme paramétrique de cette manière : Point + Direction * T.

    L'article si besoin : https://ncase.me/sight-and-light/

    Pour le coup j'ai un peu de mal à saisir à quoi correspond "Direction", c'est censé représenté le coeff' directeur ?

    Bon je précise quand même que je fais ça pour le plaisir et que je ne manipule pas les Math tous les jours, j'ai juste quelques bases ^^.

    Merci.

    -
    Edité par Guit0Xx 13 septembre 2018 à 12:46:57

    • Partager sur Facebook
    • Partager sur Twitter

    ...

      13 septembre 2018 à 13:06:24

      Salut,

      non, ici la direction est le vecteur qui porte ta droite, appelons \(\vec{u}\). Tu as ensuite besoin de connaître un unique point \(p\) par lequel ta droite passe et qui va servir en quelque sorte d'origine. Du coup, ta droite est l'ensemble des points \(y\) tels que

      \(y = t\vec{u}+p\)

      quand \(t\) va de moins l'infini à plus l'infini. Pour faire le lien avec l'expression classique, et en reprenant tes notations,

      \(\begin{bmatrix}y_1 \\ y2\end{bmatrix} = \begin{bmatrix}1 \\ m\end{bmatrix}\cdot x + \begin{bmatrix}0 \\ p\end{bmatrix}\).

      Tu remarques que \(y_1\) s'identifie à \(x\) et \(y_2\) à \(y\).

      -
      Edité par Nozio 13 septembre 2018 à 13:08:33

      • Partager sur Facebook
      • Partager sur Twitter

      Avez-vous entendu parler de Julia ? Laissez-vous tenter ...

        13 septembre 2018 à 15:41:19

        En d'autres mots, moins mathématiques, quand tu as une droite écrite sous la forme y = ax+b, c'est ok, ça te donne une droite. Mais dans cette droite, il n'y a pas un début clairement défini, et pas une fin clairement définie (c'est moins important, en général, c'est surtout le début qui est intéressant), et il n'y a pas d'orientation. Que tu parcoures ta droite dans un sens ou dans l'autre, son équation est la même. Tu n'as pas non plus de notion de vitesse, tu as une seule équation, que tu marches le long de cette droite, ou que tu coures.

        Dans le domaine du jeu, on a besoin de ces notions de vitesse et de direction.

        On va donc avoir nos 2 variables x et y, et une variable t en plus (t représente le temps)

        Quand t vaut 0, c'est le début du jeu, ou le début du déplacement. On a donc un point de départ sur notre droite (ce qu'on n'avait pas dans l'équation y = ax+b). Le point de départ, je vais le noter (X0,Y0)

        Et ensuite, quand t est positif, x et y peuvent se calculer par :

        x = X0+t*Vx   et y = Y0+t*Vy

        t est le temps. Plus t grandit, plus le joueur s'éloigne de la position initiale. t est compté par exemple en dixièmes de secondes.

        X0 et Y0, c'est la position initiale du joueur.

        Vx et Vy, c'est la vitesse décomposée en vitesse sur l'axe des X et vitesse sur l'axe des Y.

        La formule que j'ai donnée, c'est quand la vitesse est constante. Si la vitesse peut varier, c'est un peu plus compliqué.

        • Partager sur Facebook
        • Partager sur Twitter
          13 septembre 2018 à 16:32:40

          Nozio a écrit:

          non, ici la direction est le vecteur qui porte ta droite

          Bon, je vais étudier les vecteurs parce que déjà rien qu'avec cette phrase tu m'a perdu ^^. La dernière fois que j'ai manipulé des vecteurs remonte à des années lumières. Et du coup j'ai un peu de mal à comprendre la suite.

          tbc92 a écrit:

          Dans le domaine du jeu, on a besoin de ces notions de vitesse et de direction.
          ...
          La formule que j'ai donnée, c'est quand la vitesse est constante. Si la vitesse peut varier, c'est un peu plus compliqué.

          Pour ça pas de soucis, quand il s'agit de déplacement, je multiplie une vitesse constante par le temps d'exécution d'une frame (qui peut varier), ce qui me donne une distance proportionnelle au temps que j'ajoute à la position initiale au moment du calcul. Donc quelque soit le temps d'exécution d'une frame, le déplacement est uniforme. Sauf dans le cas d'un plateformer où je fait varier la vélocité Y dans le temps pour simuler une "pseudo-gravité".

          En revanche dans le cas présent, à moins d'avoir mal compris l'article, je n'ai pas besoin du temps pour les calculs. Typiquement un rayon est une droite, ayant une direction et un sens, et les blocs sur lesquels cette droite doit s'arrêter sont composés de segments. Donc le but final sera de trouver si il y'a intersection entre le rayon et le segment d'un bloc puis agir en conséquence sur le rayon. Ou aurai-je mal compris ? :-°

          -
          Edité par Guit0Xx 13 septembre 2018 à 16:43:31

          • Partager sur Facebook
          • Partager sur Twitter

          ...

            15 septembre 2018 à 9:07:43

            Guit0Xx a écrit:

            En revanche dans le cas présent, à moins d'avoir mal compris l'article, je n'ai pas besoin du temps pour les calculs. Typiquement un rayon est une droite, ayant une direction et un sens, et les blocs sur lesquels cette droite doit s'arrêter sont composés de segments. Donc le but final sera de trouver si il y'a intersection entre le rayon et le segment d'un bloc puis agir en conséquence sur le rayon. Ou aurai-je mal compris ? :-°

            -
            Edité par Guit0Xx 13 septembre 2018 à 16:43:31


            Effectivement, ici le temps n'intervient pas. L'objectif final  est de déterminer les zones de lumière et d'ombre crées par une source positionnée en \((r_{px}, r_{py})\) . C'est donc une "simple" recherche d'intersections droites_segments.

            Qu'est ce qui te bloque ? Ce qu'a dit Nozio, c'est exactement ce que fait l'auteur où \(p=(r_{px}, r_{py})\)  et \(\vec{u}=(r_{dx}, r_{dy})\)  et \(t=T_1\). Cette forme paramétrique vectorielle revient à écrire que la droite passe par  \(p=(r_{px}, r_{py})\) (\(T_1=0\)) et le point courant de la droite est obtenu en ajoutant un vecteur  arbitraire colinéaire au vecteur  \(\vec{u}=(r_{dx}, r_{dy})\),en faisant varier le paramètre  \(T_1\) entre \(]-\infty,+\infty[\) . La forme vectorielle se traduit algébriquement par deux équations donnant une  relation pour chaque composante.
            Comme indiqué, on se limite à une demi-droite selon le vecteur directeur en imposant \(T_1 \geq 0\).

            On fait la même chose pour l'équation de la droite passant par les points d'extrémité du segment, la condition sur le paramètre \(T_2\) d'appartenance au segment étant \(0 \leq T_2 \leq 1\).

            L'intersection s'obtient en écrivant l'égalité des composantes ce qui donne deux équations linéaires entre \(T_1,T_2\) permettant de calculer la valeur des paramètres au point d'intersection  donc les coordonnées de ce point. L'intersection existe si les deux conditions \(T_1 \geq 0\) et  \(0 \leq T_2 \leq 0\) sont vérifiées.

            Les obstacles se limitent à des polygones dont j'imagine que on connait les coordonnées de leurs sommets, donc celles de chaque segment constitutif.

            Comme indiqué par l'auteur, il faut, pour chaque rayon,  une boucle testant chaque segment pour trouver l'intersection qui arrête le rayon. C'est celle pour laquelle \(T_2\) est minimum. L'arrêt est obtenu au plus loin sur le cadre s'il n'y a pas d'obstacle.

            Et il faut ensuite aussi une boucle faisant tourner le rayon sur 360°. Le plus simple me semble être de prendre le vecteur directeur unité \(\vec{u}=(\cos \theta, \sin \theta )\) et de faire varier \(\theta\) de 0 à 360° avec un pas selon la précision recherchée.

            -
            Edité par Sennacherib 15 septembre 2018 à 14:20:10

            • Partager sur Facebook
            • Partager sur Twitter
            tout ce qui est simple est faux, tout ce qui est compliqué est inutilisable
              15 septembre 2018 à 13:52:42

              Sennacherib a écrit:

              Qu'est ce qui te bloque ?

              C'est cette forme paramétrique vectorielle qui me bloquait. Mais depuis j'ai regardé 2-3 cours sur le net pour me faire la main avec les vecteurs et ça devrait aller ^^.

              Donc pour le moment si je comprends bien, ici \(T_1\) n'est qu'un simple scalaire que l'on fait varier pour agrandir le vecteur unitaire \(\vec{u}\) ?

              Sennacherib a écrit:

              On fait la même chose pour l'équation de la droite passant par les points d'extrémité du segment, la condition sur le paramètre \(T_2\)d'appartenance au segment étant \(0 \leq T_2 \leq 0\).

              Ce ne serait pas plutôt \(0 \leq T_2 \leq 1\) ?

              Sennacherib a écrit:

              Les obstacles se limitent à des polygones dont j'imagine que on connait les coordonnées de leurs sommets, donc celles de chaque segment constitutif.

              Effectivement, pour être plus précis je n'utilise que des rectangles pour le moment.

              Sennacherib a écrit:

              Et il faut ensuite aussi une boucle faisant tourner le rayon sur 360°. Le plus simple me semble être de prendre le vecteur directeur unité \(\vec{u}=(\cos \theta, \sin \theta )\) et de faire varier \(\theta\) de 0 à 360° avec un pas selon la précision recherchée.

              Ah mais on peut utiliser l'angle d'une droite pour construire un vecteur ? Si c'est le cas ça m'arrangerait fortement ^^.

              Edit : Ah ba oui on peut suis-je bête c'est de la trigo ! Le pire c'est que je m'en sers pour construire les rayons...

              -
              Edité par Guit0Xx 15 septembre 2018 à 14:01:04

              • Partager sur Facebook
              • Partager sur Twitter

              ...

                15 septembre 2018 à 14:17:22

                Guit0Xx a écrit:

                Sennacherib a écrit:

                On fait la même chose pour l'équation de la droite passant par les points d'extrémité du segment, la condition sur le paramètre \(T_2\)d'appartenance au segment étant \(0 \leq T_2 \leq 0\).

                Ce ne serait pas plutôt \(0 \leq T_2 \leq 1\) ?

                Edité par Guit0Xx il y a 12 minutes

                certes, simple faute de frappe ! je vais quand même corriger mon post ! :lol: 

                pour \(T_1\), tu comprends bien :p. Et \(T_2\), c'est la même chose sinon qu'il doit rester entre (0,1) pour que le point soit sur le segment.

                -
                Edité par Sennacherib 15 septembre 2018 à 14:21:23

                • Partager sur Facebook
                • Partager sur Twitter
                tout ce qui est simple est faux, tout ce qui est compliqué est inutilisable
                  15 septembre 2018 à 14:48:23

                  Super merci  ^^ !

                  -
                  Edité par Guit0Xx 15 septembre 2018 à 14:48:41

                  • Partager sur Facebook
                  • Partager sur Twitter

                  ...

                    18 septembre 2018 à 23:47:52

                    Bon et bien après quelques galères, j'ai enfin atteint mon objectif, ne reste plus qu'à peaufiner tout ça. Encore merci pour votre aide, sans quoi j'y serai probablement encore :) !

                    Un petit aperçu :

                    https://www.youtube.com/watch?v=sHbphGwIFAM

                    -
                    Edité par Guit0Xx 18 septembre 2018 à 23:54:17

                    • Partager sur Facebook
                    • Partager sur Twitter

                    ...

                    Ligne écrite sous forme paramétrique

                    × 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