Partage
  • Partager sur Facebook
  • Partager sur Twitter

[XNA] Faire tourner une texture2D

Qui tombe (et c'est là que ça coince...)

    7 mai 2011 à 15:30:23

    Salut à tous les Zér0s :D

    Je suis actuellement en train de coder un jeu dont le principe est que tout est destructible dans l'environnement, comme dans le jeu Worms World Party. La différence vient du fait que les morceaux de décors qui se retrouvent détachés des bords de l'écran (suite à une explosion) tombent.
    Dès qu'ils rencontrent un autre morceau de décors, il s’arrête de tomber.

    Pour plus de réalisme, j'aimerais faire en sorte que si un morceau qui tombe rentre en collision avec un décors, la physique soit respectée. :lol:

    Comme rien ne vaut un petit schéma:
    Schema de al chte de decors


    En gros, je voudrais que le morceau qui tombe arrête de tomber uniquement que quand c'est physiquement possible (dans la réalité). :euh:
    Je sais déjà comment faire des rotations matricielles, mais la question que je me pose, c'est comment gérer le tout (sens de rotation, centre de la rotation...).

    Si vous avez une idée, je suis preneur :D
    Si vous voulez des éclaircissements, n'hésitez pas !!

    Merci beaucoup d'avance

    Cypher666
    • Partager sur Facebook
    • Partager sur Twitter
      7 mai 2011 à 15:53:55

      De la physique, c'est assez balaise quand même. Pour le centre de rotation, je dirais que tu dois le mettre dans ton cas en "Y = taTextureGrisClair.Height" et ton X en "tonSpriteGrisFonce.X"
      • Partager sur Facebook
      • Partager sur Twitter
        7 mai 2011 à 18:04:48

        Citation : Mangepain

        Pour le centre de rotation, je dirais que tu dois le mettre dans ton cas en "Y = taTextureGrisClair.Height" et ton X en "tonSpriteGrisFonce.X"


        Ca ne marche que dans le cas d'une figure simple. :euh:

        Voici exemple où ca ne marche pas:
        Schema Collapse 2
        • Partager sur Facebook
        • Partager sur Twitter
          8 mai 2011 à 0:47:02

          Bonjour,

          D'un point de vue de la théorie, on ne sait pas vraiment faire. Le problème est que les chocs font intervenir des forces que l'on ne sait pas calculer. Le Principe Fondamental de la Dynamique (théorème de la résultante dynamique + théorème du moment dynamique) n'est donc pas utilisable ici.

          Pour résoudre ce problème, on peut déjà utiliser les hypothèses suivantes :
          * conservation de la quantité de mouvement;
          * choc élastique (= conservation de l'énergie cinétique).

          Pour compléter ce modèle, il faut faire appel à l'expérience. C'est-à-dire un peu "truquer" les résultats en disant qu'on les connaît pour le cas particulier étudié.

          Voici quelques indications utiles :

          On va s'intéresser au choc de deux solides, notés 1 et 2, dans le référentiel (ta fenêtre) noté 0.

          Analyse du problème


          Données :
          * position du centre d'inertie d'un solide dans le plan : 2 composantes;
          * vitesse du centre d'inertie d'un solide dans le plan : 2 composantes;
          * position angulaire (orientation) d'un solide dans le plan : 1 composante (1 angle);
          * vitesse de rotation d'un solide dans le plan : 1 composante;

          On a donc 6 données pour chaque solide à l'instant t et on veut trouver la valeur de ces 6 paramètres à l'instant t+dt. On a donc 6 inconnues scalires. Le problème vient du fait que l'on est en mesure d'écrire que 3 équations scalires indépendantes. On aura donc besoin de l'expérience pour imposer 3 contraintes.

          Mise en équation



          Conservation de la quantité de mouvement


          <math>\(m_1 \, \vec{v}(G_1\in1/0)(t+\mathrm{d}t) \quad + \quad m_2 \, \vec{v}(G_2\in1/0)(t+\mathrm{d}t) \qquad = \qquad m_1 \, \vec{v}(G_1\in1/0)(t) \quad + \quad m_2 \, \vec{v}(G_2\in1/0)(t)\)</math>

          Il faut projeter cette équation sur tes deux axes <math>\(\vec{x}\)</math> et <math>\(\vec{y}\)</math> pour avoir déjà 2 équations scalaires.

          Conservation de l'énergie cinétique


          <math>\(Ec(1/0)(t+\mathrm{d}t) \quad + \quad Ec(2/0)(t+\mathrm{d}t) \qquad = \qquad Ec(1/0)(t) \quad + \quad Ec(2/0)(t)\)</math>

          Cela constitue la troisième équation scalaire que l'on est en mesure d'écrire.

          L'énergie cinétique du solide 1 par rapport à 0 s'écrit :

          <math>\(Ec(1/0) = \frac{1}{2} \, m_1 \, \left\|\vec{v}(A\in1/0)\right\|^2 \quad + \quad \frac{1}{2} \, \vec{\Omega}(1/0) \, . \, I(A,1)\left[\vec{\Omega}(1/0)\right] \quad + \quad \left(m_1 \, \vec{AG_1}, \ \vec{v}(A\in1/0), \ \vec{\Omega}(1/0)\right)\)</math>

          Aplliquée au point G1, elle s'écrit : <math>\(Ec(1/0) = \frac{1}{2} \, m_1 \, \left\|\vec{v}(G_1\in1/0)\right\|^2 \quad + \quad \frac{1}{2} \, \vec{\Omega}(1/0) \, . \, I(G_1,1)\left[\vec{\Omega}(1/0)\right]\)</math>

          <math>\(I(A,1)\)</math> est la matrice d'inertie du solide 1, exprimée au point A.

          La matrice d'inertie d'un solide S, exprimée dans la base <math>\((O, \, \vec{x}, \, \vec{y}, \, \vec{z})\)</math> vaut :
          <math>\(I(O,S) = \begin{pmatrix} A & -F & -E \\ -F & B & -D \\ -E & -D & C \end{pmatrix}_{(O, \, \vec{x}, \, \vec{y}, \, \vec{z})}\)</math>

          <math>\(A = \iiint_{M\in S} \! (y^2+z^2) \, \mathrm{d}m\)</math> est le moment d'inertie du solide S par rapport à l'axe <math>\((O, \vec{x})\)</math>.

          <math>\(B = \iiint_{M\in S} \! (x^2+z^2) \, \mathrm{d}m\)</math> est le moment d'inertie du solide S par rapport à l'axe <math>\((O, \vec{y})\)</math>.

          <math>\(C = \iiint_{M\in S} \! (x^2+y^2) \, \mathrm{d}m\)</math> est le moment d'inertie du solide S par rapport à l'axe <math>\((O, \vec{z})\)</math>.


          <math>\(D = \iiint_{M\in S} \! (yz) \, \mathrm{d}m\)</math> est le produit d'inertie du solide S par rapport aux axes <math>\((O, \vec{y})\)</math> et <math>\((O, \vec{z})\)</math>.

          <math>\(E = \iiint_{M\in S} \! (xz) \, \mathrm{d}m\)</math> est le produit d'inertie du solide S par rapport aux axes <math>\((O, \vec{x})\)</math> et <math>\((O, \vec{z})\)</math>.

          <math>\(F = \iiint_{M\in S} \! (xy) \, \mathrm{d}m\)</math> est le produit d'inertie du solide S par rapport aux axes <math>\((O, \vec{x})\)</math> et <math>\((O, \vec{y})\)</math>.

          Distribution linéique : <math>\(\mathrm{d}m = \lambda \, \mathrm{d}l\)</math> ; <math>\(\lambda\)</math> s'exprime en <math>\(kg.m^{-1}\)</math>

          Distribution surfacique : <math>\(\mathrm{d}m = \sigma \, \mathrm{d}S\)</math> ; <math>\(\sigma\)</math> s'exprime en <math>\(kg.m^{-2}\)</math>

          Distribution volumique : <math>\(\mathrm{d}m = \mu \, \mathrm{d}\tau\)</math> ; <math>\(\mu\)</math> s'exprime en <math>\(kg.m^{-3}\)</math>

          Dans ton cas, il y a symétrie par rapport au plan <math>\((O, \, \vec{x}, \, \vec{y})\)</math> donc <math>\(D = E = 0 \, kg.m^2\)</math>

          <math>\(\vec{\Omega}(1/0)\)</math> est le vecteur rotation du solide 1 par rapport à 0. Vu que tes solides sont dans le plan, il s'écrit : <math>\(\vec{\Omega}(1/0) = \omega_{10} \, \vec{z} = \begin{pmatrix} 0 \\ 0 \\ \omega_{10} \end{pmatrix}_{(\vec{x}, \, \vec{y}, \, \vec{z})}\)</math>

          On peut donc écrire : <math>\(I(A,1)\left[\vec{\Omega}(1/0)\right] \quad = \quad \begin{pmatrix} 0 \\ 0 \\ C \times \omega_{10} \end{pmatrix} \quad = \quad C \, \omega_{10} \, \vec{z}\)</math>

          Il vient : <math>\(Ec(1/0) \quad = \quad \frac{1}{2} \, m_1 \, \left\|\vec{v}(G_1\in1/0)\right\|^2 \, + \, \frac{1}{2} \, C \, {\omega_{10}}^2\)</math> (idem pour 2).

          Détermination empirique


          Les choses peuvent se simplifier grandement si l'un des deux solides (par exemple le solide 1) est beaucoup plus lourd que l'autre (qui est donc le solide 2). On peut dans ce cas dire que le mouvement de 1 est inchangé par collision avec 2.

          Les 2 inconnues de position du solide 1 à l'instant t+dt se déduisent de celles à l'instant t ainsi que des vitesses de ce solide à l'instant t.

          Il reste donc à trouver les 6 inconnues du solide 2. Là aussi on a très facilement les inconnues de position ; on cherche donc les 4 inconnues de vitesse.

          On commence par écrire :

          <math>\(\left\{ \begin{aligned} &\vec{v}(G_1\in1/0)(t+\mathrm{d}t) \, = \, \vec{v}(G_1\in1/0)(t) \\ &\vec{\Omega}(1/0)(t+\mathrm{d}t) \, = \, \vec{\Omega}(1/0)(t) \end{aligned}\)</math>

          Donc on a : <math>\(Ec(1/0)(t+\mathrm{d}t) \, = \, Ec(1/0)(t)\)</math>
          Mais ce qui nous intéresse est surtout : <math>\(Ec(2/0)(t+\mathrm{d}t) \, = \, Ec(2/0)(t)\)</math> (1 équation scalaire). On utilise la conservation de la quantité de mouvement pour ajouter 2 autres équation scalaires. Ces 3 équations nous permettent donc de trouver les 3 inconnues de vitesse du solide 2.


          À lire aussi


          Livres


          MÉCANIQUE GÉNÉRALE
          1er et 2e cycles
          Cours, exercices et problèmes corrigés
          Claude CHÈZE Hélène LANGE
          Ellipses

          Premiers cycles . Licence
          José-Philippe PÉREZ
          Mécanique
          Fondements et applications
          Avec 300 exercices et problèmes résolus
          6e édition
          MASSON SCIENCES
          DUNOD
          ISBN : 2 10 005464 3

          G. BRUHAT --- Cours de Physique Générale
          MÉCANIQUE
          Sixième édition revue et complétée par A. FOCH
          Masson & Cie

          MÉCANIQUE GÉNÉRALE, par J. PÉRÈS, 1953, 408 pages, 64 figures.

          THÉORIE MODERNE DES SOLIDES, par F. SEITZ. Traduit de l'anglais par Cl. DUGAS, 1949, 764 pages, 18 figures.

          En ligne :


          Mécanique Générale (INSA Lyon 1994) :
          http://docinsa.insa-lyon.fr/polycop/pont.php?cle=GMCS071A
          http://docinsa.insa-lyon.fr/polycop/do [...] =104733&id2=0


          Mécanique pour ingénieur vol.2 Dynamique, Band (=Volume) 2 [Par F.P. Beer,Ferdinand P. Beer,E.R. Johnston] :
          http://books.google.fr/books?id=HiopvY [...] age&q&f=false



          Sur ce, j'espère avoir pu t'aider. ;)
          • Partager sur Facebook
          • Partager sur Twitter
            8 mai 2011 à 15:40:57

            Si tu ne veux pas te prendre la tête à implémenter ces formules, tu peux (devrais?!??) utiliser une bibliothèque qui fait déjà ça et sur laquelle une ou plusieurs personnes qui ont bien assimilé tout ça bossent => Farseer, BulletX et si t'es chaud pour un peu de PInvoke, t'as aussi PhysX
            • Partager sur Facebook
            • Partager sur Twitter
              8 mai 2011 à 19:58:49

              Houaou :waw:

              Je commence par répondre à Narvarth. :)
              Dans mon cas, seul l'un des deux solides est déplacé. En effet, le noir (sur le schéma) est immobile et le reste. Seul le solide gris tombe et peut subir une rotation. Ça devrait grandement simplifier les formules non?

              Ensuite, je n'ai pas besoin de suivre à la lettre les lois de la physique. Mon but est de rendre presque réaliste la chute, pas de faire un moteur physique. Je vais relire les formules que tu m'as donné en essayant de les appliquer à mon cas. Mais je n'ai jamais été très fort en physique (surtout pour tout ce qui est moment d'une force), donc je risque d'avoir un peu de mal :p

              Pour répondre à Nisnor, je vais voir du côté de BulletX, qui m'a l'air assez léger. Car mon jeu est en temps réel, il faut donc quelque chose de très rapide (et pas forcement hyper hyper réaliste, je cherche juste à éviter les cas extrêmes, impossible dans la réalité) ^^
              • Partager sur Facebook
              • Partager sur Twitter
                9 mai 2011 à 10:58:09

                Les trois que j'ai cité ici sont tous utilisés dans des jeux...Donc dans des logiciels où le rendu en temps réel est de mise :D . BulletX, j'ai jamais essayé...J'ai testé Farseer uniquement...Et quand j'aurais du temps, je testerais PhysX (si quelqu'un connait un équivalent à PhysX mais pour carte ATI d'ailleurs, j'suis preneur)
                • Partager sur Facebook
                • Partager sur Twitter
                  11 mai 2011 à 21:49:29

                  Le problème de ces bibliothèques est qu'elles se basent sur des polygones. Or mes formes sont des formes très aléatoires... :(
                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 mai 2011 à 15:06:02

                    Farseer sait décomposer une image en polygones -> http://farseerphysics.codeplex.com/documentation section "Texture to polygon".
                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 mai 2011 à 18:31:52

                      Citation : cypher666

                      Le problème de ces bibliothèques est qu'elles se basent sur des polygones. Or mes formes sont des formes très aléatoires... :(



                      'me goure peut être mais.... Si tu ne décompose pas tes éléments complexes en forme simple, comment tu fais pour faire un rendu en temps réel sur une machine traditionnelle??

                      C'est un peu comme la différence entre un moteur 3D Full-Ray-Tracing et un moteur 3D classique : Le premier est nettement plus joli que le second...Mais pour le rendre en temps réel, il faudrait une grappe de serveur de calculs fournissant une puissance de calcul colossale o_O => C'est faisable, mais c'est pas destiné au grand public.

                      Edit : Même en rendu 3D d'ailleurs, tout est découpé en polygone. La tessellation permet "d'affiner" les contours en subdivisant les polygones existants en polygones plus petits...Mais ça reste toujours des polygones.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        15 mai 2011 à 18:57:26

                        Ha oui, j'ai peut être oublié de le préciser, mais mon jeu est en 2D. ^^
                        C'est pour ca que je n'ai besoin de gérer que des images, et pas des polygones.
                        Mais du coup, ça devrait simplifier grandement les calculs...
                        • Partager sur Facebook
                        • Partager sur Twitter

                        [XNA] Faire tourner une texture2D

                        × 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