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] Collisions précises


Sujet :

Physique

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 41
    Points : 25
    Points
    25
    Par défaut [2D] Collisions précises
    Bonjour à tous Depuis très longtemps la physique m'intéresse. j'ai déjà implanté un moteur physique de plateforme en Tile 2D dans mon jeu, mais j'aimerai tout en restant en 2D passer à un niveau plus réaliste.
    Je me suis donc en quête d'informations, mais mon niveau de Seconde (passage en 1ere S après les vacances) ne permet parfois de pas tout comprendre.
    Pour le moment, j'ai fais un système très basique et pourtant très gourmant (bien sûr la structure n'est pas bonne) :
    - je définis un poids à chaque point de mon polygone convexe
    - pour chaque point de chaque objet (je sais je sais ) j'utilise la technique de détection de Fvirtman dans son tutoriel sur les collisions, la méthode qui détectent un point dans un polygone avec le test de colinéarité entre les vecteurs (si le point est à gauche il est en dehors) en testant chaque point avec l'objet créé précédemment

    - si elle renvoie true je fais rien, si il elle renvoie false je diminue la valeur y de chaque point de l'objet concerné par son poids

    Le système marche pour 2 solides, même si le deuxième semble s'écraser sur le premier (normal vu que TOUS les points subissent leurs poids, sans tenir compte du solide :-° ) mais à partir de 3 c'est n'importe quoi, l'ordi mouline, les collisions bug, bref, c'était bien sûr une idée mais elle n'est pas vraiment bonne.

    Je me suis renseigné à pas mal d'endroits, et j'ai entendu parler des Rigid Body, des corps solides soumis à plusieurs théorèmes, mais je n'ai pas compris grand chose à leur sujet.
    J'ai aussi découvert le théorème "Separating Axis Theorem", mais la source étant en anglais j'ai pas tout compris, même si la méthode semble simple (il faut que je relise ça encore)

    Voilà c'est juste pour savoir si vous pouvez un peu me renseigner, même s'il y a déjà beaucoup de topics sur la physique 2D sur ce site, j'ai du mal avec certaines notions, voilà, je vous remercie d'avance pour votre aide

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 41
    Points : 25
    Points
    25
    Par défaut
    j'ai un peu avancé, en découvrant le théorème de la séparation des axes et sa mise en oeuvre, mais il y a une chose que je n'ai pas compris :
    On parle de projection des points via un produit scalaire... Or à ma connaissance le produit scalaire sert à calculer un angle .... ?

    j'aimerai avoir quelques précisions là dessus car je ça m'empêche d'implanter l'algorythme dans mon code.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 41
    Points : 25
    Points
    25
    Par défaut
    J'ai encore bien avancé, j'ai compris la notion du produit scalaire, j'ai implanté tout dans le code.
    Néanmoins , je me posais une question, dans ma programmation actuelle, j'ai besoin d'un vecteur qui relie les deux polygones par le centre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    vOffset = new Vecteur(obj1->centre->x - obj2->centre->x, 
    obj1->centre->y - obj2->centre->y);
    puis je dois rajouter ses coordonnées projetés sur la normale en cours au projeté actuelle ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //On ajoute la distance entre les deux centres des objets
    	sOffset = vOffset->DotProduct(axis);
    	min0 = min0 + sOffset;
    	max0 = max0 + sOffset;
    J'ai vu ça dans plusieurs endroits sur le net, il faut apparemment savoir la distance entre les deux centres.

    Sauf que mon système gère les polygones convexes quelconques. Je dois donc pour l'instant définir le centre moi même à l'oeil via la souris ... et de plus pour une Bounding Box le résultat est très bizarre, en effet la collision n'est détecté qu'au niveau du centre !! (ce qui n'est pas le cas pour les autres polygones à quelques approximations du au centre)

    donc :

    - premièrement il faut que je règle ce problème de bounding box, à savoir que j'utilise exactement le même algorithme que pour les polygones quelconques (et que ça marchent pour eux), je me demandais pourquoi il y a ce problème ?
    Sachant que je continue de chercher.

    - Deuxièmement, il faut que je trouve un meilleur système pour tous les polygones, car lorsque je n'ajoute pas ce vecteur qui relie les deux objets, les calculs sont systématiquement négatifs et donc faux, pourtant j'ai vu des codes sur internet qui semble ne pas avoir à calculer le centre (pourtant pour moi impossible de le mettre en oeuvre...)
    ou alors il faut que je trouve un moyen rapide de calculer le centre d'un objet, à savoir en trouvant l'intersection des diagonales, mais j'ai du mal à voir comment....

    Voilà merci d'avance pour vos réponses quelle qu'elles soient

  4. #4
    Responsable Purebasic

    Avatar de comtois
    Inscrit en
    Avril 2003
    Messages
    1 261
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 1 261
    Points : 9 924
    Points
    9 924
    Billets dans le blog
    8
    Par défaut
    j'avais fait cet exemple avec la méthode de l'axe séparateur.

    C'est du basic, ça doit être assez simple à comprendre ?
    De plus je n'utilise pas de fonctions API, donc ce code devrait fonctionner avec la version démo de PureBasic (gratuit), c'est toujours mieux de faire tourner un code, de s'amuser à le modifier pour le comprendre.

    Pour en revenir à la méthode, elle fonctionne avec n'importe quel polygone convexe. Pas besoin de connaitre le centre.
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 41
    Points : 25
    Points
    25
    Par défaut
    Oulah oui, la source est intéressante, je regarde, mais c'est assez différent du C++. Que veut dire "dim" ? Il y a des trucs que je comprend pas, comme NoAxe. Je regarde en profondeur la fonction CollisionPolygone() mais je vois qu'on met en paramètre Distance, ce ne serait pas ce vecteur qui relie les deux objets ? Je continue d'analyser là, en tout cas merci

  6. #6
    Responsable Purebasic

    Avatar de comtois
    Inscrit en
    Avril 2003
    Messages
    1 261
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 1 261
    Points : 9 924
    Points
    9 924
    Billets dans le blog
    8
    Par défaut
    Oui c'est différent du C++ et pourtant j'ai suivi un tutoriel en C++ (je crois) pour écrire ce code

    ça serait donc mieux pour toi d'avoir l'original, malheureusement je n'ai pas gardé le lien, en cherchant un peu peut-être que tu le retrouveras ? j'ai mis le nom de l'auteur dans le code.

    Sinon Dim permet de déclarer un tableau (la doc est en ligne ici)

    Distance est calculée dans la procédure CollisionReponse()
    Effectivement dans ce code je connais le centre des polygones puisqu'ils sont construits autour du centre (rectangles, cercles, triangles, hexagones, etc), ça se passe dans la procédure ConstructionPolygone()

    NoAxe ; c'est l'index sur le tableau Axe() , qui contient l'ensemble des axes séparateurs possibles.
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 41
    Points : 25
    Points
    25
    Par défaut
    Merci de ta réponse

    Tu as donc besoin des centres des polygones si je ne me trompe pas ?

  8. #8
    Responsable Purebasic

    Avatar de comtois
    Inscrit en
    Avril 2003
    Messages
    1 261
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 1 261
    Points : 9 924
    Points
    9 924
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par Daxter06 Voir le message
    Tu as donc besoin des centres des polygones si je ne me trompe pas ?
    Je n'ai pas retrouvé le lien exact que j'avais utilisé, mais une bonne piste pour toi.

    Olivier Renault explique en détail ses codes sur la méthode ici

    Regarde le premier lien , il a pris la peine de faire des beaux dessins pour tout expliquer.

    J'avais trouvé une archive qui contenait l'ensemble sous forme de pdf, c'était plus facile à consulter, mais là je te laisse chercher
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 41
    Points : 25
    Points
    25
    Par défaut
    C'est la dessus que tu as basé ton algorithme ?
    Tu n'utilises pas les centres donc toi dans ton code ? tu as l'air d'en parler
    Le deuxième lien est mort, je regarde le premier merci

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 41
    Points : 25
    Points
    25
    Par défaut
    Bon je suis super content j'ai trouvé une solution tout seul comme un grand !

    En fait la nécessité d'avoir les centres, c'est parce que j'envoyais toujours les coordonnées des vertices pour la projection. Ou est le problème vous allez me dire ? Et bien les vertices sont des vecteurs dans mon cas, ce sont des coordonnées relatives (ou plutot x et y sont la longueur du vecteur quoi) j'étais donc obligé d'y additionner ce vecteur Offset pour replacer mon vecteur au bon endroit et avoir des valeurs min et max correct, car comme chacun sait, un vecteur peut être en 0,0 ou 5,1 ce sera toujours le même vecteur. C'est pourquoi mes calculs de distance entre les projections étaient faux

    Maintenant j'envoie donc les points de chaque objet pour la projection, et là ce sont bien des coordonnées réelles plus besoin du centre de l'objet

    Y'a des jours comme ça on bloque sur un problème ^^ mais là on peut dire que je suis content.

  11. #11
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    le centre de gravité d'un objet quelconque c'est juste un calcul de de position moyenne en fonction des coefficients que l'on attribut à chaque point (leur masse en physique élémentaire) et que l'on divise par la masse totale

    le centre de gravité d'un système de n points:
    • (x[1],y[1],z[1]) de masse m[1]
    • (x[2],y[2],z[2]) de masse m[2]
    • ...
    • (x[n],y[n],z[n]) de masse m[n]

    a pour coordonnées, en prenant m=m[1]+m[2]+...+m[n]:
    • x=(x[1]*m[1]+x[2]*m[2]+...+x[n]*m[n])/m
    • y=(y[1]*m[1]+y[2]*m[2]+...+y[n]*m[n])/m
    • z=(z[1]*m[1]+z[2]*m[2]+...+z[n]*m[n])/m


    ça s'applique aussi bien à un objet dont on utilise les coordonnées des sommets qui définissent son pourtour ou à un assemblage de plusieurs objets formant un système lié

    le centre de gravité est l'endroit de l'objet (ou du système) où on applique les forces pour le faire se déplacer (attention je parle pas des rotations autour du centre de gravité engendrées par le point réel où s'appliquent les différentes forces). c'est donc le point de référence qui doit permettre de bouger l'objet en fonction de ce qu'il subit comme forces

    si on considère un objet (ou système d'objets) homogène (dont chaque élément est constitué d'un seul matériau donc ayant une masse identique) alors chaque point le constituant a la même masse élémentaire:
    • m[1]=m[2]=...=m[n]
    • m=n*m[1]


    ça simplifie énormément les formules:
    • x=(x[1]+x[2]+...+x[n])/n
    • y=(y[1]+y[2]+...+y[n])/n
    • z=(z[1]+z[2]+...+z[n])/n


    si ça peut t'aider
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. algorithme de collision 3D
    Par chetropinchuste dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 14/02/2010, 13h16
  2. Réponses: 12
    Dernier message: 02/09/2009, 18h24
  3. [java3D][collision]
    Par geofun dans le forum 3D
    Réponses: 7
    Dernier message: 12/02/2007, 14h49
  4. Gestion des collisions - terrains
    Par Dranor dans le forum DirectX
    Réponses: 1
    Dernier message: 26/06/2003, 18h50
  5. test collisions
    Par tatakinawa dans le forum OpenGL
    Réponses: 5
    Dernier message: 08/06/2002, 06h03

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