Hola, estoy programando un juego. Lo que os quiero preguntar es si sabeis como hacer para que un personaje (envuelto en un cilindro) al colisionar siga la direccion de la pared. Hay que tener en cuenta que puede colisionar con varias paredes a la vez y que las paredes pueden tener cualquier rotacion. El juego es en 3D, la deteccion de la colision con las paredes ya la tengo hecha. A la hora de calcular la direccion que debe seguir se puede simplificar a 2D, mirando desde arriba. Os pongo una imagen de ejemplo:
(http://www.subir-imagenes.com/imagenes/th_486b1d8d35.jpg) (http://www.subir-imagenes.com/ver_imagen.php?img=35656)
d es la direccion que lleva el personaje y d' la direccion que en realidad seguirá.
Llevo pensándolo unos cuantos días pero no se me ocurre como hacerlo, muchas gracias por todo. Hasta luego.
Es un metodo recursivo.
Tienes que calcular la proyeccion en el sentido de la pared de la velocidad y luego recursar.
La proyeccion se obtiene de multiplicar (en cruz) la normal a la pared con la velocidad. Luego recursar con cuantas paredes colisiones.
Saludos.
Hola, muchas gracias por contestar. No he llegado a entenderlo del todo. Según dices, proyectaria d sobre una de las paredes y obtendria un vector. Ese vector lo proyectaria sobre otra de las paredes y asi sucesivamente hasta recorrer todas las pardes, no?. Supongo que lo he entendido mal, porque de esta forma el orden de recorrido de las paredes influye en la direccion final obtenida. Si me lo puedes explicar con un poco mas de detalle te estaría muy agradecido. Hasta luego y muchas gracias.
En verdad que te conteste muy mal ... pido disculpas.
Si, la idea es parecida:
Paso 1: te mueves linealmente mientras no haya colision
Paso 2: Si te desplazas a trabes de todo el tiempo sales.
Si los delta tiempo son pequeños entonces el orden de las paredes no importara, pero si no tendras que ordenar segun cual colisionara primero.
Paso 3: Tomas esta primera pared y la velocidad, la nueva velocidad sera la proyeccion de la velocidad en la pared (puedes agregarle una friccion si te apetece).
Paso 4: ir a 1
Te dije mal como se calculaba la proyeccion:
Proyeccion = Velocidad + Normal (producto escalar) ( Normal (producto punto) Velocidad );
Espero haya quedado mas claro.
Saludos!
Hola de nuevo, ahora si me ha quedado más claro. Me pondré a hacerlo y ya os cuento que tal. Muchas gracias. Hasta luego.
También puedes echarle un vistazo al tutorial "Improved Collision Detection & Response (http://peroxide.dk/tuts_c.shtml)" de Kasper Fauerby. Utiliza elipsoides como primitiva de colisión, pero a la hora de calcular el nuevo vector velocidad (calcular el sliding plane) al colisionar es lo mismo.
Saludos.
Muy bueno ese link, ya me lo habia olvidado.
Tambien esta este que es bastante simplificado:
http://www.gamasutra.com/features/19991018/Gomez_1.htm
Hay bastante sobre deteccion de colisiones y mas importante su interpretación.
Saludos!
Gracias a los dos. Ya casi lo tengo funcionando, aunque para algunos casos me da problemas. A ver si lo soluciono. Cuando lo tenga si a alguien le interesa dejo el código por aquí. Un saludo y hasta luego.