Réponses:
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.
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:
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;
}
if it's a 2D game and your walls are guaranteed to be horizontal or vertical
n'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.
Il s'agit simplement de réfléchir un vecteur le long du vecteur normal des murs.