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

OpenGL Discussion :

Collisions et vitesse


Sujet :

OpenGL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 145
    Points : 55
    Points
    55
    Par défaut Collisions et vitesse
    Salut,

    J'ai adapté un système de détection des collisions dans un monde 3d, en prenant exemple sur un tutorial de http://www.gametutorials.com/Tutoria...OpenGL_Pg3.htm (camera and world collision)

    Ca fonctionne bien, mais le problème c'est que dès qu'on augment la vitesse de déplacement ça fonctionne plus, on passe à travers les murs...

    Auriez vous une idée pour remédier à cela ???

  2. #2
    Membre actif
    Profil pro
    Ingénieur développement
    Inscrit en
    Juillet 2004
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement

    Informations forums :
    Inscription : Juillet 2004
    Messages : 323
    Points : 291
    Points
    291
    Par défaut
    C'est un problème assez connu en 3D pour les collisions. En général, si l'algo fait ça, c'est qu'il n'est pas très efficace. de plus, dès que tu vas baser tes anims sur des temps clef en fonction de la vitesse de l'ordinateur, ça va buguer à mort.

    Pour ma part, je m'étais penché sur les problèmes de collisions il y a quelques temps.

    J'avais trouvé une solution qui n'est peut-être pas la meilleure, mais qui fonctionne bien.

    Ca consiste à faire un lancé de rayon et à s'arrêter si ton rayon (segment de droite défini par le point ou tu es, et le point ou tu vas) traverse un triangle de ton modèle collision, alors il ne faut pas bouger ou trouver une réaction appropriée.

    Le rayon est facile à calculer. Il faut ensuite l'écrire sous forme d'une droite dans l'espace, c'est à dire deux équations paramétriques.
    x = ay +b et z=cx + d

    Ensuite, tu calcules le plan défini par le triangle que tu veux tester. Pour cela, tu prends l'équation de la normale au plan + un point et tu trouves l'équation du plan du type ex + fy + gz = h.

    Ensuite, tu résouds le système pour trouver le point d'intersection entre ta droite et le plan.

    S'il en existe un, tu vas maintenant tester qu'il est bien dans ton triangle (ton polygone). Pour cela, il y a une astuce qui consiste à ajouter les 3 angles définis par le point trouvé, et les 3 points du triangle.

    Si celui-ci est supérieur à 180 degrès, alors, le point est à l'extérieur du triangle, sinon, il est bien à l'intérieur.

    Dans ce dernier cas, s'il est bien dedant, il faut vérifier que le point d'intersection est bien entre ton point de position de départ et ton point d'arrivé. Pour cela, il suffit de comparer une coordonnée comme y par exemple.

    Et voilà, tu sais maintenant si tu passes à travers ou pas.

    Pour calculer les angles défini par le point d'intersection du rayon avec le plan et les vertex du triangles, il faut utiliser les formules du produit scalaire.
    Il en existe 2, et en combiant les deux :
    norme(a)*norme(b)*cos(angle) = x1*x2 + y1*y2 + z1*z2

    on en déduit le cosinus, puis l'angle en question.


    Fais étape par étape et tu t'en sortira. Dans mon cas, le problème était plus compliqué car je devais effectuer un glissement lors d'une collision. Pour cela, je lançait 7 rayons dans 7 angles différents autour de ma position sauf derrière.
    Dans le cas ou il n'y avait pas de collision, la résultante me donnait le déplacement. Dans le cas ou un ou plusieurs rayon entraient en collision, je normait le rayon par rapport à la distance de collision, puis je prennais encore la résultante, et ça me donnait le vecteur glissement.
    Хајде Јано коло да играмо

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 145
    Points : 55
    Points
    55
    Par défaut
    En fait moi ça fait à peu près ça.

    Si ça détecte une collision, ça calcule la distance à laquelle on doit reculer pour ne plus être en collision.
    Et ça repousse.

    Mais le problème c'est qu'à vitesse élevée, je pense qu'il n'y a plus assez de test car sur ma map mon fps est environ 60.

    Alors que sur une autre map, à la même vitesse, avec une fps de 150, je ne pase plus à travers les murs.

  4. #4
    Membre actif
    Profil pro
    Ingénieur développement
    Inscrit en
    Juillet 2004
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement

    Informations forums :
    Inscription : Juillet 2004
    Messages : 323
    Points : 291
    Points
    291
    Par défaut
    Pour que comme tu dis, ça repousse, je te conseille d'utiliser ma technique.

    Tu fais comme si tu avais une boule. Tu envoies des rayons dans 7 direction autour de la boule. Donc tous les angles pi/4 sauf celui de derrière.

    Ensuite, tu norme tes vecteurs en fonction des collisions avec les polygones, puis tu fais la résultante.

    Ca marche très bien dans tous les cas.
    Хајде Јано коло да играмо

  5. #5
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par goutbouyo
    Mais le problème c'est qu'à vitesse élevée, je pense qu'il n'y a plus assez de test car sur ma map mon fps est environ 60.

    Alors que sur une autre map, à la même vitesse, avec une fps de 150, je ne pase plus à travers les murs.
    Tu ne dois pas baser tes calculs de collision sur tes FPS !

    fais les à intervalles fixes (toutes les 10 ms par exemple) meme si le déplacement d'une frame à l'autre prend plusieurs étapes de ton calcul de collision. a 60 fps, tu auras entre 1 et 2 calculs de collision par frame ce qui t'assurera à peu près une bonne rejouabilité indépendante de l'ordi sur lequel tu joues.

    De plus, limite ta vitesse pour que à précision donnée (toutes les dix ms) tu ne puisses pas avoir le temps de passer à travers un mur : si ton épaisseur dans toutes les directions est supérieure à 1 metre et que tu te déplaces à moins de 1 metre par update de collision alors tu ne pourras jamais passer à traver un autre objet immobile.

    Si tu ne peux/veux pas limiter la vitesse il reste la solution de détermination d'intersection du mur avec ton "cylindre de déplacement". Le cylindre de déplacement est un objet en quatre dimensions que tu peux représenter comme un cylindre qui intercepte un autre cylindre qui représente la trajectoire de l'objet que tu risques d'intersecter.
    La collision est le point d'intersection placé le plus proche dans le temps.

    Tu peux évidemment faire plein de simplifications suivant les données de ton problème (déplacement sans rotation propre, symétrie de ta bounding box, aucune collision avec des objets "mobiles" etc..)

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 145
    Points : 55
    Points
    55
    Par défaut
    En fait mon intersection se fait à partir d'une sphère(la caméra) et des polygons ou quads.

    J'avais ma distance (radius de ma sphère) réglée sur 1.

    Je l'ai mise à 5 et maintenant c'est bon, ça fonctionne.

+ 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. Collision Box2D vs Box2D + Vitesse
    Par bathof dans le forum Physique
    Réponses: 2
    Dernier message: 30/12/2007, 15h15
  3. vitesse forcée sur collision
    Par filiplj dans le forum ODE
    Réponses: 0
    Dernier message: 23/08/2007, 16h00
  4. test collisions
    Par tatakinawa dans le forum OpenGL
    Réponses: 5
    Dernier message: 08/06/2002, 06h03
  5. Vitesse de la mémoire vidéo
    Par Anonymous dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 06/06/2002, 20h20

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