2010-12-13 4 views
1

J'ai de la difficulté à apprendre la détection de collision par l'expérience. Je fais un jeu de boîtes, à la Minecraft, et je suis au stade de la mise en œuvre de la détection des collisions. J'ai fait les axes x et y, puisque tout est composé de cubes, je voudrais faire mon propre détecteur de collision et le rendre aussi léger que possible.Détection de collision 3D parfaite C++

Existe-t-il un moyen de réaliser des collisions «parfaites au pixel près», c'est-à-dire lorsque la boîte englobante (ou le cercle) du joueur touche une boîte enregistrée comme collision? En ce moment, ce que je l'ai fait:

if(-TOUCH_DISTANCE-1 < yPlayer-yBox && yPlayer-yBox < TOUCH_DISTANCE-1) 
{ 
    collisionNorth = true; 
} 
if(-TOUCH_DISTANCE+1 < yPlayer-yBox && yPlayer-yBox < TOUCH_DISTANCE+1) 
{ 
    collisionSouth = true; 
} 

Il détecte essentiellement la collision dans une certaine marge et cela signifie que des erreurs, que je n'aime pas :(Notez que le +/- 1 qui compense le « mur de collision. Cela fonctionne, à basse vitesse, mais une fois qu'il y a une action (quand je casse la variable de vitesse), la collision ne peut plus être détectée car je vais trop vite et je passe à droite. à travers le cube ... Y a-t-il un moyen de le prouver à wallhax0r?

Ceci est particulièrement gênant sur l'axe z, lorsque le joueur tombe à grande vitesse et même au moment de définir une marge de collision respectable, il aura l'air méchant (joueur à moitié enterré).

Répondre

3

Vous avez identifié l'un des problèmes de l'utilisation des mathématiques discrètes pour modéliser le chemin d'un objet. À l'heure t l'objet est "ici" et à l'heure t + delta c'est "là" - sans avoir réellement passé par les points entre les deux.

Vous pouvez obtenir plus de précision en diminuant le delta, mais finalement vous allez atteindre la limite de ce que vous pouvez calculer dans cet intervalle de temps.

Si vous pouvez détecter une collision approchant en utilisant un delta temporel relativement grand et une zone de délimitation lâche, vous pouvez augmenter la précision, mais vous allez à nouveau atteindre des limites.

La conversion en un modèle continu peut aider - mais peut prendre plus de puissance de calcul. Vous pouvez passer à cela lorsque vos objets sont proches, donc vous ne le faites pas tout le temps. Désolé, je n'ai pas de réponse définitive, seulement des pointeurs.

+0

Eh bien, il y a 2 jours de code. Non seulement un modèle continu est exact, mais c'est moins cher aussi (dans ce cas). – Solenoid

2

Habituellement, ce que vous devez faire est de garder une trace de la position précédente des objets ainsi que la position actuelle. Ensuite, lorsque vous mettez à jour, vous pouvez vérifier si les objets se sont croisés au cours de la période, plutôt que s'ils se croisent «pour le moment».

Questions connexes