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

Mathématiques Discussion :

Mouvement pendulaire (pour un petit jeu)


Sujet :

Mathématiques

  1. #1
    Invité
    Invité(e)
    Par défaut Mouvement pendulaire (pour un petit jeu)
    Bonjour,

    Le weekend dernier, pour la Global Game Jam, j'ai travaillé sur un petit jeu : http://projets.croquepixel.net/gamejam/saftyfriends/
    Si vous y jouez un peu ( deux boutons X et C ), vous remarquerez que la physique est un peu au fraise ( et je ne parle pas que des collisions ).
    Bref, j'aimerais corriger tout ça. Je me suis donc penché plus sérieusement sur les mouvements pendulaires. Mes petits bonhommes, doivent pouvoir se balancer quand l'autre est accroché au mur, et j'aimerais avoir un effet un peu réaliste quand les deux sont dans le vide.

    Je suis tombé la dessus : http://www.sciences.univ-nantes.fr/s...n_pendule.html qui colle assez bien à ce que j'aimerais faire ( mouvement pendulaire avec un fil souple, en appliquant des vecteurs forces(tension/gravité) et vitesse.
    J'ai lu pas mal de littérature sur le net sur le sujet, mais les maths ne sont pas mon fort (et certains concepts et notations m'échappent un peu ) ce qui peu être gênant pour pour les mettre en application sous forme de code.
    J'ai quand même avancé, j'ai une partie du calcul des vecteurs ( la gravité, la tension, l’accélération ).
    Maintenant, que j'ai expliqué le contexte, je viens vers vous pour plusieurs raisons :
    - d'abord pour valider le concept ( si je n'ai pas fait d'erreur dans le calcul de mes vecteurs )
    - il me manque le calcul de la vitesse en fonction de l’accélération , je pèche un peu de ce coté

    Ci dessous : mon code de test ( en AS3 )

    Code javascript : 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    package gamejam.corde.test.pendulum {
        import com.casusludi.lib.jammer.utils.MathUtils;
        import flash.display.Graphics;
        import flash.display.Shape;
        import flash.display.Sprite;
        import flash.events.Event;
        /**
         * ...
         * @author Pierre Chabiland
         */
        public class Main2 extends Sprite
        {
            public var gravityV:Vector2D;
            public var jumpV:Vector2D;
            public var tensionV:Vector2D;
            public var vitesseV:Vector2D;
            public var accV:Vector2D;
            public var uV:Vector2D;
            public var vectors:Vector.<Vector2D>;
            public var xx:Number;
            public var yy:Number;
            public var vnorm:Number;
     
            public var canvas:Shape;
            public var initAngle:Number;
            private var pivotX:int;
            private var pivotY:int;
            private var startAngle:Number;
            private var rope:int;
     
            public function Main2() 
            {
     
                rope = 75;
                startAngle = Math.PI*0.2;
                pivotX = 150;
                pivotY = 25;
     
                xx = pivotX + Math.cos(startAngle) * rope;
                yy = pivotY + Math.sin(startAngle) * rope;
     
                gravityV = new Vector2D(8, Math.PI * 0.5, 1);
                jumpV = new Vector2D(0, 0, 0.9);
                tensionV = new Vector2D(0, 0, 1);
                vitesseV = new Vector2D(0, 0, 1);
                accV = new Vector2D(0, 0, 1);
                uV = new Vector2D(0, 0, 1);
     
                vectors = Vector.<Vector2D>([
                    jumpV,
                    tensionV,
                    vitesseV,
                    gravityV,
                ]);
     
                canvas = new Shape();
                canvas.scaleX = canvas.scaleY = 2;
                this.addChild(canvas);
                this.addEventListener(Event.ENTER_FRAME, _enterframeHandler);
            }
     
            private function _enterframeHandler(e:Event):void 
            {
     
                var dist:Number = distance(xx, yy, pivotX, pivotY);
                var angle:Number = (Math.atan2( -pivotY + yy, -pivotX + xx));
                var r:Number = angle-Math.PI*0.5;
                if (r < 0) r += 2 * Math.PI;
                if (r > Math.PI) r -= 2 * Math.PI;
                if (dist >= rope) {
                    if (isNaN(initAngle)) {
                        initAngle = r;
     
                    }
                }
     
     
                tensionV.angle = angle+Math.PI;
                tensionV.norm = gravityV.norm * (3 * Math.cos(r) - 2 * Math.cos(initAngle));
                tensionV.toCartesian();
                gravityV.toCartesian();
     
     
                accV.x = gravityV.x + tensionV.x;
                accV.y = gravityV.y + tensionV.y;
                accV.toPolar();
     
                uV.angle = r+Math.PI * 0.5;
                uV.norm = 1;
                uV.toCartesian();
     
     
                // ce n'est clairement pas ça! 
                vitesseV.angle = angle+Math.PI * 0.5;
                vitesseV.norm -= Math.sqrt(accV.norm)* (Math.cos(accV.angle)>0?1:-1);
     
                render();
                for (var i:int = 0, c:int = vectors.length; i < c; i++) {
                    if (vectors[i].enabled) {
                        xx += vectors[i].x;
                        yy += vectors[i].y;
     
                    }
     
                }
     
     
            }
     
            static public function distance(pAx:Number, pAy:Number, pBx:Number, pBy:Number):Number {
                var gx:Number = pBx - pAx;
                var gy:Number = pBy - pAy;
                return Math.sqrt(gx * gx + gy * gy);
            }
     
     
            private function render():void {
                var g:Graphics = canvas.graphics;
                g.clear();
     
                // fil
                g.lineStyle(1, 0);
                g.moveTo(pivotX, pivotY);
                g.lineTo(xx, yy);
     
                // pivot
                g.beginFill(0xDCDCDC);
                g.drawCircle(pivotX, pivotY, 4);
                g.endFill();
     
                // masse
                g.beginFill(0x800000);
                g.drawCircle(xx, yy, 8);
                g.endFill();
     
                _drawVectorAt(gravityV, xx, yy, 0x00FF00);
                _drawVectorAt(tensionV, xx, yy, 0xFF0000);
                _drawVectorAt(vitesseV, xx, yy, 0x0000FF);
                _drawVectorAt(accV, xx, yy, 0xFF00FF);
     
            }
     
            private function _drawVectorAt(pVector:Vector2D, pX:int, pY:int,pColor:uint):void {
                var g:Graphics = canvas.graphics;
                var xxx:Number = Math.cos(pVector.angle) * pVector.norm*5;
                var yyy:Number = Math.sin(pVector.angle) * pVector.norm*5;
                var anchorAX:Number = Math.cos(pVector.angle+Math.PI * 2 / 3) * 4;
                var anchorAY:Number = Math.sin(pVector.angle+Math.PI * 2 / 3) * 4;
                var anchorBX:Number = Math.cos(pVector.angle-Math.PI * 2 / 3) * 4;
                var anchorBY:Number = Math.sin(pVector.angle-Math.PI * 2 / 3) * 4;
                g.lineStyle(1, pColor);
                g.moveTo(pX, pY);
                g.lineTo(pX + xxx, pY + yyy);
                g.lineTo(pX + xxx + anchorAX, pY + yyy + anchorAY);
                g.moveTo(pX + xxx, pY + yyy);
                g.lineTo(pX + xxx + anchorBX, pY + yyy + anchorBY);
                g.lineStyle(null);
     
            }
     
     
        }
     
    }
     
     
    internal class Vector2D {
        public var norm:Number;
        public var angle:Number;
        public var friction:Number;
        public var enabled:Boolean;
        public var x:int;
        public var y:int
     
        public function Vector2D(pNorm:Number, pAngle:Number, pFriction:Number=0.9) {
            norm = pNorm;
            angle = pAngle;
            friction = pFriction;
            enabled = true;
        }
     
        public function toCartesian():void {
            x = Math.cos(angle) * norm;
            y = Math.sin(angle) * norm;
        }
     
        public function toPolar():void {
            angle = Math.atan2(y, x);
            norm = Math.sqrt(x * x + y * y);
        }
     
     
    }

    Voilà, donc je serais vraiment reconnaissant si quelqu'un pouvait m'aider à me débloquer sur le sujet!
    En vous remerciant d'avance.
    Dernière modification par dourouc05 ; 29/01/2015 à 13h46. Motif: Coloration syntaxique

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 054
    Points : 9 394
    Points
    9 394
    Par défaut
    Je n'ai pas le courage de lire le code , mais voici un premier élément de réponse :

    V0 est la vitesse actuelle, A est l'accélération.
    Dans x centièmes de seconde; ma nouvelle vitesse sera : V1 = V0 + A * x / 100

    Ca marche si la vitesse est une vitesse angulaire, ou aussi si la vitesse est une vitesse 'classique'.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  3. #3
    Invité
    Invité(e)
    Par défaut
    En fait je cherche un équilibre qui fait que la somme des vecteurs Vitesse, tension, et gravité fasse que la distance entre la masse et le pivot soit identique à tout instant.
    Le système est actuellement sans frottement, il faut donc que le mouvement soit infini ( ou presque )
    Ce n'est pas le cas, actuellement dans mes tests.

  4. #4
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Points : 262
    Points
    262
    Par défaut
    C'est dingue ces personnes qui viennent dans le fofo mathématique pour nous poster du code java.
    Commence par formaliser les équations de mouvements avant de les coder !

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ce n'est pas du Java mais de l'AS3 ( pour ce que cela change )
    Je suis développeur et pas ( plus ) spécialement un matheux. Des maths je n'en fais que très peu.
    Alors formaliser sous forme mathématique des équations de mouvement, ce n'est pas mon réflexe premier.
    Alors, ne crois pas, je gribouille des trucs sur un cahier avant de me lancer. Mais il faut faire un peu preuve de tolérance sur ce sujet, nous n'avons pas tous les mêmes réflexes et la même façon de fonctionner ;-)
    Il faut bien comprendre que j'en ai chié ma race pour me remettre dans des trucs que je n'ai pas pratiqué depuis plus de 10 ans ;-)

    Mais tu as raison, je peux formaliser un peu mieux ( du moins expliquer où j'en suis )

    Soit M, une masse accroché à un fil au centre O. Soit R l'angle entre OM et la verticale à un instant t et R0 cette angle à l'initiale
    J'ai défini deux forces :
    - la gravité P (0,-g)
    - la tension T d'angle -OM et de norme g*(3cos(R)-2cos(R0)) ( voir http://www.chimix.com/an9/medical/nantes2.htm )

    J'ai défini l’accélération A comme ceci :
    A = P+T (A, P et T sont des vecteurs )

    Mon soucis est de trouver le vecteur vitesse tangentielle de M en fonction de A.

    Est ce que c'est mieux formalisé? ( c'est un peu fait avec les moyens du bord )

  6. #6
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Points : 262
    Points
    262
    Par défaut
    Attention, on travaille avec des équations vectorielles. Donc on essaye de mettre des flèches et de bien faire apparaître les grandeurs qui dépendent du temps, c'est mieux :


    avec :
    -
    - (attention toi tu donnes directement la valeur après calcul).
    -
    (à toi de voir si c'est constant).

    Donc ici on manipule de simple vecteurs en 2D (dont certain dépendent du temps, cad ils ne sont pas fixe), à la portée d'un collégien ... Pour appliquer les équations de mouvement on fait des dérivées, niveau lycée ...

    Citation Envoyé par MrPierrot Voir le message
    J'ai défini l’accélération A comme ceci :
    Non, c'est pas toi qui défini. Tu appliques des notions de physique (Newton tu connais ? ) : http://fr.wikipedia.org/wiki/Princip...e_la_dynamique

    Donc le PFD nous dit que :


    ici, représente le vecteur accélération du point M. Celui-ci a deux composantes, dont l'une d'entre elles s'appelle le vecteur accélération tangentielle (que tu cherches).

    On sais que le vecteur accélération c'est la dérivée du vecteur vitesse, qui est lui-même la dérivée du vecteur position :






    donc ton vecteur accélération tangentielle :

    Si tu veux calculer T tu résous le PFD et l'équation différentielle obtenu.
    Et voila .


    PS : Ne prend pas mal m'a remarque d'avant. Mais ça me paraît tellement évident ce genre de choses. Je peux comprendre que certaines personnes ne manipule pas les maths depuis très longtemps mais c pas une raison
    C'est une des rares choses que j'ai appris en école d'ing. ^^, on ne se lance pas direct dans le code.
    Donc jte conseil de faire un modèle mathématique et de le tester (tu traces tes courbes sous maple/excel ou autre, pour voir ske ça donne).

  7. #7
    Invité
    Invité(e)
    Par défaut
    :-)
    C'est parce que cela te semblait évident que je préférais faire un rappel sur la chose ;-) Et je ne le disais pas méchamment! Nous sommes sur un forum de développement. On y trouve donc des développeurs qui vont avoir des problématiques mathématiques. Quoi qu'on en dise : développeur != mathématicien. Ce n'est donc pas étonnant qu'on trouve des gens qui pose leur problématique sous forme de code. :-)
    Je sais très bien que ce sont des maths niveau Collèges/Lycée, mais j'ai vu tout ça il y a 15 ans, en ne pratiquant que très peu avec les années. Tu comprendras donc que tout ça c'est très loin et que remettre le nez dedans n'est pas simple. C'est des choses que j'ai perdu ( et que j'aimerais retrouver au passage, notamment pour résoudre des problématiques comme celle ci ).
    je suis un bon développeur ( je ne le dis pas pas vantardise ) mais un mauvais mathématicien ;-)
    Je ne te dis pas tout ça parce que j'ai mal pris tes remarques, je t'explique juste le contexte et t'invites à la tolérance, même si je comprends que ça puisse te piquer les yeux ;-)

    En tout cas, je te remercie de ta réponse fourni et explicite. ( comment écris-tu tes écritures mathématique avec latex.codecogs.com, developpez.com le gère? )

    Pour T, je le calcul en fonction du temps, en me basant sur ces calculs : http://www.chimix.com/an9/medical/nantes2.htm
    Je pense que c'est bon, peux tu me le confirmer?
    Pour A, tu joues avec les mots ;-) Bien sur que je n'ai pas pondu le PDF! :-p Au final, j'ai défini à 1 la masse M, ce qui colle avec tes écris.

    Après ça ce gâte, si le mot dérivé fait écho a un lointain passé, je n'en maîtrise nettement plus le sujet et donc j'ai du mal à la coucher sous forme de code. ( ah oui, je visualise mieux ce qui se passe sous forme de code que sous forme d'écritures mathématiques, je suis développeur, hein :-D ). Faut voir que j'ai un but et qu'il faut que j’apprenne ou réapprenne toutes les notions qui me permettent de le réaliser! Et j'apprends au fil de l'eau en fonction des divers blocages. Je t'avoue que je ne pensais pas autant galérer! :-)

    Pour voir si je comprend bien :

    la 1ere égalité veut dire : l’accélération de M est égale à la dérivé de la vitesse de M ?
    Et pour avoir la vitesse V de M en fonction de l’accélération A de M, on fait comment?
    Parce qu'il me semble bien que c'est ça que je veux :-)
    A voir dans cette animation, le vecteur V : http://www.sciences.univ-nantes.fr/s...n_pendule.html ( il faut cliquer sur tout les boutons au milieu/bas pour faire apparaître les vecteurs )

    En te remerciant d'avance!

  8. #8
    Invité
    Invité(e)
    Par défaut
    Pour une dérivé : est ce qu'en terme de code on peut l’exprimer comme ceci :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var v = 0;
    var a = 1;
    var dt = 1;
     
    while(true){
      v += a*dt;
    }

    a est la dérivée de v en fonction du temps.

    ça colle?
    Dernière modification par dourouc05 ; 30/01/2015 à 18h28.

  9. #9
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Points : 262
    Points
    262
    Par défaut
    - developpez.net ne gère pas le latex, donc oui j'utilise http://www.codecogs.com/latex/eqneditor.php
    - pour avoir la vitesse si on connais l'accélération, il faut intégrer.
    - ne confond pas PDF et PFD (ou alors c'est une faute de frappe ?)

    - Pour calculer T, on applique le PFD :




    on met tout dans le mm repère, avec :


    on a donc :

    Pour continuer, on utilise l'énergie mécanique du pendule, je vais pas faire toute la démonstration par flemme (si vraiment t'en as besoin dit le moi), on obtient le résultat :


    On remplace dans l'équation d'avant, on obtient alors :


  10. #10
    Invité
    Invité(e)
    Par défaut
    Ouais c'est une faute de frappes ;-)

    Donc ma formule de calcul pour la tension est bien la bonne!

    En gros, actuellement, je connais la tension, le poids et l’accélération!
    Il me reste donc à intégrer l’accélération pour avoir la vitesse. J'ai bon?
    Parce qu'au final, c'est ça qui me manque : la vitesse :-)

    Je fais comment ?
    Un idée de ce que ça donne en version "code" ?

    Merci :-)

  11. #11
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Points : 262
    Points
    262
    Par défaut
    Tu es sur de connaitre le vecteur accélération ?
    Tu as compris ce que c'est la vitesse angulaire ?

    Tu a quoi comme données initiale ? Un point M lâché sans vitesse initiale avec un angle theta_0 ? C'est tout ?

  12. #12
    Invité
    Invité(e)
    Par défaut
    Exactement, seulement ça!
    La tension est calculé à partir comme ceci :

    Je calcul A comme ceci :

    Donc j'additionne les coordonnées des vecteurs P et T pour trouver A!




    Il me manque plus que la vitesse pour compléter et équilibrer le tout.

    Après, il serait bien que je rajoute la vitesse initiale, mais ce sera dans un second temps!

  13. #13
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Points : 262
    Points
    262
    Par défaut
    Il faut résoudre une équation différentielle, et c'est pas évident dans le cas du pendule simple

  14. #14
    Invité
    Invité(e)
    Par défaut
    Tu as la formule de cette équation?

    Il me faut juste le calcul que je puisse transposer sous forme de code ( d'ailleurs parfois certains calculs mathématiques complexe sont assez facile à transposer sous forme de code et au final assez simple sous cette forme. )
    Dernière modification par dourouc05 ; 30/01/2015 à 18h28.

  15. #15
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Points : 262
    Points
    262
    Par défaut
    Non non, c'est vraiment très difficile à résoudre.

    Regarde plutôt pour une résolution numérique :

    http://fr.wikipedia.org/wiki/M%C3%A9thode_d%27Euler

    http://www.enseignement.polytechniqu...rrige_exo1.pdf

  16. #16
    Invité
    Invité(e)
    Par défaut
    Je regarderais ça demain!

    Merci :-)

Discussions similaires

  1. Quelle techno pour un petit jeu ?
    Par DotNET74 dans le forum Windows Phone
    Réponses: 9
    Dernier message: 24/08/2011, 20h26
  2. Réponses: 0
    Dernier message: 22/03/2010, 09h41
  3. Gestion de la memoire pour un petit jeu
    Par franck06 dans le forum Langage
    Réponses: 15
    Dernier message: 11/07/2008, 11h25
  4. Le langage C pour un petit jeu vidéo ?
    Par Darkthief dans le forum Développement 2D, 3D et Jeux
    Réponses: 15
    Dernier message: 06/04/2007, 13h42
  5. Besoin conseil pour un petit jeu
    Par Cosmosis dans le forum Langage
    Réponses: 3
    Dernier message: 22/12/2006, 14h44

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