Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Duda sobre el teorema de los 15 separating axis

Iniciado por habier, 07 de Mayo de 2007, 06:21:35 PM

« anterior - próximo »

habier

hola,

soy nuevo por aquí (así como en el mundillo del 3d) así que aprovecho este post para presentarme también.

me gustaría hacer una pregunta sobre una pieza de código que he encontrado que implementa un test de colisión entre dos oriented bounding boxes. El código lo saqué de aquí:

http://www.gamasutra.com/features/19991018/Gomez_5.htm

El autor es Miguel Gómez. Me da la impresión que es un tutorial y trozo de código bastante conocido, por ejemplo un motor (opcode 1.2) lo usa, y lo he visto comentado en distintos foros.

El problema que tengo es llamando a la función OBBOverlap. Varias veces funciona y me devuelve correctamente si colisiona o no, pero cuando las dos boxes están en algunos ángulos y posiciones entre ellas lo que me devuelve es erroneo. Se ve claramente que no colisionan, pero me devuelven que sí.

Mi pregunta es si alguien por aquí ha usado esta función y en este caso de que manera le pasa los parámetros. A mi me parecía que estaba haciendo bien, y intentando seguir el código de la función me lo sigue pareciendo, pero en algunos casos me dice que colisionan cuando no es así.

La función tiene este prototipo:

//check if two oriented bounding boxes overlap
const bool OBBOverlap
(
//A
VECTOR& a, //extents
VECTOR& Pa, //position
VECTOR* A, //orthonormal basis
//B
VECTOR& b, //extents
VECTOR& Pb, //position
VECTOR* B //orthonormal basis
)

Teniendo las caras mas alta y mas baja de la caja así:

  v7 - v6
 /       /
v4 - v5

v3 - v2
/      /
v0 - v1

El extent (a) lo calculo así:

 Extents.x = fabs((v5->x - v3->x)/2);
 Extents.y = fabs((v5->y - v3->y)/2);
 Extents.z = fabs((v5->z - v3->z)/2);

La posición (Pa):

 Position.x = ((v5->x - v3->x)/2) + v3->x;
 Position.y = ((v5->y - v3->y)/2) + v3->y;
 Position.z = ((v5->z - v3->z)/2) + v3->z;

La base ortonormal (A) así:

 OrthoBasis[0].x = v2->x - v3->x;
 OrthoBasis[0].y = v2->y - v3->y;
 OrthoBasis[0].z = v2->z - v3->z;

 normalize(OrthoBasis[0]);

 OrthoBasis[1].x = v7->x - v3->x;
 OrthoBasis[1].y = v7->y - v3->y;
 OrthoBasis[1].z = v7->z - v3->z;
 
 normalize(OrthoBasis[1]);

 OrthoBasis[2].x = v0->x - v3->x;
 OrthoBasis[2].y = v0->y - v3->y;
 OrthoBasis[2].z = v0->z - v3->z;

 normalize(OrthoBasis[2]);

Veis algo mal?

Si no habeis usado esta, teneis alguna otra implementación de este test de colisiones?

Un saludo y gracias.

habier

hola de nuevo,

pongo este post para cerrar lo que preguntaba en el anterior. Ya encontre el problema asi que os lo comento, mas que nada por si alguien necesita este mismo codigo que he usado yo quizas le venga bien.

A mi me estaba fallando porque estaba calculando mal las extents. Estaba restando el vertice 5 del cubo menos el vertice 3. Pero el problemas es que lo hacia asi incluso aunque el cubo no estuviera alineado con los ejes. Entonces me salia mal las extents.

El codigo funciona perfecto, por si alguien mas lo esta usando o lo piensa usar.

Un saludo.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.