Estoy tratando de crear un juego 3D simple y necesito restringir al jugador dentro de los límites del mundo del juego. Cuando el jugador llega a los lados del mundo, quiero que la nave del jugador rebote ligeramente.
En efecto, estoy tratando de atrapar al jugador dentro de una caja y evitar que escapen por los lados ...
He logrado definir los límites del mundo del juego como una colección de aviones, con normales y distancias desde el origen. El jugador tiene una esfera esférica delimitadora y, siguiendo este sitio web, http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php , he logrado detectar colisiones.
Ahora no puedo entender qué hacer cuando se detecta una colisión. Lo mejor que puedo manejar es que el jugador se quede atascado en el avión, lo atraviese o salte repetidamente a un ritmo realmente rápido.
El sentido común me dice que necesito calcular el ángulo reflejado del avión, usando su normalidad y aplicarlo a la velocidad del jugador, sin embargo, creo que primero necesito ver si el jugador ha pasado por el avión, que es el bit que no puedo rutina de ejercicio.
fuente
distance = speed * time
generalmente con una pequeña distancia adicional para evitar errores) y luego actualizar su velocidad a cuál es el resultado de la colisión.F = ma, o a = F / m. Calcule el punto de colisión entre la esfera y el plano. Este suele ser el centro de Esfera - radio normal *. Si desea más precisión, calcule cuánto ha penetrado la esfera en el plano y ajuste su cálculo. Esto es en gran medida opcional, por supuesto, a menos que desee una física realmente precisa. Ahora calcule la velocidad relativa a lo largo de la normal. Para un plano estático, esto es: Vball Dot N. Luego multiplique VballDotN por -1 y multiplique por masa. En física en esta etapa también multiplicaría esto por el coeficiente de restitución (factor de rebote). Multiplica este escalar por N y tendrás tu fuerza.
Al ajustar Vball, divida la fuerza por la masa nuevamente y tendrá la aceleración final, así que simplemente agregue esto a la velocidad y tendrá su velocidad final posterior a la colisión.
Este método es preciso para las fórmulas de respuesta de colisión. Si quieres aún más precisión, deberás tener en cuenta la fricción, lo que hará que la pelota gire, pero no sé si quieres eso en tu juego. En caso de que lo haga, así es como calcula la fuerza tangencial:
Asegúrese de calcular Ft antes de aplicar cualquier efecto lineal, o la fricción no será precisa.
fuente
vec3 F = -CollisionNormal * (1.0f+Ball.getRestitution())*vDotN;
:?Sugeriría calcular primero la distancia desde el avión; y luego cuando la distancia <= al radio lleva a cabo la reacción de colisión.
Luego puede modificar esto para calcular la distancia y si la distancia es menor que el radio (lo que significa que el objeto se superpone) cambie la posición de las bolas y luego realice la reacción de colisión.
fuente