1

Dites que j'ai plusieurs objets en mouvement. Je connais leur forme (qui est simple comme une boîte, une sphère, un cylindre) et leur position fonctionne bien dans le temps (ce qui n'est pas linéaire). Je voudrais détecter quand et où ils entrent en collision avec un autre objet en mouvement spécifique (un objet spécial). J'espérais qu'il existait une sorte de bibliothèque qui détectait le point dans l'espace et le temps où deux objets entreraient en collision mais je ne pouvais pas en trouver un.Détection de collision d'objets en mouvement

Connaissez-vous des algorithmes efficaces pour résoudre ce problème ou des bibliothèques (dans n'importe quelle langue) pour le résoudre?

+0

Les classes de collision (structures) sont Open Source dans le cadre Monogame. Je les ai arrachés et les ai ajoutés à mon moteur de jeu. – Krythic

+0

Quel type de fonction de position non linéaire avez-vous? – LmTinyToon

+0

Fonctions paramétriques des polynômes – Jake

Répondre

0

Il existe de nombreux algorithmes, mais ils sont tous spécifiques aux types d'objets. Le modèle général pour la vitesse linéaire est, vous prenez l'équation pour la distance forme/forme, paramétrez-la dans le temps (compte tenu de la position relative des objets et de la vitesse relative), et résolvez pour une distance de zéro. Par exemple, si vous aviez deux sphères, et la position relative de la seconde par rapport à la première était X0, et la vitesse relative de la seconde par rapport à la première était V, et les sphères avaient des rayons r1 et r2, vous résoudriez D(t) = ||X0 + V*t|| - (r1+r2) = 0.

Pour un mouvement non linéaire, vous avez essentiellement X (t) en tant que fonction, au lieu de X(t) = X0+V*t. Selon la complexité de cette fonction, cela peut être facile ou difficile. En supposant que c'est dur (c'est probablement le cas), vous opteriez pour une méthode de résolution itérative comme Newton-Raphson. Heureusement, les formules de distance ont tendance à être facile à prendre des dérivés de.

L'autre option pour le mouvement non linéaire est de le discrétiser en étapes linéaires. D'une certaine manière, c'est une méthode itérative bon marché et n-joyeuse, mais étant donné que la plupart des approches de ce genre de chose supposent une vitesse linéaire, c'est probablement la façon la plus simple de les appliquer.

Bien sûr, je triche en utilisant des sphères ici. Les boîtes et les cylindres sont plutôt plus agaçants pour trouver des distances, surtout s'ils sont en rotation. Je peux recommander la détection de collisions en temps réel d'Ericson comme le livre standard sur le sujet; il a un certain nombre de recettes pour différentes paires de formes, ainsi que des méthodes lourdes pour des formes plus compliquées.