Ayuda con las matemáticas !!!

Iniciado por BlackM4ster, 10 Abril 2013, 20:36 PM

0 Miembros y 2 Visitantes están viendo este tema.

leosansan

#10
Cita de: Black Master en 23 Abril 2013, 15:14 PM
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.

BlackM4ster

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?
- Pásate por mi web -
https://codeisc.com

Kilowatt

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.

BlackM4ster

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
- Pásate por mi web -
https://codeisc.com

Kilowatt

#14
Seria interesante ver como lo has hecho, o que lo explicaras por encima si estas de acuerdo. ¿A que te refieres con avanzar hacia ellas?

BlackM4ster

#15
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.

El codigo de detección es algo así:
Código (cpp) [Seleccionar]
bool Colision_Pj_Objeto(int IdObjeto){

pj.bounding.Crear(pj.bounding.Tipo,0);
objeto[IdObjeto].bounding.Crear(objeto[IdObjeto].bounding.Tipo,IdObjeto);

for(int i=1;i<9;i++){
if(Colision_Punto_ABCD(pj.bounding.vx[i],pj.bounding.vy[i],pj.bounding.vz[i],IdObjeto) == true) return 1;
}

return 0;
}

bool Colision_Punto_ABCD(float p_x,float p_y,float p_z,int IdObjeto){

//if(objeto[IdObjeto].usado == true){

   if(p_x >= objeto[IdObjeto].bounding.vx[1] && p_x <= objeto[IdObjeto].bounding.vx[3] &&
   p_y >= objeto[IdObjeto].bounding.vy[2] && p_y <= objeto[IdObjeto].bounding.vy[1] &&
   p_z >= objeto[IdObjeto].bounding.vz[5] && p_z <= objeto[IdObjeto].bounding.vz[1])
   {
       return true;
}
return false;
}
- Pásate por mi web -
https://codeisc.com

BlackM4ster

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)


[youtube=640,360]http://www.youtube.com/watch?v=PdWymO3883Y[/youtube]
- Pásate por mi web -
https://codeisc.com

amchacon

Cita de: Black Master en 26 Abril 2013, 14:53 PM
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.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

BlackM4ster

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é  ;-)
- Pásate por mi web -
https://codeisc.com

Kilowatt

#19
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.