Estoy escribiendo un juego 2D XNA de arriba hacia abajo. Desde que es mi primera vez, intento escribir sobre física y material de colisión para aprenderlo.
Cada vez que el personaje sprite de mi jugador intenta moverse a una posición donde sus límites se cruzan con el borde de una pared, descubro un ángulo de rebote (ángulo de incidencia = ángulo de reflexión) y hago que el jugador rebote de la pared y evite la colisión. .
Tengo problemas para descubrir cómo lidiar con la situación de mi sprite que se cruza con dos bordes de la pared simultáneamente, por ejemplo, golpea una esquina.
Mi código actualmente me dice que se han cruzado dos bordes de la pared, pero no qué borde golpearía primero y, por lo tanto, qué borde rebotar.
¿Cuál es la prueba matemática para elegir qué borde rebotar? Es fácil de ver al mirarlo, pero estoy luchando por resolver la prueba de matemáticas.
Respuestas:
Si se calcula hasta qué punto en el
Wall
laPlayer Sprite
ha movido, es probable que pueda basar en el delta del coordenadas X e Y de las esquinas que se cruzan. Espero que tenga sentido, no puedo pensar en una mejor manera de decirlo.Entonces, por ejemplo, si miras tu diagrama. Tome el
x
valor de la esquina superior izquierda dePlayer Sprite
(después del movimiento) y reste elx
valor de la esquina inferior derecha deWall
. Haga lo mismo para losy
valores y luego vea cuál es más grande. La clave es que si uno es más grande que el otro,Player Sprite
probablemente se crucen en ese lado.Aquí hay un ejemplo de imagen (esta es una subsección de su imagen con mis propias líneas agregadas):
Ahora, ves aquí que la línea azul es más grande que la línea verde. En este caso, la línea azul también está del lado del
Player Sprite
que se esperaría que rebote.Si los dos valores son iguales, golpean justo en la esquina.
Ahora, hay un pequeño problema al hacerlo de esta manera. Si
Player Sprite
viaja muy rápido o la colisión está muy cerca de la esquina, es posible quePlayer Sprite
avance más en laWall
dirección equivocada. En ese caso, probablemente tendrá que verificar la velocidad del objeto en movimiento. (Ver la respuesta de Nathan Reed ).Nota: Creo que estoy tratando esencialmente de describir la detección de colisión SAT que mencionó @Blau, pero he pasado mucho tiempo escribiendo esto, así que lo publicaré de todos modos. Espero que te ayude un poco.
fuente
El desplazamiento mínimo no siempre da la respuesta correcta para qué borde se golpeó primero. Considere este caso:
Esto sucede cuando la velocidad es lo suficientemente alta como para que el bloque se mueva bastante lejos durante un cuadro. Para detectar correctamente qué borde se golpeó primero, deberá configurar una ecuación lineal para resolver el tiempo de colisión con cada borde. En este caso descrito en el diagrama del OP, las ecuaciones relevantes son:
(Esto supone un sistema de coordenadas X-derecha, Y-arriba). En general, tendrías que usar los signos de los componentes X e Y de player.velocity para determinar qué par de bordes necesitan ser probados. De todos modos, una vez que haya calculado los tiempos de colisión, el primero de los dos es la colisión que debe manejar.
fuente
Necesita detección de colisión SAT
Básicamente, debe buscar el vector de desplazamiento mínimo que se resta a uno de los objetos para que no se crucen.
En su imagen, el desplazamiento mínimo es el segmento naranja.
fuente
Respondí una pregunta similar aquí
Es posible que desee considerar verificar posiciones anteriores
Por ejemplo: si su lado izquierdo estaba previamente a la derecha de su lado derecho y está colisionando, entonces ha ocurrido una colisión con la mano derecha.
Si hace esto, solo resuelva las colisiones del eje y, compruebe si está colisionando con algo, luego resuelva las colisiones del eje x.
fuente