• Viernes 29 de Marzo de 2024, 07:34

Autor Tema:  Colisiones  (Leído 4159 veces)

rho00

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Colisiones
« en: Lunes 22 de Mayo de 2006, 11:58 »
0
SOy un neófito en esto de la programación de videojuegos al igual que en la informática gráfica en general.

A ver, os cuento mi problema:
Para una práctica de la universidad estamos haciendo un juego de tanques muy sencillo en red. La vista sería en primera persona y siempre sobre el mismo plano, es decir, sin cambios de altura.
Las paredes las trataremos, en una primera aproximación, como rectángulos, y los tanques, para tratar el tema de las colisones lo "envolveremos" en cubos para hacerlo más sencillo.
Queremos conseguir un algoritmo sencillo que simplemente nos diga si un tanque choca con una pared, o con otro tanque, o con una bala o esas cosas, ya entendeis.
Entendemos que lo primero que necesitamos saber es simplemente si dos segmentos se cruzan.
Obligatoriamente debemos hacerlo en OpenGL.
Teneis alguna solución rápida?

muchas gracias

killrazor

  • Miembro activo
  • **
  • Mensajes: 44
    • Ver Perfil
Re: Colisiones
« Respuesta #1 en: Viernes 26 de Mayo de 2006, 15:27 »
0
Yo hice una cosa parecida. Te paso el algoritmo que use:

Código: Text
  1.  
  2. ///detectar si dos segmentos se cruzan.
  3. /// Dados dos segmentos PQ UW podemos detectar si se cruzan. El proceso que uso
  4. /// es: para cada recta formada por dos puntos, detecto la interseccion de las rectas
  5. /// Si intersectan, checkeo que el punto de interseccion pertencece a los segmentos especificados
  6. bool detectarCruce(stPosicion P, stPosicion Q, stPosicion U, stPosicion W){
  7.   float m1, m2;
  8.   float k1, k2;
  9.   float Xc, Yc;
  10.   //////////////////////////////////////////////////////////////////////////
  11.   // para PQ, buscar la pendiente
  12.   // evitar divisiones por cero
  13.   if ((Q.x - P.x) != 0){
  14.     // como la ecuacion de la recta es y = mx*k, necesito los valores de m y k
  15.     m1 = (Q.y - P.y )/(Q.x - P.x);
  16.     k1 = P.y - m1*P.x;
  17.  
  18.   }else{
  19.     m1 = FLT_MAX;
  20.     if (P.x > 0)
  21.       k1 = -FLT_MAX;
  22.     else
  23.       k1 = FLT_MAX;
  24.   }
  25.  
  26.   //////////////////////////////////////////////////////////////////////////
  27.   // para UW, buscar la pendiente
  28.   // evitar divisiones por cero
  29.   if ((W.x - U.x) != 0){
  30.     // como la ecuacion de la recta es y = mx*k, necesito los valores de m y k
  31.     m2 = (W.y - U.y)/(W.x - U.x);
  32.     k2 = U.y - m2*U.x;
  33.  
  34.   }else{
  35.     m2 = FLT_MAX;
  36.     if (U.x > 0)
  37.       k2 = -FLT_MAX;
  38.     else
  39.       k2 = FLT_MAX;
  40.   }
  41.  
  42.   // si m1 y m2 son iguales (si las pendientes son iguales), entonces las
  43.   // rectas son paralelas. Como el bounding box es algo mas grande que el objeto,
  44.   // para evitar calculos, no considero el hecho de calcular si dos rectas paralelas
  45.   // son o no la misma
  46.   if (m1 == m2){
  47.       return false;
  48.   }
  49.  
  50.   // Con las variables previamente aisladas (por eficiencia), hallo el punto de cruce
  51.   // de las rectas que contienen el segmento
  52.   Xc = (k2 - k1)/(m1 - m2);
  53.   Yc = (k2*m1 - k1*m2)/(m1 - m2);
  54.   /*
  55.   cout << "Punto 1: "<<P.x <<","<<P.y<<endl;
  56.   cout << "Punto 2: "<<Q.x <<","<<Q.y<<endl;
  57.   cout << "Punto 3: "<<U.x <<","<<U.y<<endl;
  58.   cout << "Punto 4: "<<W.x <<","<<W.y<<endl;
  59.   cout << "el punto de cruce es "<<Xc<<","<<Yc<<endl;
  60.   */
  61.   // comprobar si los puntos de cruce estan dentro de los segmentos
  62.   if (!(_valorEntre(P.x,Q.x,Xc))){
  63.     return false;
  64.   }
  65.   if (!(_valorEntre(P.y,Q.y,Yc))){
  66.     return false;
  67.   }
  68.   if (!(_valorEntre(U.x,W.x,Xc))){
  69.     return false;
  70.   }
  71.   if (!(_valorEntre(U.y,W.y,Yc))){
  72.     return false;
  73.   }
  74.   //int a = 3;
  75.   //printf("assas");
  76.   //cout << "Detectado clipping" << endl;
  77.   return true;
  78. }
  79.  
  80.  

Recuerda que stPosicion es una estruct 3D, con x,y,z. _valorEntre es una funcion asi:
 _valorEntre(a,b,c) devuelve true si c esta entre a y b (con comprobaciones de > <)

Esto tenia algunos problemas asocioados por problemas en el calculo de intersecciones en 2D. Si la direccion del segmento era paralela al eje Y, la pendiente es infinita y da problemas, y si es paralela a X sera 0. Asi que tendras que usar ciertos truquitos y aproximaciones.

PENTEX

  • Miembro activo
  • **
  • Mensajes: 89
    • Ver Perfil
    • http://black-byte.com/
Re: Colisiones
« Respuesta #2 en: Miércoles 7 de Junio de 2006, 03:42 »
0
Alguna vez tambien trabaje algo lo de colisiones,  proximamente colocare en el blog un tutorial de algoritmos para bounding.

Camilo
Rune GameDev