Déterminer l'angle résultant de la collision avec le mur

14

J'ai donc un objet se déplaçant dans une direction vers un mur fixe horizontal ou vertical. Comment calculer l'angle auquel l'objet doit rebondir? L'objet peut s'approcher du mur à un angle arbitraire.

DRiFTy
la source

Réponses:

18

Si vous connaissez le vecteur normal du mur et avez une direction entrante pour l'objet, alors ce que vous voulez, c'est la réflexion d'un vecteur à travers un plan .

Si n est un vecteur normalisé et v est la direction entrante , alors ce que vous voulez est - (2 ( n · v ) n - v ). Le signe moins explique que la formule de réflexion n'inverse pas réellement la direction, comme la vitesse d'un objet s'inverserait.

Cette réponse est donnée en termes de mathématiques vectorielles, pas d'angle, car c'est généralement préférable si vous n'avez pas de raison explicite d'utiliser un angle. Notez que si vous devez parler d'angles, l'angle de réflexion est égal à l'angle d'incidence. Si l'angle est mesuré à partir de la normale, l'angle sortant est la négation de l'angle entrant; si l'angle est mesuré à partir du mur, c'est le complément de l'angle entrant.

John Calsbeek
la source
Grande explication. Cela a fonctionné très bien pour moi! Merci!
DRiFTy
13

Vous n'avez pas précisé s'il s'agissait d'un jeu 2D ou 3D. Mais si c'est un jeu 2D et que vos murs sont garantis horizontaux ou verticaux et que vous voulez simplement faire rebondir l'objet sur eux, il y a un moyen beaucoup plus simple que d'avoir à gérer les reflets.

Niez simplement la composante X de la vitesse de l'objet lorsque vous frappez un mur vertical, ou la composante Y de la vitesse de l'objet lorsque vous frappez un mur horizontal. Exemple:

if( /* hit vertical wall */ )
{
    object.velocity.x *= -1;
}
if( /* hit horizontal wall */ )
{
    object.velocity.y *= -1;
}

Mais si vous vous souciez vraiment de connaître l'angle, alors en termes généraux, l'angle de réflexion est le même que l'angle d'incidence. Cet angle est mesuré par rapport à la normale du mur. Voici une image qui devrait être claire:

entrez la description de l'image ici

Au cas où vous auriez besoin de gérer cela pour des murs arbitraires, vous devrez voir comment refléter un vecteur. C'est vraiment juste une petite formule qui prend la normale du mur et le vecteur d'incidence, et renvoie le vecteur réfléchi pour vous. Voici la formule utilisée par XNA:

public static Vector3 Reflect(Vector3 vector, Vector3 normal)
{
    return vector - 2 * Vector3.Dot(vector, normal) * normal;
}

Et pour la 2D, vous pouvez simplement faire:

public static Vector2 Reflect(Vector2 vector, Vector2 normal)
{
    return vector - 2 * Vector2.Dot(vector, normal) * normal;
}
David Gouveia
la source
Désolé, c'est un jeu 2D. Je voudrais le garder en fonction de l'angle car comme vous l'avez dit, j'aimerais pouvoir utiliser n'importe quel mur. Merci!
DRiFTy
Je l'ai édité pour couvrir aussi la 2D. En fait, c'est la même chose, juste avec des vecteurs 2D, les mêmes opérations et formules
Gustavo Maciel
Un mur dans un jeu 2D peut être incliné, donc l'énoncé if it's a 2D game and your walls are guaranteed to be horizontal or verticaln'est pas correct. La deuxième partie de la réponse concerne la mise en œuvre correcte. À mon humble avis, l'ordre des pièces doit être inversé, présentant la solution générale en premier et en détail, tandis que la solution à angle droit est présentée comme une simplification pour le cas exceptionnel.
XenoRo