• Viernes 29 de Marzo de 2024, 08:35

Autor Tema:  Sobre Aabb/esfera Ambos Moviles  (Leído 1330 veces)

luzop

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
    • http://www.mycgiserver.com/~luisopazo
Sobre Aabb/esfera Ambos Moviles
« en: Miércoles 7 de Julio de 2004, 04:43 »
0
Hola. :hola:

Estoy tratando de implementar detección de colisión entre una esfera movil
y AABB(s) movil(es). Tengo algunas cosas hechas, pero no me resultan del todo.

Ambos objetos se mueven utilizando la relación

aceleración = fuerza - fricción
velocidad += aceleracion * (tiempoUltimoFrame)
posicion += velocidad * (tiempoUltimoFrame)


Mi idea es "predecir" el tiempo de impacto considerendo uno de los objetos como
estático (velocidad relativa). Lo otro que estaba pensando, es simplemente ver si ambos  objetos se intersectan, calcular el nivel de penetración ,separarlos
esta distancia , y aplicar un impulso a uno o ambos objetos.

Álguien ha hecho algo similar ?  :blink:

Gracias de antemano.

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Sobre Aabb/esfera Ambos Moviles
« Respuesta #1 en: Miércoles 7 de Julio de 2004, 13:41 »
0
Hola.

Citar
Lo otro que estaba pensando, es simplemente ver si ambos objetos se intersectan, calcular el nivel de penetración ,separarlos
esta distancia , y aplicar un impulso a uno o ambos objetos

Esto se puede hacer de manera sencilla sabiendo que las bounding boxes están alineadas con los ejes de coordenadas. Digamos que la esfera la tienes representada como un punto que representa el centro y un flotante que representa el radio:
Código: Text
  1. struct punto3d
  2. {
  3.     float x, y, z;
  4. };
  5.  
  6. struct esfera3d
  7. {
  8.     punto3d centro;
  9.     float radio;
  10. };
  11.  

nota: Estoy usando un LHS.

Y cada bounding box está representada por un punto situado en su centro, su anchura/2, su longitud/2 y su altura/2 (recordemos que está alineada con los ejes). Puedes representarla de muchas maneras, pero esta me biene bien para la explicación:
Código: Text
  1. struct bbox
  2. {
  3.     punto3d centro;
  4.     float anchura2;    // Eje X
  5.     float altura2;    // Eje Y
  6.     float longitud2;    // Eje Z
  7. };
  8.  

Imaginemos que tenemos el árbol ya construido, y que cada nodo tiene una operación llamada ComprobarColision. En seudocódigo sería algo así:
Código: Text
  1. bool nodo::ComprobarColision(esfera3D esfera)
  2. {
  3.     if (esfera abarca la bounding box)
  4.         return true;
  5.     if (esfera intersecta la bounding box)
  6.     {
  7.         if (este nodo es una hoja)
  8.         {
  9.             if (colisiona con la geometría englobada)
  10.                 return true;
  11.             else
  12.                 return false;
  13.         }
  14.         else
  15.         {
  16.             for (cada hijo de este nodo)
  17.             {
  18.                 if (hijo->ComprobarColision(esfera))
  19.                     return true;
  20.             }
  21.         }
  22.     }
  23.     return false;
  24. }
  25.  

Según tu pregunta, la parte que quieres saber es la de averiguar si la esfera ha tocado la bounding box, y saber cuánto. Con la representación que te he dado antes es bastante sencillo, y te voy a poner una versión sencilla, la cual detecta más de lo que debería en las esquinas, pero es muy eficiente:
Código: Text
  1. // Retorna la cantidad de unidades que la esfera ha penetrado en la caja
  2. float bbox_esfera(bbox bb, esfera3d esfera)
  3. {
  4.   if (  bb.centro.x + bb.anchura2 > esfera.centro.x - esfera.radio &&  // +X
  5.     bb.centro.x - bb.anchura2 < esfera.centro.x + esfera.radio &&  // -X
  6.     bb.centro.y + bb.altura2 > esfera.centro.y - esfera.radio &&  // +Y
  7.     bb.centro.y - bb.altura2 < esfera.centro.y + esfera.radio &&  // -Y
  8.     bb.centro.z + bb.longitud2 > esfera.centro.z - esfera.radio &&  // +Z
  9.     bb.centro.z - bb.longitud2 < esfera.centro.z + esfera.radio  )  // -Z
  10.   {
  11.     return 0.0f;  // No hay colisión
  12.   }
  13.  
  14.   float xgt = bb.anchura2 - esfera.centro.x + bb.centro.x;
  15.   /*
  16.   Se calcula de igual manera para las otras cinco caras, eliges la menor, o la que
  17.   quieras, y la retornas.
  18.   */
  19. }
  20.  
  21.  

Espero que esto te sirva.

Un saludo.

Ruben3d

luzop

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
    • http://www.mycgiserver.com/~luisopazo
Re: Sobre Aabb/esfera Ambos Moviles
« Respuesta #2 en: Miércoles 7 de Julio de 2004, 20:37 »
0
Gracias.  :)