Determinar el ángulo resultante de la colisión de la pared

14

Entonces tengo un objeto que se mueve en una dirección hacia una pared horizontal o vertical fija. ¿Cómo calculo el ángulo en el que el objeto debería rebotar? El objeto puede acercarse a la pared en un ángulo arbitrario.

SECADO
fuente

Respuestas:

18

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.

John Calsbeek
fuente
Gran explicación ¡Funcionó muy bien para mí! ¡Gracias!
DRIFTy
13

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:

ingrese la descripción de la imagen aquí

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;
}
David Gouveia
fuente
Lo siento, es un juego en 2D. Me gustaría mantenerlo en función del ángulo porque, como dijiste, me gustaría poder usar cualquier pared. ¡Gracias!
DRIFTy
Lo edité para cubrir 2D también. En realidad, es lo mismo, solo con vectores 2D, mismas operaciones y fórmulas
Gustavo Maciel
Un muro en un juego 2D puede estar en ángulo, por lo que la afirmación if it's a 2D game and your walls are guaranteed to be horizontal or verticalno 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.
XenoRo