6
votes

Collision de AABB coulissante - Reste coincée sur les bords

Je travaille sur un jeu basé sur des tuiles 3D et j'utilise la détection de collision AABB. Pour chaque cube que le joueur intersecte, je trouve l'axe le long duquel le joueur intersecte le moindre cube et repoussez le joueur du cube le long de cet axe.

Selon l'ordre que les cubes sont vérifiés, cela peut causer des problèmes lors de la glissement le long du bord de plusieurs cubes. J'ai créé un diagramme qui devrait expliquer le problème:

http://imgur.com/mmk0w.png

  • La flèche n ° 1 est la tentative de mouvement du joueur. Les autres flèches sont la réponse de collision.
  • Dans le diagramme gauche, la collision est testée d'abord contre le cube droit, ce qui entraîne la poussée du joueur à gauche, puis vers le haut. ( mauvais )
  • Dans le diagramme de droite, la collision est testée d'abord sur le cube de gauche, ce qui entraîne la poussée du joueur à la hausse, à quel point le joueur n'échange plus l'autre cube. ( bonne )

    Des idées sur ce que le moyen le plus efficace de résoudre cela pourrait être? Ou de meilleurs moyens de gérer la réponse de collision?

    merci.


2 commentaires

Peut-être vérifier toutes les collisions et notez le temps (ou la distance) de la collision. Appliquer uniquement la collision qui se passe la plus tôt. Continuez éventuellement le processus pour le reste de l'étape de l'étape.


Donc, si j'ai trié tous les cubes, le joueur se croisait à distance du joueur, puis considéré comme un à la fois, cela pourrait fonctionner. Je pense qu'il serait préférable d'éviter de devoir trier les choses chaque cadre, mais je ne suis pas sûr que cela importerait beaucoup depuis que le joueur ne pouvait être en collision avec jusqu'à ce que? 7? blocs à la fois. Pensez-vous qu'il y a quelque chose à craindre de là?


4 Réponses :


0
votes

De votre diagramme, il semble que vous souhaitiez le plus petit mouvement qui minimise le chevauchement entre le joueur et les cubes. Chaque cube avec chevauchement va essayer de "pousser" le joueur dans deux directions orthogonales. Pouvez-vous faire quelque chose comme choisir la pression minimale des pousses maximum dans chaque direction?


4 commentaires

Je pense que cela causerait des problèmes si le joueur entrait dans un coin. Dans ce cas, j'ai besoin de pousser le joueur à l'envers le long de 2 axes.


D'accord; Penser en 2D, la poussée doit avoir un composant vertical et horizontal. Chaque cube qui se chevauche peut conférer une poussée dans deux directions de {n, s, e, w}. S'il y a plusieurs cubes qui se chevauchent, vous devez prendre en compte les instructions maximales dans les directions {N, S} et {E, W} (rien de moins laissera le chevauchement, mais il peut être possible d'ignorer, disons, un ns poussoir parce que Une poussée EW fera le travail). Il y a au plus huit possibilités. Pouvez-vous essayer les huit dans l'ordre de la magnitude et choisir le premier qui efface le joueur des cubes?


Malheureusement, il y aurait encore plus de jeux possibles dans 3 dimensions. Il serait probablement plus efficace de trier initialement les blocs basés sur la distance comme suggère de Tom.


Eh bien, il y en a au plus 26 possibilités de 3D et la seule façon dont vous disposeriez de les considérer, c'est si une personne du joueur cube interverse avec un cube de jeu.



4
votes

Une implémentation discrète vous oblige à injecter des mathématiques continues dans le système, uniquement lorsque cela est nécessaire (cubes / directions se chevauchent).

pour chaque cube c1 , c2 ... CI avec lequel le cube utilisateur ( uc ) intersects Au moment du chèque, vous voulez savoir quel cube a été "touché" en premier - il n'y en a qu'un, comme dans la vie réelle. Considérez la direction d de uc et, en prenant la quantité de uc dans CI (chevauchement) trouve la position de Cu au moment où il "touche" CI .

Déterminez quel cube a été "touché" d'abord CJ (celui qui nécessitait le plus de retournement sur l'axe d - le plus tôt à temps) et n'utilisez que celui-ci à calculer la réaction de collision.

Non seulement vous atteindrez la précision. Mais cela aidera si tous les cubes bougent, ont des vitesses différentes, etc.


4 commentaires

+1. J'ai fait quelque chose comme ça une fois, bien que ce soit une douleur à mettre en œuvre et à déboguer. Vous pouvez rencontrer des difficultés en utilisant cette approche lorsque le mouvement d'objets d'une image à l'autre n'est pas le long d'une ligne linéaire, mais sinon cela fonctionne vraiment bien. Vous devrez vous rappeler la position précédente (et peut-être la vitesse précédente) de chaque objet pouvant bouger afin que vous puissiez calculer la position et la vitesse des objets à tout moment entre deux cadres.


J'ai un peu de mal à comprendre ce que vous dites, mais je pense que cette réponse aurait également un problème si le joueur essayait de marcher dans un coin d'une pièce. Je crois qu'il serait nécessaire de prendre plus d'un bloc. Je pourrais peut-être trier tous les blocs que le joueur collision avec, mais je ne suis pas sûr que si cela serait préférable d'éviter de trier les choses.


Le mur de la pièce doit être traité de la même manière que d'autres cubes - il s'agit d'un cas particulier (plus facile): vous vérifiez si le cube est hors des limites et, en utilisant le même algorithme, déterminez la quantité de cube Ensuite, vous vérifiez les collisions avec d'autres cubes. Encore une fois, la première "touchée" (un autre cube ou le mur) doit être traitée avec une réaction de collision. Le mur est juste un objet particulier non volumineux et plus grand avec lequel le cube peut entrer en collision.


Je dis que si le joueur entra dans le coin, il intersectant 3 cubes (si c'était 2D). Comment calculeriez-vous uniquement la réponse appropriée en utilisant un cube lorsque le joueur doit être déplacé sur deux axes? Je pense que je devrais les trier à distance et que je considère potentiellement chacun d'eux. Bien que je n'aurais besoin que de considérer deux dans ce cas.



0
votes

Vous pouvez mettre en œuvre une sorte de phase large hybride lorsque vos deux (ou plus) cubes fixes d'une rangée peuvent être combinés en un plus grand rectangle. Testez d'abord sur le plus gros rectangle. Cela vous donnera les résultats de votre coche verte et soyez plus rapide que de vérifier chaque cube de toute façon. Ensuite, après cela, seulement si vous avez besoin de vérifier contre les cubes individuels.


1 commentaires

J'essaye de penser comment j'appliquerais cela à 3 dimensions. Si j'avais une forme comme un «L» qui se levait, je pouvais combiner 2 blocs horizontalement ou verticalement. Mais je pense que l'ordre que je devrais appliquer la réponse dépendrait de la position de la position ou du mouvement du joueur.



0
votes

Une collision peut pousser un objet sur 1 axe uniquement. Pour déterminer l'axe à pousser: xxx

Ceci fonctionne si vos tuiles sont alignées.

Utilisez des cercles pour éviter le bâton sur des tuiles non alignées


0 commentaires