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 :

Résolution de collision entre une sphère et un AABB


Sujet :

Physique

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 64
    Points : 53
    Points
    53
    Par défaut Résolution de collision entre une sphère et un AABB
    Bonjour à tous,

    Je suis en train de réaliser un petit projet dans lequel un bille entre en collision avec des murs.

    Je sais detecter les collisions entre ma bille et les murs(AABB) grâce à l'algo d'Avro :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    for(int i=0 ; i<_Walls.size() ; i++)
    	{
    		d = 0 ;
     
    		if(m_Q.x < _Walls[i][0])
    		{
    			s = m_Q.x - _Walls[i][0] ;
    			d += s * s ; 
    		}
    		else if(m_Q.x > _Walls[i][1])
    		{
    			s = m_Q.x - _Walls[i][1] ;
    			d += s * s ; 
    		}
    		/*if(m_Q.y < _Walls[i][2])
    		{
    			s = m_Q.y - _Walls[i][2] ;
    			d += s * s ; 
    		}
    		else if(m_Q.y > _Walls[i][3])
    		{
    			s = m_Q.y - _Walls[i][3] ;
    			d += s * s ; 
    		}*/
    		if(m_Q.z < _Walls[i][4])
    		{
    			s = m_Q.z - _Walls[i][4] ;
    			d += s * s ; 
    		}
    		else if(m_Q.z > _Walls[i][5])
    		{
    			s = m_Q.z - _Walls[i][5] ;
    			d += s * s ; 
    		}
     
    		if(d <= m_rRadius*m_rRadius)
    		{
    			Acceleration = 0 ;
    			Vitesse = 0 ;
     
    			return true ;
    		}
    (m_Q est la position de ma bille, _Walls contient les infos Min et Max sur chaque axe de chaque mur).

    Mon problème c'est comment faire rebondir la bille sur le mur ?

    Je connais les formules pour le faire, mais je ne vois pas comment repérer sur quelle face du mur la balle doit rebondir.

    Pourriez vous m'aider svp ?
    Merci

  2. #2
    Membre actif Avatar de Nyarlathotep
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 174
    Points : 217
    Points
    217
    Par défaut
    Il faut évaluer la distance du centre de la boule avec chaque hyperplan de la boîte (avec les normales pointées à l'extérieur). Ceci revient en dimension 2 à calculer la distance algébrique (avec un signe, + = extérieur, - = intérieur) du centre du cercle aux cotés de la boîte.

    Ensuite, il y a collision si tous les produits des distances sur un même axe de la boîte sont positifs (ie si sur l'axe des x j'ai deux distances avec le centre notées a et b, a étant la distance à gauche, et b la distance à droite, il y a collision sur l'axe des x si a*b>=0). Pour déterminer le côté touché, on prend le côté où la distance est la plus proche de 0 du coté négatif.
    "That is not dead which can eternal lie
    And with strange aeons even death may die"

    The Call of Cthulhu

  3. #3
    Membre éclairé
    Avatar de N_I_C_S
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 450
    Points : 681
    Points
    681
    Par défaut
    Ah, Nyarlathotep, dieu sourd et aveugle, j'ai rien compris à ta démonstration (bon d'accord je suis un peu limité).
    Je vois 2 solutions:
    1- collision avec les triangles : tu teste chaque triangle de la AABB et tu choisis la normale de celui dont la collision est le plus près (assez compliqué, ça implique par exemple de déterminer quelle partie du triangle la sphère traverse, un sommet, une arète), mais c'est précis.
    2- Tu transforme ta AABB en arbre BSP, ainsi tu sais quel plan est derrière quel autre, et à l'aide d'algorithmes rapides tu peux récupérer la normale du plan en collision (je prêche pour ma paroisse mais j'explique tout ça dans cet article).

  4. #4
    Membre actif Avatar de Nyarlathotep
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 174
    Points : 217
    Points
    217
    Par défaut
    La méthode consiste à effectuer le travail suivant sur chacun des axes :
    Calculer la distance du centre de la boule à chacun des cotés de la boîte, comme sur le schéma en bleu et en rouge (ici la distance en bleu est négative, puisque la boule est du coté négatif du côté gauche, tandis que la distance rouge est positive).

    On soustrait ou on ajoute ensuite le rayon de la boule à cette distance, suivant le coté sur le quel on est (pour le rouge on soustrait, pour le bleu on ajoute). On obtient ainsi la distance de la boule aux cotés de la boîte.

    On fait ensuite le produit des deux distances ainsi calculées, et si on trouve un nombre positif, la boule est à l'intérieur de la boîte (sur l'axe choisit uniquement, il faut encore tester les autres).

    Une fois la collision détectée (collision sur les 3 axes), on détermine la distance minimale sur chaque axe, et on obtient comme ça le coté où il y a eu collision.
    "That is not dead which can eternal lie
    And with strange aeons even death may die"

    The Call of Cthulhu

  5. #5
    Membre éclairé
    Avatar de N_I_C_S
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 450
    Points : 681
    Points
    681
    Par défaut
    Ah ça y est, j'ai compris .

    Le problème c'est que par exemple si la boule fait un mouvement du genre :
    Nom : collision.jpg
Affichages : 187
Taille : 3,8 Ko
    l'algorithme retournera la face du haut comme face de collision et non la face de droite...

  6. #6
    Membre actif Avatar de Nyarlathotep
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 174
    Points : 217
    Points
    217
    Par défaut
    l'algorithme retournera la face du haut comme face de collision et non la face de droite...
    Il faut evidemment que les intervalles de temps soient suffisamment petits pour que cela ne se produise pas. Et d'après ce que j'ai compris, on n'a accès qu'à la dimension du mur et la position de la boule. Donc, typiquement, au moment où se fait la détection de collision, la balle est déjà dans le mur.
    "That is not dead which can eternal lie
    And with strange aeons even death may die"

    The Call of Cthulhu

Discussions similaires

  1. Gestion de collision avec une sphère
    Par iroquoise rosa dans le forum OpenSceneGraph
    Réponses: 12
    Dernier message: 04/04/2012, 21h37
  2. Résolution de collision entre une sphère et un plan
    Par faucheuse dans le forum Physique
    Réponses: 22
    Dernier message: 05/06/2011, 12h49
  3. collision entre un sprite d'une classe et un vector2d liste
    Par kate59 dans le forum Développement 2D, 3D et Jeux
    Réponses: 7
    Dernier message: 21/04/2008, 23h10
  4. une caméra, une sphère et des collisions
    Par Kurisu dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 22/06/2007, 15h28
  5. Collision entre une pyramide a base rectangulaire et un point
    Par lXT95l dans le forum Mathématiques
    Réponses: 7
    Dernier message: 20/03/2007, 22h55

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