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

 C Discussion :

Création de moteur physique, problème de collision


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 48
    Par défaut Création de moteur physique, problème de collision
    Bonjour à tous !

    Je suis en train de coder un petit moteur physique. J'ai réussi à faire ce que je voulais



    Comme vous pouvez le voir sur cette vidéo, quelques rares points arrivent à traverser lignes avec lesquelles ils rentrent en collision.

    Pour gérer les collisions, je chronomètre la boucle principale, je calcule la position suivante et crée 2 vecteurs, avec les 2 points (position et position suivante) et une extrémité d'une droite. Ensuite je regarde les angles entre la droite et le vecteur position, puis avec le vecteur position suivante. S'il y a changement de signe c'est que le point va traverser la droite, c'est à ce moment là que je déclenche la collision.

    Voila la fonction qui gère les collision, je ne vois pas ou j'ai pu commettre une erreur et pourquoi certain points arrivent à se faufiler entre les conditions.


    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
     
    #include "structures.h"
     
    int fonction_collision(struct structure_objet_physique *Objet, struct Structure_geometrique_ligne Ligne)
    {
         //creation du vecteur représantant la ligne
         struct Structure_geometrie_vecteur Vecteur_ligne;
         Vecteur_ligne.x = 0;
         Vecteur_ligne.y = 0;
     
         fonction_coordonnees_vecteur(&Vecteur_ligne, Ligne.x[0], Ligne.y[0], Ligne.x[1], Ligne.y[1]);    
     
     
         //création du vecteur position par rapport a la ligne
         struct Structure_geometrie_vecteur Vecteur_position_relative;
         Vecteur_position_relative.x = 0;
         Vecteur_position_relative.y = 0;
     
         fonction_coordonnees_vecteur(&Vecteur_position_relative, Ligne.x[0], Ligne.y[0], (*Objet).Vecteur_position.x, (*Objet).Vecteur_position.y);
     
         //calcul de la position suivante
         struct Structure_geometrie_vecteur Vecteur_position_relative_suivante;
         Vecteur_position_relative_suivante.x = 0;
         Vecteur_position_relative_suivante.y = 0;
     
         fonction_coordonnees_vecteur(&Vecteur_position_relative_suivante, Ligne.x[0], Ligne.y[0], (*Objet).Vecteur_position_suivante.x, (*Objet).Vecteur_position_suivante.y);
     
         //calcul de la difference de position
         struct Structure_geometrie_vecteur Vecteur_delta_position;
         Vecteur_delta_position.x = 0;
         Vecteur_delta_position.y = 0;
     
         fonction_coordonnees_vecteur(&Vecteur_delta_position, (*Objet).Vecteur_position.x, (*Objet).Vecteur_position.y, (*Objet).Vecteur_position_suivante.x, (*Objet).Vecteur_position_suivante.y);
     
     
         //calcul de l'angle entre les vecteurs
         double angle_initial = fonction_angle_entre_vecteur(&Vecteur_ligne, &Vecteur_position_relative),
         angle_final = fonction_angle_entre_vecteur(&Vecteur_ligne, &Vecteur_position_relative_suivante),
         angle_delta_position = fonction_angle_entre_vecteur(&Vecteur_ligne, &Vecteur_delta_position);
     
     
         if( ((angle_initial > 0 && angle_final < 0) || (angle_initial < 0 && angle_final > 0))
         && fonction_produit_scalaire(&Vecteur_ligne, &Vecteur_position_relative) > 0
         && fonction_produit_scalaire(&Vecteur_ligne, &Vecteur_position_relative) < fonction_norme_vecteur(&Vecteur_ligne) * fonction_norme_vecteur(&Vecteur_ligne))
         {
                 (*Objet).Vecteur_position_initiale.x = (*Objet).Vecteur_position.x;
                 (*Objet).Vecteur_position_initiale.y = (*Objet).Vecteur_position.y;
     
                 (*Objet).Vecteur_vitesse_initiale.x = 0.7*(*Objet).Vecteur_vitesse.x;
                 (*Objet).Vecteur_vitesse_initiale.y = 0.7*(*Objet).Vecteur_vitesse.y;             
     
                 fonction_rotation_vecteur(&((*Objet).Vecteur_vitesse_initiale), (-2*angle_delta_position));
     
                 (*Objet).temps_initial = SDL_GetTicks();
                 return 1;
         }
         else {return 0;}
    }
    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Bonjour,
    Je n'ai pas le temps de vraiment regarder le code, mais as-tu pensé au cas particulier où un point arrive exactement sur la ligne? Peut-être y aurait-il quelque chose à voir de ce côté-là...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Essaie de vérifier également la précision de tes nombres. Il est possible que, dans des cas extrêmes, ton valeur soit arrondie du « mauvais côté ».

Discussions similaires

  1. Moteur physique 2D : deux objets en collisions ne peuvent plus bouger
    Par voblivion dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 04/12/2014, 18h50
  2. Réponses: 4
    Dernier message: 15/11/2014, 16h06
  3. Création d'un moteur physique : les bases
    Par zenux dans le forum Physique
    Réponses: 1
    Dernier message: 31/01/2013, 11h15
  4. Moteur Physique open GL sous Delphi (collisions et saut)
    Par overlolo dans le forum Physique
    Réponses: 3
    Dernier message: 26/03/2008, 00h36

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