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.

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.


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;
}

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.