Bola vs detección de colisión de pendiente de 45 grados

8

Tengo un juego simple en el que el jugador mueve una pelota. La pelota rebota en las paredes. En este momento tengo implementadas paredes cuadradas (■): uso colisiones simples de cuadros delimitadores para verificar si el jugador se moverá hacia una pared cuando actualice su velocidad x o y y si es así, multiplico esa velocidad con -1 para que rebote .

Sin embargo, también quiero implementar piezas triangulares (◢◣◤◥). Para recuperarse, creo que uno simplemente puede usar:

   newxspeed = -1*yspeed;
   newyspeed = -1*xspeed;

Sin embargo, tengo problemas con la detección de colisión: ¿Cuándo golpea el jugador la diagonal?

Qqwy
fuente
2
Recomiendo encarecidamente el tutorial N ( parte 1 , parte 2 ) sobre este tema.
Chris Burt-Brown
Muchas gracias. Ese tutorial realmente me ayudó a comprender finalmente cómo resolver esto.
Qqwy
En realidad, es muy difícil para mí marcar una de las respuestas como "la" solución, ya que todas me ayudaron a comprender el problema, pero ninguna de ellas lo resolvió por completo. ¿Qué tengo que hacer?
Qqwy

Respuestas:

8

En primer lugar, para calcular la detección de colisión entre una esfera (círculo en 2D) y una línea, debe calcular el vector perpendicular entre el centro de la bola en movimiento y la línea, para calcular esta distancia debe hacer lo siguiente:

ingrese la descripción de la imagen aquí

Entonces, para calcular d en la figura anterior, necesitamos hacer algunos pasos.

  1. Suponga que su línea está utilizando la ecuación paramétrica P (t) = S + t V tenga en cuenta que V es la dirección de la línea que se puede obtener restando (P2 - P1).
  2. De Pitágoras:

d ^ 2 = len ( Q - S ) ^ 2 - len (proj ( Q - S )) ^ 2

Luego expande la ecuación para obtener lo siguiente, parece un poco complicado, pero en realidad no lo es.

d = sqrt (len ( Q - S ) ^ 2 - len (( Q - S ) punto V ) ^ 2 / V ^ 2)

Donde Q es el centro del círculo y S es cualquier punto de la línea. Una vez que la distancia es menor que el radio del círculo / esfera, debe activar la respuesta de colisión que se explica en el siguiente punto.

Es incorrecto voltear siempre el componente x o y para hacer rebotar la pelota, lo que debe hacer es reflejar el vector de velocidad, para hacerlo debe calcular el vector Normal de la superficie y usar ese normal para calcular la reflexión vector usando la siguiente ecuación

R = 2 * ( V punto N ) * N - V

donde R es el vector de reflexión, N es la normal de la superficie y V es el vector de velocidad.

En el caso de 45 grados, su superficie normal será N = (1,1,0) con signo variable dependiendo de en qué dirección se enfrenta la normal (posición o negativo).

concepto3d
fuente
Usas una gran ecuación. Sin embargo, es muy difícil de seguir para alguien que es nuevo en los vectores. Sería útil si divide su ecuación en pasos más pequeños.
Qqwy
Por cierto, ¿es N un vector bidimensional o tridimensional? ¿De dónde viene el tercer valor (0)?
Qqwy
Utilicé vectores 3D porque supuse que estaba utilizando una API 3D (y podría estar equivocado) en caso de que fuera cierto, necesita establecer el tercer componente como 0, pero de todos modos las ecuaciones deberían funcionar para 2D y 3D (y probablemente más alto) dimensiones pero eso realmente no importa). con respecto a las ecuaciones puedo explicar más pero necesito algo de tiempo para editar la respuesta.
concept3d
1
Edité la respuesta. Espero que tenga más sentido ahora. Por cierto, stackexchange puede proporcionar una manera conveniente de escribir fórmulas matemáticas porque es propenso al dolor y al error en este momento.
concept3d
6

Desea medir la distancia entre el centro de su bola y la pared, entonces:

ingrese la descripción de la imagen aquí

resolver el sistema que ves en la imagen te dará las coordenadas del punto d.

Entonces, si la distancia entre el punto d y c es menor o igual al radio de la bola r, hay una colisión entre la bola y la pared

Marco
fuente
5

Las bolas son en realidad objetos bastante simples para la detección de colisiones. Chocan con el terreno cuando la distancia entre el centro de la pelota y el borde del terreno es menor que el radio de la pelota. La posición del centro de la pelota debe ser trivial para obtener. Encontrar el punto de terreno más cercano es generalmente más complicado y la mejor manera de hacerlo depende de cómo esté representado el terreno.

Su algoritmo para calcular la nueva velocidad después de rebotar en una pendiente diagonal es incorrecto. Invertir las coordenadas X e Y hará que la pelota retroceda en la misma dirección desde la que se acercó a la pendiente. Esto está bien si la pelota llega al terreno desde un ángulo recto, pero falla en otros ángulos. Querrá negar solo el componente normal a la superficie, por ejemplo, cuando rebota en el techo, niega y, no x.

Thomas Thomas
fuente
Aunque esta respuesta no aborda directamente el problema, +1 por informarme sobre la forma en que se debe hacer la resolución de colisión en este caso.
Qqwy