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

Algorithmes et structures de données Discussion :

rebond balle plan


Sujet :

Algorithmes et structures de données

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 117
    Points : 35
    Points
    35
    Par défaut rebond balle plan
    salut

    je suis en train de faire un petit prog dans lequelle on voit une balle rebondir dans un cube sa marche plutôt bien mais voila je ne suis pas satisfait de ma gestion des collisions
    je procède ainsi
    - je détecte la distance entre le plan et le centre de la sphère
    - puis suivant avec quelle axe le plan est parallèle je multiplie la bonne coordonné par -1
    en fait je voudrais savoir comment je peux faire pour calculer le symétrique de la vitesse de la balle par rapport à la normal du plan pour avoir la nouvelle vitesse.

    merci
    @+

  2. #2
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 53
    Points : 64
    Points
    64
    Par défaut
    Salut,


    Pour un rebon parfait, comme tu sembles le vouloir, on peut utiliser une formule simple à base de vecteurs : tu calcules la composante de ta vitesse suivant la normale au point d'imapct et tu ajoutes le double de l'opposé de la normale multiplié par la composante calculée précédement. Il y a les cas particuliers de la collision avec deux ou trois points dans un cube cependant qui imposent quelques vérifications.

    V' = V - 2 * V . N * N

    (V : ancienne vitesse ; V' : nouvelle vitesse ; N : normale au point d'impact ; . : produit scalaire entre deux vecteurs ; * : produit scalaire aussi, mais avec au moins un scalaire)

    NB : il faut orienter la normale vers la balle pour que le résonnement soit correct (donc vers l'intérieur du cube dans ton cas).

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 117
    Points : 35
    Points
    35
    Par défaut
    je viens d'essayer la formule et sa marche pas je sais pas pourquoi
    voila le code

    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
     
    // dr c'est un vecteur qui appartient au plan
    Vecteur normal = dr;
    Vecteur nb (2,0,0);
    vitesse = vitesse - normal*2*Produit_Scalaire(vitesse,normal); 
     
    // les opérateurs
    Vecteur Vecteur::operator - (Vecteur v)
    {
    	Vecteur res;
    	res.x = x-v.x;
    	res.y = y-v.y;
    	res.z = z-v.z;
     
    	return res;
    }
    double Produit_Scalaire (Vecteur v1,Vecteur v2)
    {
     
    	return (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z);
     
    }
    Vecteur Vecteur::operator * (double n)
    {
    	Vecteur res;
    	res.x = x*n;
    	res.y = y*n;
    	res.z = z*n;
     
    	return res;
    }

  4. #4
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 53
    Points : 64
    Points
    64
    Par défaut
    Salut,

    Le problème vient peut-être de la définition du vecteur normal à la surface, en effet il ne s'agit pas d'un vecteur appartenant à la face, mais d'un vecteur perpendiculaire à la face (ou à tout vecteur appartenant à la face). Pour calculer un vecteur normal à une face, il faut commencer par déterminer deux vecteur qui appartiennent à la face et qui ne soient pas collinéaires. Un vecteur normal à la face est ensuite le résultat du produit vectoriel des deux vecteurs précédents. Il est préférable de normaliser le vecteur ainsi trouvé. Comme une face dispose de deux côtés, il faut vérifier que le vecteur pointe du bon côté. Pour cela il te faut vecteur qui va en gros (à 90° - |epsilon| près) dans le même sens que le sens dans lequel doit aller le vecteur normal. Si tu n'as pas un tel vecteur, tu peux en construire un à partir d'un point de la face et d'un point dont tu sais de quel côté de la face il se trouve (qui n'appartient donc pas à la face). Tu calcules le produit scalaire (s'il est positif, les deux vecteurs vont dans le même sens) et si le vecteur normal ne va pas dans le sens que tu voudrais, il te suffit de prendre l'opposé.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 117
    Points : 35
    Points
    35
    Par défaut
    en fait tu avait raison pascal_damien le pb venait de la normal
    j'ai refais le code et sa marche nickel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Vecteur u = (*it_mur).p3-(*it_mur).p1,
                v = (*it_mur).p2-(*it_mur).p1;
    Vecteur normal = u^v;
    normal.Normaliser ();
    vitesse = vitesse - normal*2*(vitesse*normal);
    merci

Discussions similaires

  1. Besoin d'aide: rebonds balle/balle
    Par psgarsenal dans le forum Physique
    Réponses: 11
    Dernier message: 26/02/2016, 19h58
  2. Rebond balle - changer de couleurs
    Par bromy dans le forum Programmation multimédia/Jeux
    Réponses: 2
    Dernier message: 19/11/2012, 19h13
  3. Rebond balle/brique : Recherche désespérément algo fonctionnel
    Par [INSA]Piwai dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 03/07/2006, 11h38
  4. Rebond simple d'une balle
    Par Fiquet dans le forum Algorithmes et structures de données
    Réponses: 21
    Dernier message: 11/10/2005, 16h48
  5. Réponses: 2
    Dernier message: 05/08/2005, 09h21

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