[MULTI] Motor de colisiones

Bueno, después de mucho tiempo éste es mi primer hilo.
El tema es que estoy haciendo un juego en 3D.
Veamos, tengo una pelota y quiero que rebote en el suelo y en las paredes del escenario de forma más o menos realista(nada de rotaciones sobre si misma). Por ahora lo tengo hecho y más o menos funciona peroa vece s atraviesa sin saber porqué.
Os cuento como lo he hecho, tengo la posición de la pelota y los planos que forman el escenario. En cada paso calculo la posición de la bola si no hubiese chocado on nada(aplicar las leyes de la cinematica). Ahora miro si la pelota estaba en un lado de un plano y en la siguiente posicion en el otro lado y entonces digo que hay colisión. Calculo la posición donde choca y cambio la dirección y sigo calculando con el tiempo restante.

Bueno, no lo he explicado muy bien pero más que nada me gustaría que si alguno de ustedes sabe o se le ocurre un método pues que lo comente.
Pues a ver.. te recomendaría que intentes crear colisiones con bounding box, en este caso que la bounding box sea una esfera ya que el cáculo de una esfera contra un plano es muy rápido.

Aún así te digo que esto puede tener problemas dependiendo del tamaño de la bounding box y la velocidad de la pelota, piensa que si la pelota pasa muy rápido es posible que en ciertas ocasiones no choque ya que entre frame y frame la pelota.

Yo estoy haciendo un juego en 2D y el tema de colisiones de momento lo hemos arreglado con bounding box para el escenario y tenemos pensado un sistema de mapa de bits para las colisiones entre personajes que queremos que sean más precisas.
Ese es el problema que la pelota es muy improbable que colisione sino que casi siempre atraviesa sin mas por eso lo hago no viendo si colisiona sino viendo si atraviesa y reclaculando la posición.
¿Y no has pensado en que la lógica del juego se calcule más de 60 veces por segundo? Si vas sobrado de potencia puedes dividir cada frame por ejemplo en tres movimientos más pequeños de la pelota, y así es menos probable que la pelota atraviese los objetos sin colisionar.
aún así tienes el mismo problema... así que que lo mejor que puedes hacer es calcular o por interpolación con trazado de rayos. Esto sería te quedas con la posición a y luego con la posicion a+1 trazas un rayo entre el origen y el destino y compruebas que no se colisione, en caso de colisionar calcula la posición que corresponda.
Esa forma es más eficiente, sin embargo si el rayo es trazado desde el centro de la esfera no puedes detectar si el borde de la pelota ha chocado con algo.
Más o menos lo que hago es eso de trazado de rayos, por ahora no me importa que choque el borde de la pelota o el centro porque no se aprecia. Gracias por la ayuda.
Chano, lo de calcular la lógica por ahora no tengo limitado el framerate con lo cual a la lógica le paso el tiempo desde el frame anterior y ella se encarga.

Bueno, he estado haciendo algunas comprobaciones y no sabría decir si el problema ocurre cuando l pelota va a gran velocidad o cuando va muy lenta.
Saludos.
Pues tratandose de una bola, lo mejor sería hacer esto:

Supongamos que la bola mide 8 de diametro, tienes la posicion en el espacio, el vector de direccion (vector unidad) y el incremento por velocidad (el valor que multiplicarias por el vector de direccion para obtener la nueva posicion, vamos).

Imagina ahora que ese incremento, tiene un valor de 18.0f. Como el valor del diametro de la bola mide 8, lo que hacemos es pillar el valor del radio (4) y dividir el incremento de velocidad entre el valor de radio, lo que nos dará el numero de pasos de comprobación que deberias utilizar (en este caso, serían 4,pasandolo a valor entero). Luego, solo sería usar un bucle que dosificara el incremento a 4 pasos (que en este caso, serían 4.5f, 9.0f, 13.5f, 18.0f, puesto que el primer paso, 0.0f, se supone que ya lo conocemos y no lo comprobamos) y comprobar si la bola choca desde las nuevas posiciones que te de. Este incremento fino se obtiene de dividir 18.0f entre 4 pasos (4.5f), como es evidente.

Esto tambien te puede servir para hacer predicciones y situar la bola en una posicion que no esté atravesando el plano una vez colisiona, si no en un punto mas alla despues de la colision.
Gracias por la respuesta Hermes.
Este método es bueno porque asegura que la bola chocará en uno de los pasos. Me pondré y cuando lo tenga hecho comentaré como me ha ido.
Saludos.
8 respuestas