Foros - Stratos

Proyectos => Jad Engine => Mensaje iniciado por: Haddd en 22 de Diciembre de 2005, 12:00:13 PM

Título: Bounding Box Por Matrix
Publicado por: Haddd en 22 de Diciembre de 2005, 12:00:13 PM
 ¿como resolveis la multiplicacion de un BB por una matriz? Nosotros multiplicamos cada punto por la matriz y luego volvemos a comprobar esos puntos en el BB para crear una nuevo...

¿como lo haceis vosotros?  
Título: Bounding Box Por Matrix
Publicado por: zupervaca en 22 de Diciembre de 2005, 12:05:39 PM
 Yo también transformo los puntos de un bounding-box origen que no cambia nunca (tiene las dimensiones de la malla) y con ellos voy creando un bounding-box, pero tiene que haber alguna otra forma ya que si pensamos en jerarquías de objetos la cosa se complica ya que cada vez que transformamos un hijo tendríamos que reconstruir todo la jerarquía.
Título: Bounding Box Por Matrix
Publicado por: fiero en 22 de Diciembre de 2005, 01:55:14 PM
 Un BB puede definirse por un vector que va desde el centro del BB hasta una de las esquinas. ¿Se podría transformar ese vector y luego simplemente volver a calcular las demás esquinas sumando y restando? Es un suponer.

Bueno, eso sería un AABB.

un saludo
Título: Bounding Box Por Matrix
Publicado por: Haddd en 22 de Diciembre de 2005, 02:52:36 PM
 No basta un vector, necesitas 2 :lol:  
Título: Bounding Box Por Matrix
Publicado por: Topper en 22 de Diciembre de 2005, 02:58:00 PM
 
CitarNo basta un vector, necesitas 2

Cierto, siempre y cuando el BBOX no sea cuadrado, y eso es algo habitual...
Título: Bounding Box Por Matrix
Publicado por: Warchief en 22 de Diciembre de 2005, 03:58:04 PM
 Uhm, ¿por qué si no es cuadrado necesita 2? Estamos hablando de un vector3d, que puede dar una caja rectángular siempre que X != Z.
La verdad es que se puede ver como las coordenadas ancho, alto y largo de una caja (x,y,z). Yo no veo problema.


Otra cosa es que no sea simétrica respecto de lo que vosotros conideráis el centro (el diamante o lo que sea); en ese caso, si podrían ser necesarios dos.
Título: Bounding Box Por Matrix
Publicado por: fiero en 22 de Diciembre de 2005, 05:08:48 PM
Cita de: "Haddd"No basta un vector, necesitas 2 :lol:
Bueno, sí. Yo para las AABB utilizo 2 vectores, uno da las dimensiones y el otro el desplazamiento de la caja. Es que me hago viejo....  :blink:  
Título: Bounding Box Por Matrix
Publicado por: zupervaca en 22 de Diciembre de 2005, 05:32:16 PM
 ¿Para los BoundingBox todos usáis dos puntos espaciales que definen el mínimo y máximo o usáis otro sistema?

Yo para calcular un BoundingBox transformado tengo que calcular a partir de esos dos puntos los ocho totales, una vez hecho esto los transformo y los agrego comprobando si deben expandir o no el mínimo y máximo. No se si es la mejor forma, pero es que no he encontrado ningún tutorial o código respecto a esto y tuve que inventarme esto.
Título: Bounding Box Por Matrix
Publicado por: Haddd en 22 de Diciembre de 2005, 09:36:18 PM
 Lo mismito hago yo  :P

 /// <summary>
       /// Apply the matrix to the 8 corners of the boundingbox and gets the new Boundings
 /// </summary>
       /// <param name="matrix">matrix to transform</param>
 public void ApplyMatrix(Matrix matrix)
 {
  // Si hay rotación tenemos que recalcular todas las esquinas
  // tenemos que ponernos en el peor caso posible!!
  float xi, yi, zi, xf, yf, zf;

  xi = min.X;
  yi = min.Y;
  zi = min.Z;
  xf = max.X;
  yf = max.Y;
  zf = max.Z;

  Reset();

  // Ahora calculamos las 8 esquinas

           CheckVertex(xi, yi, zi, matrix);
           CheckVertex(xi, yf, zi, matrix);
           CheckVertex(xf, yf, zi, matrix);
           CheckVertex(xf, yi, zi, matrix);

           CheckVertex(xi, yi, zf, matrix);
           CheckVertex(xi, yf, zf, matrix);
           CheckVertex(xf, yf, zf, matrix);
           CheckVertex(xf, yi, zf, matrix);
 }

Título: Bounding Box Por Matrix
Publicado por: Pogacha en 22 de Diciembre de 2005, 10:41:08 PM
 Por eso no usaba Bounding box para objetos transformables ... para objetos que se puedan rotar uso esferas de contención.
Saludos
Título: Bounding Box Por Matrix
Publicado por: Warchief en 22 de Diciembre de 2005, 10:52:58 PM
Cita de: "fiero"
Cita de: "Haddd"No basta un vector, necesitas 2 :lol:
Bueno, sí. Yo para las AABB utilizo 2 vectores, uno da las dimensiones y el otro el desplazamiento de la caja. Es que me hago viejo....  :blink:
El desplazamiento no va en la matriz de transformación? (o sólo guardáis rotación?)
Título: Bounding Box Por Matrix
Publicado por: zupervaca en 22 de Diciembre de 2005, 11:02:53 PM
 Yo en la matriz de transformación que le paso a la función esta todo (rotación, escala y translación), después en los dos puntos espaciales guardo las coordenadas de forma universal, es decir, no hace falta sumarles nada para saber su coordenada final, esto lo veo beneficioso para el frustum, colisiones, etc.

Editado: Gracias Haddd por resolver mi duda de si estaba pifiandola.
Título: Bounding Box Por Matrix
Publicado por: Haddd en 22 de Diciembre de 2005, 11:03:26 PM
 Nosotros tenemos LocalBB, que es el BB del Mesh en Object Space. Este siempre es el mismo a no ser que cambien los vértices.

WorldBB, que es el LocalBB*Matriz de Transformación

HierarchicalBB, que es el WorldBB + WorldBB de los objetos hijos relacionados.
Título: Bounding Box Por Matrix
Publicado por: zupervaca en 22 de Diciembre de 2005, 11:05:42 PM
 
CitarHierarchicalBB, que es el WorldBB + WorldBB de los objetos hijos relacionados.
Cuando un hijo cambia el boundingbox del padre... ¿volvéis a reconstruir todo el árbol?
Título: Bounding Box Por Matrix
Publicado por: Haddd en 22 de Diciembre de 2005, 11:13:01 PM
 sí ahora mismo se reconstruye todo. No hay ninguna optimización sobre eso
Título: Bounding Box Por Matrix
Publicado por: tiutiu en 10 de Enero de 2006, 04:49:46 PM
 Yo uso el metodo de actualizacion de WildMagic (de David Eberly, en geometrictools.com) para el arbol de BBoxes.
Cuando queremos actualizar las transformaciones de objeto, comenzamos por un nodo y calculamos la worldTransform basandonos en la del padre. Luego seguimos la recursion hacia las hojas. En el pase hacia arriba de la recursion, vamos actualizando el worldBound en base a los worldBound de los hijos. Cuando llegamos al nodo que ha iniciado el cambio, se propaga su worldbound hacia arriba.
De esta manera evitamos recalcular los bounds para los subarboles que no han sido afectados.
Yo solo guardo 1 vector para los extents desde el centro en las AABB, y 4 vectores en las OBB, 3 para las axis y 1 para los extents desde el centro. A parte tambien tengo el centro de la caja (pivote).
Tengo un metodo que calcula los 8 puntos y los deja en un array, prefiero no almacenarlo en el BBox para ahorrar espacio y llamarlo solo cuando lo necesite.
Título: Bounding Box Por Matrix
Publicado por: AK47 en 10 de Enero de 2006, 05:23:57 PM
 ¿Puedes darme la dirección del método de WildMagic, tiutiu? He estado mirando en www.geometrictools.com y no lo he encontrado por ninguna parte  (nooo)

Muchas gracias  (ole)  
Título: Bounding Box Por Matrix
Publicado por: tiutiu en 10 de Enero de 2006, 05:54:41 PM
 En la seccion SceneGraph tienes el codigo fuente de las clases Spatial (nodo abstracto), Node (nodo composite) y Geometry (nodo hoja) que son las que necesitas mirar. El punto de entrada es Spatial::UpdateGS(), y llama a funciones polimorficas de Spatial, Node y Geometry.
Tambien puedes mirar este trozo del libro 3D Game Architecture en donde explica como va el arbol (actualizacion de transformaciones/BBoxes) por si no te aclaras con el codigo, aunque es bastante intuitivo.
Título: Bounding Box Por Matrix
Publicado por: zupervaca en 10 de Enero de 2006, 07:32:18 PM
 El no usar dos puntos espaciales (mínimo y máximo) trae consecuencias como la del código que usa para saber si colisionan dos boundingbox, aparte el sistema de volver a calcular todos los nodos superiores del que se modifica es como volver a calcularlos todos ya que normalmente se modifican los nodos mas inferiores que son los objetos animados, es decir, personajes, huesos, etc. No digo que este mal, solo que no esta optimizado como debería.

PD: Es una opinión que puede estar acertado o no, con lo que por favor nada de avalanchas en plan flame, simplemente yo tengo rutinas mas optimizadas para estos casos.