0

Je fabrique donc un moteur physique qui n'utilise que des rectangles (boîtes de délimitation alignées sur les axes) comme des formes. J'ai implémenté une méthode du livre de christer ericsons qui retourne le temps de collision et la normale de deux aabbs en mouvement. J'ai aussi fait une autre méthode qui prend deux vitesses, positions et une normale qui réagit à la collision et donne de nouvelles vitesses aux aabbs. Le problème réel est maintenant que je ne sais pas comment la boucle, qui vérifie les collisions entre tous les aabbs et y répond, devrait ressembler. Simplement, je ne comprends pas comment commander les collisions au moment de l'impact et à quelle collision je devrais répondre.Détection de collision - Commande - Quelle est la première collision?

Une boucle écrite en pseudo code qui montre comment commander toutes les collisions serait vraiment utile.

Une autre chose que j'ai mentionnée est qu'il est possible qu'une boîte mobile puisse rebondir entre deux boîtes statiques des centaines de fois dans une seule image si sa vélocité est vraiment élevée, comment gérez-vous cela?

Répondre

0

Vous devez laisser une file d'attente de priorité simple prendre en charge le bon ordre d'exécution. Conceptuellement, cela finirait regarder quelque chose comme ceci:

queue<CollisionEvent> q = new empty queue 
while (!q.isEmpty) { 
    nextCollision = q.dequeueMinimum 
    /* run animation until nextCollision.time 
    ... 
    */ 
    newMovingParticles = nextCollision.movingParticles 
    newCollisions = computeCollisionEvents(newMovingParticles, allOtherParticles); 
    for each event in newCollisions { 
    q.enqueue(event, event.time); 
    } 
} 

Qu'en est-il des boîtes qui se déplacent avec de grandes vitesses: Je ne sais pas. Physiquement, il serait logique de simplement accepter qu'il peut arriver qu'il y ait une séquence d'événements de collisions très fréquents. Je ne peux pas expliquer pourquoi, mais pour une raison quelconque, je ne m'attends pas à des boucles infinies ou à des problèmes de type zeno. Je m'attendrais plutôt à ce que même des collisions frontales de boîtes très lourdes avec des boîtes très légères, où la boîte à lumière est coincée entre la boîte lourde et le mur, se terminent par un nombre fini de pas. C'est ce qui rend les corps rigides rigides, je pense que l'on devrait simplement accepter cela comme une caractéristique.

+0

Puisqu'il n'y a pas beaucoup de programmeurs sur le thème de la détection de collision, puis-je vous demander si vous avez quelque chose comme skype ou facebook où je peux vous atteindre plus comme dans une conversation? J'écris du code en javascript donc psuedo me rend un peu confus. Que signifie la fonction de mise en file d'attente par exemple? – super

+0

Ce n'est pas vraiment du "pseudocode" (peu importe ce que cela signifie), c'est plutôt du code "générique C++/java-esque". La file d'attente est une structure de données premier entré, premier sorti. La file d'attente dont vous auriez besoin ici est une file d'attente qui permet d'insérer des éléments par priorité. Les 'enqueue' et' dequeue' sont les opérations de base supportées par une structure de données 'queue'. Je ne suis ni expert en physique-moteurs, ni en javascript. Cependant, vous voudrez peut-être poser une version plus étendue de votre question, peut-être avec un code exécutable (peut-être l'héberger sur github?), De sorte que quelqu'un ait quelque chose à faire, peut-être que quelqu'un verra de plus près. –