Respuestas:
Si conoce el vector normal de la pared y tiene una dirección entrante para el objeto, entonces lo que desea es la reflexión de un vector a través de un plano .
Si n es un vector normalizado y v es la dirección entrante , entonces lo que desea es - (2 ( n · v ) n - v ). El signo menos explica el hecho de que la fórmula de reflexión en realidad no invierte la dirección, como lo haría la velocidad de un objeto.
Esta respuesta se da en términos de matemática vectorial, no un ángulo, porque eso generalmente es preferible si no tiene una razón explícita para usar un ángulo. Tenga en cuenta que si debe hablar sobre ángulos, el ángulo de reflexión es igual al ángulo de incidencia. Si el ángulo se mide desde lo normal, el ángulo de salida es la negación del ángulo de entrada; Si el ángulo se mide desde la pared, entonces es el complemento del ángulo entrante.
No especificaste si era un juego en 2D o 3D. Pero si se trata de un juego en 2D y se garantiza que sus paredes serán horizontales o verticales y solo desea hacer rebotar el objeto sobre ellas, hay una manera mucho más fácil que tener que lidiar con los reflejos.
Simplemente niegue el componente X de la velocidad del objeto cuando golpea una pared vertical, o el componente Y de la velocidad del objeto cuando golpea una pared horizontal. Ejemplo:
if( /* hit vertical wall */ )
{
object.velocity.x *= -1;
}
if( /* hit horizontal wall */ )
{
object.velocity.y *= -1;
}
Pero si realmente te importa conocer el ángulo, entonces, en términos generales, el ángulo de reflexión es el mismo que el ángulo de incidencia. Este ángulo se mide en relación con la pared normal. Aquí hay una imagen que debería dejarlo claro:
En caso de que necesite manejar esto para paredes arbitrarias, deberá investigar cómo reflejar un vector. Realmente es solo una pequeña fórmula que toma el vector normal y el de incidencia de la pared, y devuelve el vector reflejado por usted. Aquí está la fórmula que usa XNA:
public static Vector3 Reflect(Vector3 vector, Vector3 normal)
{
return vector - 2 * Vector3.Dot(vector, normal) * normal;
}
Y para 2D simplemente podrías hacer:
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
no es correcta. La segunda parte de la respuesta aborda la implementación correcta. En mi humilde opinión, el orden de las partes debe invertirse, presentando primero la solución general y en enfase, mientras que la solución en ángulo recto se presenta como una simplificación para el caso excepcional.
Esto se trata de reflejar un vector a lo largo del vector normal de las paredes.