2010-08-29 5 views
1

Les boules sont définies comme des cercles avec un rayon, une position et une vitesse, qui est un vecteur 2D. Les murs sont définis par un point de départ et un point final.Comment puis-je détecter si une balle s'éloigne d'un mur?

Je suis capable de détecter la collision entre la balle et le mur et je sais comment la refléter par rapport à la normale. Cependant, la même collision peut être détectée à nouveau et le changement de direction est retourné à plusieurs reprises, ce qui signifie essentiellement que la balle cesse de bouger.

Donc vraiment besoin d'un moyen simple de dire qu'une balle s'éloigne déjà de la ligne afin que je puisse ignorer toute collision supplémentaire.

+0

La réponse de Hitesh fonctionne pour moi, parce que mes balles ne peuvent toucher qu'un côté du mur, donc je peux échanger les points de départ et de fin, de sorte que la normale pointe du côté où elle peut frapper, mais Will a un point cela ne fonctionnerait pas dans tous les cas. – davidbuttar

Répondre

3

Vous devez avoir un vecteur normal sur le mur pour connaître son orientation. Prenez un produit scalaire entre le vecteur vitesse de la balle et le mur normal. Si le résultat du produit scalaire est supérieur à zéro, la balle s'éloigne du mur. Si elle est nulle, alors la balle se déplace parallèlement et si elle est inférieure à zéro, alors la balle se déplace vers le mur.

explication supplémentaire: 2010-08-29 18:17

Une question a été soulevée au sujet de l'affaire du moment où le mur supporte les collisions des deux côtés. Pour gérer correctement les collisions, vous devez répondre à deux questions: de quel côté du mur la balle est-elle active («dedans» ou «dehors») et dans quelle direction se déplace-t-elle par rapport au mur normal? Comment déterminer la réponse à la deuxième question est répondu ci-dessus. Pour répondre à la question de savoir si la balle est «à l'intérieur» ou «à l'extérieur» du mur, vous commencez par calculer le vecteur entre la balle et le mur (un point sur le mur - centre de la balle). Prenez le produit scalaire de ce vecteur avec le vecteur normal de la paroi. Si le résultat est inférieur à zéro, la balle est «à l'extérieur» du mur. Egal à zéro est sur le mur et supérieur à zéro est «à l'intérieur» du mur.

Vous avez alors la réponse à vos deux questions. Est-ce que la balle est actuellement «à l'intérieur» ou «à l'extérieur» du mur et se dirige-t-elle actuellement vers «l'intérieur» ou «l'extérieur» du mur?

0

Peut-être pas la meilleure façon, mais vous pouvez placer la balle très petite distance du mur ... sinon je pense qu'il serait bon de savoir plus sur votre conception ...

1

La réponse de Hitesh est réellement fausse, car la normale de la ligne pourrait pointer dans l'une ou l'autre direction perpendiculaire à la ligne. C'est comment j'ai d'abord pensé à résoudre le problème, mais ensuite rapidement réalisé ne fonctionnerait pas.

Balles: xb, yb, radius, vx, vy

Murs: x1, y1, x2, y2

float Ang1 = atan2(y1-yb, x1-xb); 
float Ang2 = atan2(y2-yb, x2-xb); 
float AngB = atan2(vy, vx); 

//Catch cases where the wall straddles the change from 2pi radians to 0 radians 
//and revolve all the angles around by pi to avoid the problem 
//Can only happen in a specific region, this can be done easily by adding 2pi to 
// any negative angles. 

Ang1 = (Ang1 < 0) ? Ang1 + 2 *PI : Ang1; 
Ang2 = (Ang2 < 0) ? Ang2 + 2 *PI : Ang2; 
AngB = (AngB < 0) ? AngB + 2 *PI : AngB; 

AngU = max(Ang1, Ang2); 
AngL = min(Ang1, Ang2); 

bool Towards = (AngL < AngB && AngB < AngU) ? true : false; 
+0

Si la normale de la face du mur la plus proche s'éloigne de la balle, la balle est à l'intérieur du mur. Sachez aussi qu'arctan() n'est pas unique dans tous les quadrants. –

+0

@David Lively: Il définit chaque mur en utilisant seulement deux points, donc chaque mur est vraiment juste une ligne, sans profondeur, et donc aucune définition de "à l'intérieur du mur". Aussi, l'arctan() n'étant pas unique est la raison pour laquelle j'ai utilisé atan2; http://en.wikipedia.org/wiki/Atan2 – will

0

Juste une pensée .. Si vous savez que la balle a frappé le mur déjà - Que diriez-vous en utilisant une sorte de drapeau qui le dit. Une fois que vous avez détecté une collision, définissez ce drapeau sur true. Plus spécifiquement - si vous avez des murs, et que les balles ne peuvent pas entrer en collision les unes avec les autres - ajoutez un tableau de booléens à chaque balle qui représente le temps ou non, il est entré en collision avec chaque mur. Initialisez-le à tous faux. Une fois que vous avez détecté une collision, réglez la valeur du mur correspondant sur Vrai, et vous saurez ainsi que vous ne cherchez pas la collision de la même balle avec le même mur. Une fois que vous avez détecté que la bille entre en collision avec un autre mur, définissez toutes les valeurs du tableau sur false, à l'exception du dernier mur avec lequel vous êtes entré en collision. Évidemment, une balle ne peut pas entrer en collision avec le même mur deux fois avant de frapper un autre mur (encore une fois, en supposant que les murs sont droits, les balles ne se heurtent pas et que les balles vont dans des directions droites.ne suppose pas ceux qui nécessitent un peu plus de travail :))

Est-ce que c'est ce que vous cherchiez ou n'ai-je pas votre question?

+0

J'ai pensé à faire ça, et ça marcherait sans aucun doute, mais ça semblait plus propre, de faire le test pour s'éloigner. – davidbuttar

Questions connexes