Partage
  • Partager sur Facebook
  • Partager sur Twitter

Moteur physique, réponse aux collisions.

    27 décembre 2017 à 21:41:40

    Bonjour a tous,

    Voila, je suis en train de programmer un moteur physique 2D en Java avec des solides indéformable qui peuvent supporter la rotation. J'ai déjà programmer la partie "détection de collision". Je peut trouver la normal et la tangent de la collision, le ou les point de collisions, savoir si deux polygone convexe sont en intersections, mais maintenant je doit programmer la partie "réponse aux collision" et je suis bien embêter. C'est là ou la partie "physique" rentre en jeux , il faudrait que je trouve le vecteur vitesse et la vitesse angulaire après collision, sachant quelle est instantané et je n'ai aucune idée de se qu'il faut faire.

    Je sais qu'y il a la quantité de mouvement, des torseurs qui rentre en jeux mais je ne sais pas comment mettre tous ça ensemble, ou quelle sont les relations entre la vitesse angulaire et le vecteur vitesse.

    Donc si quelqu'un aurait l’amabilité de m'expliquer comment faire, ou juste m'indiquer les outils nécessaire pour résoudre ce problème, ou des pistes a creusé, j'écoute.

    -
    Edité par pyr 27 décembre 2017 à 21:43:11

    • Partager sur Facebook
    • Partager sur Twitter
      30 décembre 2017 à 1:43:36

      As tu bien fait ta simulation sur formats ou bien sur un tableaux noir .... ??

      Mettre ce domaine en programmation est très compliqué . Cependant on utilise ici les POO en java , je n'ai pas bien assimilé ton projet car je n'ai ni debut mais ni fin, mais je te conseille de rester patient et voir si tu n'as pas fait une erreur de calcul aux préalable

      • Partager sur Facebook
      • Partager sur Twitter

      merci à vous

        30 décembre 2017 à 3:12:26

        Non je n'ai pas fait de plan détailler avant de commencer a programmer, je suis plutôt en train d’apprendre sur la tas en même temps que je code. Le but de mon projet est de programmer un moteur physique 2D que je puisse utiliser par la suite pour un jeu, donc mon moteur n'a pas besoin d'être très réaliste, just vraisemblable. J'ai pour objective qu'il supporte rotation, friction et collision inélastique.

        J'ai commencer a écrire la partie de la réponse a la collision pour la vitesse linéaire.

        Dans le cas ou les deux solides peuvent bouger librement:

        -La composant tangent a la collision du vecteur vitesse reste inchangée, et pour la composant normal du vecteur vitesse des deux solides j'utiliser cette formule :

        (masseSolides1 * vecNormalVitesse1 + masseSolides2 * vecNormalVitesse2) / (masseSolides1 + masseSolides2) = nouvelleVitesseDesDeuxSolidess

        Je trouve cette relation grace aux formules sur la quantité de mouvement :

        vecP = masse * vecVit

        Et : vecP1 + vecP2 = vecP1' + vecP2' (Quantité de mouvement avant collision = Quantité de mouvement après collision)

        Dans le cas ou l'un des solides ne peut pas bouger librement (decor) je réfléchie juste le vecteur vitesse de l'autre.

        Et avec ça j'ai un résultat qui commence a ressembler a quelque chose, mais je ne sais toujours pas comment traiter les rotations...

        Voilà un peut de code pour illustrer mes propos :

        public void linearVelocityRespond(RigidBody bodyA, RigidBody bodyB, float cushion) {
                if(Float.isNaN(bodyA.mass) || Float.isNaN(bodyB.mass)) {//If one of the object got infinit mass, we just reflect the speed
                    Vector2f reflexiveA = Vector2f.reflexiveVec(normal, bodyA.getVelocity());
                    bodyA.getVelocity().x = reflexiveA.x;
                    bodyA.getVelocity().y = reflexiveA.y;
                    
                    Vector2f reflexiveB = Vector2f.reflexiveVec(normal, bodyB.getVelocity());
                    bodyB.getVelocity().x = reflexiveB.x;
                    bodyB.getVelocity().y = reflexiveB.y;
                }
                else {//If they got finit mass, we do an inelastic collision
                	
                	//La vitesse tangent reste la même et la vitesse normal fait une collision inelastique
                	
                	//Definition des vecteur vitesse par la tangent et la normal :        	
                	float orthoAtan = Vector2f.orthagonalProjectionOf(bodyA.getVelocity(), tangent);
                	float orthoBtan = Vector2f.orthagonalProjectionOf(bodyB.getVelocity(), tangent);
                	float orthoAnorm = Vector2f.orthagonalProjectionOf(bodyA.getVelocity(), normal);
                	float orthoBnorm = Vector2f.orthagonalProjectionOf(bodyB.getVelocity(), normal);
        
                	float tanVelAX = tangent.x * orthoAtan;
                	float tanVelAY = tangent.y * orthoAtan;
                	
                	float tanVelBX = tangent.x * orthoBtan;
                	float tanVelBY = tangent.y * orthoBtan;      
                	
                	float normVelAX = normal.x * orthoAnorm * cushion;
                	float normVelAY = normal.y * orthoAnorm * cushion;
                	
                	float normVelBX = normal.x * orthoBnorm * cushion;
                	float normVelBY = normal.y * orthoBnorm * cushion; 
                	
                	//Inelastics collision on normal axe :
                	float collisionNormalVelocityX = inelasticCollision(bodyA.getMass(), normVelAX, bodyB.getMass(), normVelBX);
                	float collisionNormalVelocityY = inelasticCollision(bodyA.getMass(), normVelAY, bodyB.getMass(), normVelBY);
        
                    bodyA.getVelocity().x = collisionNormalVelocityX + tanVelAX;
                    bodyA.getVelocity().y = collisionNormalVelocityY + tanVelAY;
                    
                    bodyB.getVelocity().x = collisionNormalVelocityX + tanVelBX;
                    bodyB.getVelocity().y = collisionNormalVelocityY + tanVelBY;
                    
                }
        }
        	public static float inelasticCollision(float massA, float velocityA, float massB, float velocityB) {
        		return ( massA*velocityA + massB*velocityB ) / ( massA + massB );
        	}






        -
        Edité par pyr 30 décembre 2017 à 17:52:32

        • Partager sur Facebook
        • Partager sur Twitter
          30 décembre 2017 à 22:00:28

          Comment savoir où se trouve l'erreur , je ne trouve pas de messages d'erreurs pour voir comment t'aider.

          Néanmoins ton code est bien structuré avec de nombreux objet(class) cré(e)s ,  je pense que je suis un peu embrouiller avec tes objets où je n'y arrive pas à interpréter :( .

          Essaye de voir si il n y a pas de ligne mal écris dans ton projet.

          Du courage... :p

          -
          Edité par LEDOUX_os 30 décembre 2017 à 22:03:35

          • Partager sur Facebook
          • Partager sur Twitter

          merci à vous

            31 décembre 2017 à 19:27:04

            Cette partie n'as pas d'erreur, du moins je ne pense pas vue que quand je lance le moteur physique la réponse pour la vitesse linéaire est assez convaincante.

            Mon problème c'est la réponse pour les rotations qui est juste absente, dans mon précédent poste je voulais juste dire qu'entre temps j'avais trouver une solution pour la vitesse linéaire, mais pas pour la rotation, donc pas besoin de s'attarder la dessus. (J'ai juste mis le code parce que ça peut être utile a d'autre dans le même cas ;) )

            Du coups maintenant je cherche une "méthode" pour gérer les rotations et trouver la vitesse angulaire de mes objets, toujours basé sur les lois de la physique, après collision entre eux.

            -
            Edité par pyr 31 décembre 2017 à 19:32:47

            • Partager sur Facebook
            • Partager sur Twitter

            Moteur physique, réponse aux collisions.

            × 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