¿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?
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.
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
No basta un vector, necesitas 2 :lol:
CitarNo basta un vector, necesitas 2
Cierto, siempre y cuando el BBOX no sea cuadrado, y eso es algo habitual...
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.
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:
¿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.
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);
}
Por eso no usaba Bounding box para objetos transformables ... para objetos que se puedan rotar uso esferas de contención.
Saludos
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?)
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.
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.
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?
sí ahora mismo se reconstruye todo. No hay ninguna optimización sobre eso
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.
¿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)
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.
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.