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

Physique Discussion :

[2D] Réaction à une collision


Sujet :

Physique

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    786
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 786
    Points : 602
    Points
    602
    Par défaut [2D] Réaction à une collision
    Bonjour,
    j'essaie de mettre en place un algorithme de reponse de collision.
    Pour le moment je calcule une simple impulsion lineaire comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                j = (-(1 + fCr) * Vector3.Dot(vRelativeVelocity, vCollisionNormal)) /
                    ((1 / r1.fMass + 1 / r2.fMass));
    ou j = impulsion

    Puis j'incremente ma velocity
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    r1.vVelocity += (float)(j / (r1.fMass) ) * vCollisionNormal;
    Si je donne un exemple avec deux carres.
    Un statique avec un y de 500.
    L'autre part du y 0;
    A la premiere collision il possede une velocity de 120(y) (je n'applique que la gravite pour le moment comme force).

    Une fois l'impulsion applique il possede une velocite de -40(y). Donc il est sense remonte. Le probleme c'est que dans la foulee il va recollider une seconde fois car il etait entrait de plusieurs pixel dans le carre statique.
    Du coup j'obtiens quelques chose comme :

    r1.vVelocity += (float)(j / (r1.fMass) ) * vCollisionNormal
    -40y(nouvelle velocity apres premiere collision) += -50y * -1 = 10

    ( La normale de collision est -1. )
    Du coup le carre descend petit a petit dans le carre statique.

    Avez vous une idee pour corriger ce probleme ?

    Merci

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    Citation Envoyé par saturn1 Voir le message
    Car il etait entrait de plusieurs pixel dans le carre statique.
    En théorie ca ne devrait pas arriver d'avoir le carré dans l'autre. Tu devrais avoir en théorie, pour la nouvelle position d'un objet, sa position "réfléchie" lors d'une collision et ce phénomène ne se produirait pas. (J'ai l'impression mais sans être certain).

    Pour etre sure d'avoir bien compris ou pas, voici un petit dessin de ce que je comprends (Ta situation c'est les 3 truc du dessus). Ce qu'il faudrait c'est les 3 truc de dessous.
    Nom : ImageColl.jpg
Affichages : 83
Taille : 44,2 Ko C'est ca?
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    786
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 786
    Points : 602
    Points
    602
    Par défaut re
    Exactement.

    J'ai reussi a corriger ce probleme.

    Cependant j'ai un nouveau probleme qui est illustre ici :


    http://www.myphysicslab.com/contact.html

    En gros pour qu'un objet ne rentre pas petit a petit dans un autre lorsque ca velocite se rapproche de 0 et que l'impulsion devient tres faible.

    Je dois appliquer une force de reaction du sol pour annuler la gravite.

    Comment appliquer ca proprement dans un algorithme ?

    Pour l'instant j'utilise cette algorithme trouve sur le net

    Code : 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
    setup initial conditions
    while(simulating) {
    DeltaTime = CurrentTime - LastTime
    while(LastTime < CurrentTime) {
    calculate all forces and torques
    compute linear and angular accelerations
    integrate accelerations and velocities over DeltaTime
    if(objects are interpenetrating) {
    subdivide DeltaTime
    } else {
    if(objects are colliding) {
    resolve collisions using Eqs. 8 and 9
    }
    LastTime = LastTime + DeltaTime
    DeltaTime = CurrentTime - LastTime
    update positions and velocities
    }
    }
    draw objects in current positions
    Merci (si tu reussis a comprendre mon probleme^^)

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 87
    Points : 111
    Points
    111
    Par défaut
    exactement comme il est dit dans la premiere phrase de ton lien, il n'est pas trivial de rendre un objet immobile au sol.
    ODE règle le problème en detectant que les differences de position sur les dernieres frames était tres fines, donc il place l'objet en IDLE.
    l'algo présenté ici (celui de Hecker) ne comporte pas cet aspect. il faut rajouter quelques états, et flags aux objets.

  5. #5
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Salut,
    ce sujet m'intéresse ^^
    tu pourrais être plus précis sur "detectant que les differences de position sur les dernieres frames était tres fines," ?
    Est-ce que ça implique que ODE fait une différence entre des solides "sol" et d'autres solides ? (au-delà de statics solids et/ou un axe de vélocité ? y par exemple)
    Vive les roues en pierre

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 87
    Points : 111
    Points
    111
    Par défaut
    Pardon d'avoir pas regardé mes drapeaux

    Automatic Enabling and Disabling

    Every body can be enabled or disabled. Enabled bodies participate in the simulation, while disabled bodies are turned off and do not get updated during a simulation step. New bodies are always created in the enabled state.

    A disabled body that is connected through a joint to an enabled body will be automatically re-enabled at the next simulation step.

    Disabled bodies do not consume CPU time, therefore to speed up the simulation bodies should be disabled when they come to rest. This can be done automatically with the auto-disable feature.

    If a body has its auto-disable flag turned on, it will automatically disable itself when

    * It has been idle for a given number of simulation steps.
    * It has also been idle for a given amount of simulation time.

    A body is considered to be idle when the magnitudes of both its linear velocity and angular velocity are below given thresholds.

    Thus, every body has five auto-disable parameters: an enabled flag, a idle step count, an idle time, and linear/angular velocity thresholds. Newly created bodies get these parameters from world.
    http://opende.sourceforge.net/wiki/i...ody_Functions)

  7. #7
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Merci pour les infos et le lien que je vais aller voir de ce pas

    (Je crois que c'est le même principe que dans Bullet)
    Vive les roues en pierre

  8. #8
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    786
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 786
    Points : 602
    Points
    602
    Par défaut re (avec du retard) :P
    Merci de l'info.

    J'ai bien compris comment mettre le body en idle.

    Mais si on ne l'update pas c'est a quel moment qu'on sait qu'on doit le repasser en updatable ? ( C'est un peu le serpent qui se mort la queue -_-)

    Merci

  9. #9
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    Je suppose qu'un object qui etait en IDLE, redevient actif quand il y'a une collision qui a lieu et qu'il est impliqué et que donc il recupere de la velocité pour se mouvoir eventuelement.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [2D] Repositionner deux rectangles à la détection d'une collision
    Par pierrot la lune dans le forum Physique
    Réponses: 3
    Dernier message: 24/03/2010, 22h00
  2. Réponse à une collision en 2D
    Par saturn1 dans le forum Physique
    Réponses: 2
    Dernier message: 24/03/2010, 20h49
  3. Lancer un son lors d'une collision
    Par SenpaiJPNEX dans le forum SDL
    Réponses: 4
    Dernier message: 09/02/2008, 19h16
  4. Réponses: 8
    Dernier message: 18/10/2005, 15h51
  5. tester une collision
    Par darkmalak01 dans le forum Langage
    Réponses: 3
    Dernier message: 08/10/2005, 17h33

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