Pues yo he conseguido sacar los ocho vertices de ambos bounding boxes y sería con eso
Si las cajas están perpendiculares al suelo, vamos apoyadas o paralelas al suelo, bastaría "jugar" con los cuatro vértices del suelo de cada caja y, aún así, hay unos cuantitos casos. ¿Seguro que el programa no trae incorporada la opción collision?.
REEDITO:
Cada línea rosa es una posible colisión, en total ocho y como hay cuatro lados treinta y dos en total y usando distancia de un punto a una recta inclusive, suponiendo que la caja móvil se pueda acercar a la fija por delante, por detrás, por la derecha, por la izquierda o por cada esquina.Y eso sin girar el cubo móvil respecto al tercer eje. Creo que debe haber un método más simple que el puramente matemático. Pero si lo consideras "razonable" me pongo a ello
Saluditos y ánimos! ....
REEDITO: Ya he conseguido reducir los 16 casos de colisiones"laterales" a uno sólo usando las coordenadas de los centros.
« Última modificación: 23 Abril 2013, 16:38 pm por leosansan »
Gracias No, no hay ningún método "collision" para hacerlo por que básicamente lo estoy programando yo al 100% (de librería externa sólo el OpenGL) He conseguido detectar la colisión, determinar si choca de frente, desde arriba o desde abajo. En los casos de Arriba y abajo, funciona bien (arriba, pues gravedad = 0; y desde abajo, Aceleracion = -Aceleración). El problema viene cuando tengo que programar que, determine con qué cara choca, la dirección, y la dirección de desplazamiento. Alguna forma sencillita de hacerlo?
Bueno, yo he estado pensando como detectar las colisiones, y personalmente si las cajas son rectangulares, de lados sin ninguna relacion entre si, y que pueden medir cualquier valor distinto de 0, creo que no se puede hacer de una manera sencilla. Seria mas o menos abordable si las cajas no giraran, pero ademas pueden incidir una sobre otra en cualquier grado de inclinacion.
Ademas tengo una pregunta ¿Las cajas pueden atravesarse entre si? Si no fuera asi (seria como simular solidos) se cumpliria una propiedad interesante, y que da pie a simplificar el algoritmo: "En todos los choques, al menos un vertice de una de las cajas de encuentra sobre la superficie de la otra". Y podria empezar a trabajar por ahi, comprobando la pertenencia de los vertices de la caja 0 a las rectas que delimitan la 1, y que ademas lo hagan en el intervalo de valores en que los puntos de dicha recta forman el lado de la caja 1. Con un calculo reciproco de este estilo, para todos los vertices y para todas las rectas, habria una deteccion 100% segura de la colision o no colision, y ademas se sabria al menos un punto de contacto, que quizas te sirva para, posteriormente, jugar con las fisicas como comentas.
En principio con solo la distancia entre los centros no se puede detectar con absoluta certeza una colision de cajas rectangulares de forma arbitraria, y que pueden no estar alineadas con los ejes de ninguna forma, pues son capaces de girar sobre su centro incrementos de angulo no acotados.
jaja gracias por tu respuesta, ya he conseguido detectar las colisiones perfectamente, ahora me falta la parte dificil, determinar si puedo avanzar o no hacia ellas
Pues, con lo de moverme hacia ellas, me refiero a que, cuando avanzas hacia un objeto, choques y no lo puedas atravesar, pero teniendo un vector de dirección especifico para cuando estás colisionando y deslizarte por la cara.
Saco una foto, estoy haciendo un game engine (mi primer juego, justo acababa de aprender c++ de forma decente cuando me metí con OpenGL). Os cuento el problema desde el principio: Tengo 3 tipos de detectores de colisiones programados: - Bounding sphere (para cosas que no requieren precision absoluta como coger monedas) - Axis aligned Bounding Box (Los bloques de terreno "B") - Objet aligned bounding box (El personaje "A") Tengo programada una simulación de la gravedad que hace que cada frame (el juego está capado a 30fps) baje un poco a no ser que haya colision. Detectar la colision entre los dos bloques es fácil, pero no sé luego como saber si estoy chocando de frente, de costado... y a partir de eso evitar ciertos movimientos como caminar hacia el objeto (deslizarse por el objeto) Dejo un video del juego en cuestión (Minuto 2:15, donde el cursor es rojo, es el que digo)
Pues, con lo de moverme hacia ellas, me refiero a que, cuando avanzas hacia un objeto, choques y no lo puedas atravesar, pero teniendo un vector de dirección especifico para cuando estás colisionando y deslizarte por la cara.
Por decir algo, no puedes hacer que su velocidad sea cero?.
O activar algun booleano para indicar que deje de mover.
En línea
Por favor, no me manden MP con dudas. Usen el foro, gracias.
Si, es lo que estoy intentando: que cuando choques con una cara, la dirección hacia esa cara se bloquee y no se desplace hacia ese eje. He conseguido hacerlo bastante decente, ya os contaré
Como dicen arriba, podrias simplemente pararlo, o si sabes un punto que hace colision me imagino que sabras la cara del otro objeto con la que estas colisionando, y si conoces la direccion del movimiento y la velocidad, podrias hacer que en el momento de la colision solo permaneciera la componente de la velocidad tangencial a dicha superficie, si la hubiera. Asi la caja cuando chocara se seguiria moviendo pero nunca hacia dentro de la otra, sino pegado a ella, deslizando.
Simplificandolo para un objeto movil y otro inmovil, se puede hacer de una manera sencilla, pero me tienes que decir si puedes saber sobre que cara del objeto inmovil chocas y si conoces la velocidad y la direccion del objeto movil en todo momento. Si conoces esas tres cosas se hace facil.
« Última modificación: 26 Abril 2013, 17:20 pm por Kilowatt »