Détection de collision balle vs pente 45 degrés

8

J'ai un jeu simple dans lequel le joueur déplace une balle. La balle rebondit sur les murs. En ce moment, j'ai des murs carrés (■) mis en œuvre: j'utilise de simples collisions dans la boîte englobante pour vérifier si le joueur se déplacera dans un mur lors de la mise à jour de sa vitesse x ou y et si oui, je multiplie cette vitesse par -1 pour les faire rebondir .

Cependant, je veux également implémenter des pièces triangulaires (◢◣◤◥). Pour rebondir, je crois que l'on peut simplement utiliser:

   newxspeed = -1*yspeed;
   newyspeed = -1*xspeed;

Cependant, ce qui me pose problème, c'est la détection de collision: quand le joueur frappe-t-il la diagonale?

Qqwy
la source
2
Je recommande fortement le tutoriel N ( partie 1 , partie 2 ) sur ce sujet.
Chris Burt-Brown
Merci beaucoup. Ce tutoriel m'a en fait aidé à enfin comprendre comment résoudre ce problème.
Qqwy
En fait, il est très difficile pour moi de marquer l'une des réponses comme «la» solution, car toutes m'ont aidé à comprendre le problème, mais aucune ne l'a entièrement résolu. Que devrais-je faire?
Qqwy

Réponses:

8

Tout d'abord, pour calculer la détection de collision entre une sphère (cercle en 2D) et une ligne, vous devez calculer le vecteur perpendiculaire entre le centre de la balle en mouvement et la ligne, afin de calculer cette distance, vous devez procéder comme suit:

entrez la description de l'image ici

Donc, pour calculer d dans la figure ci-dessus, nous devons faire quelques étapes.

  1. Supposons que votre ligne utilise l'équation paramétrique P (t) = S + t V notez que V est la direction de la ligne peut être obtenue en soustrayant (P2 - P1).
  2. Depuis Pythagore:

d ^ 2 = len ( Q - S ) ^ 2 - len (proj ( Q - S )) ^ 2

Ensuite, vous développez l'équation pour obtenir ce qui suit, cela semble un peu compliqué, mais ce n'est pas le cas.

d = sqrt (len ( Q - S ) ^ 2 - len (( Q - S ) point V ) ^ 2 / V ^ 2)

Q est le centre du cercle et S est n'importe quel point sur la ligne. Une fois que la distance est inférieure au rayon du cercle / sphère, vous devez déclencher la réponse à la collision, ce qui est expliqué au point suivant.

Il est incorrect de toujours retourner la composante x ou y pour faire rebondir la balle, ce que vous devez faire est de refléter le vecteur de vitesse, pour ce faire, vous devez calculer le vecteur normal de la surface et utiliser cette normale pour calculer la réflexion vecteur en utilisant l'équation suivante

R = 2 * ( V point N ) * N - V

R est le vecteur de réflexion, N est la normale de la surface et V est le vecteur de vitesse.

En cas de 45 degrés, votre normale de surface sera N = (1,1,0) avec un signe variable selon la direction dans laquelle les faces normales (position ou négatif).

concept3d
la source
Vous utilisez une grande équation. Cependant, il est très difficile à suivre pour quelqu'un qui est nouveau dans les vecteurs. Il serait utile de diviser votre équation en étapes plus petites.
Qqwy
Soit dit en passant, N est-il un vecteur bidimensionnel ou tridimensionnel? D'où vient la troisième valeur (0)?
Qqwy
J'ai utilisé des vecteurs 3D parce que je supposais que vous utilisez une API 3D (et je peux me tromper) au cas où il était vrai que vous deviez définir le 3ème composant sur 0, mais de toute façon les équations devraient fonctionner à la fois pour 2D et 3D (et probablement plus haut) dimensions mais cela n'a pas vraiment d'importance). en ce qui concerne les équations, je peux expliquer plus, mais j'ai besoin de temps pour éditer la réponse.
concept3d
1
J'ai édité la réponse, j'espère que cela a plus de sens maintenant. Btw J'espère que stackexchange peut fournir un moyen pratique d'écrire des formules mathématiques car il est sujet à la douleur et aux erreurs en ce moment.
concept3d
6

Vous voulez mesurer la distance entre le centre de votre balle et le mur, donc:

entrez la description de l'image ici

résoudre le système que vous voyez dans l'image vous donnera les coordonnées du point d.

Ensuite, si la distance entre le point d et c est inférieure ou égale au rayon de la balle r, il y a collision entre la balle et le mur

Marco
la source
5

Les balles sont en fait des objets assez simples pour la détection des collisions. Ils entrent en collision avec le terrain lorsque la distance entre le centre de la balle et le bord du terrain devient inférieure au rayon de la balle. La position du centre du ballon doit être triviale à obtenir. Trouver le point de terrain le plus proche est généralement plus compliqué et la meilleure façon de le faire dépend de la façon dont le terrain est représenté.

Votre algorithme pour calculer la nouvelle vitesse après avoir rebondi sur une pente diagonale est incorrect. Inverser les coordonnées x et y fera revenir la balle dans la même direction que celle à laquelle elle a approché la pente. C'est très bien si le ballon arrive sur le terrain à partir d'un angle droit, mais échoue pour d'autres angles. Vous voudrez annuler uniquement le composant normal à la surface, par exemple lorsque vous rebondissez sur le plafond, vous annulez y, pas x.

Marcks Thomas
la source
Bien que cette réponse n'approche pas directement le problème, +1 pour m'avoir expliqué comment procéder à la résolution des collisions dans ce cas.
Qqwy