viernes, 8 de noviembre de 2013

Día 131106_2 : Simulación : Resolución de colisiones

Resolución de colisiones

  • Después de determinar si dos objetos colisionan, hay que resolver que hacen los objetos después de esa colisión.
  • Para esta resolución es necesario conocer:
    • Punto exacto de la colision
    • Dirección (normal a la superficie) del impacto.

Posibilidades de colisión entre mallas poligonales 3D

  1. Colisión cara-vértice
  2. Colisión cara-cara : estudiar apoyo en 3 puntos, para que no baile
  3. Colisión cara-arista
  4. Colisión arista-arista
Los casos vértice-vértice y arista-vértice se consideran poco probables y se puede cambiar a vértice/cara al considerar que el error de cálculo permite este caso.

Planteamiento del problema:

  • Una vez que sabemos que dos objetos colisionan, hay que determinar en que vértice/arista/cara lo hacen.
  • Pero al ser un cálculo de paso de tiempo discreto, los objetos pueden llegar a inter-penetrarse, dando lugar a una incertidumbre en el punto de colisión.
  • La soluciones a este problema son:
    • Definir un márgen (gap) alrededor de las mallas, no tiene coste computacional (fácil y rápido de calcular), pero a altas velocidades se reproduce el problema.
    • Predeterminar la posición anterior y corregir el problema actual, el error no es apreciable, pero puede dar problemas si los objetos estaban ya estaban inter-penetrados en la posición anterior.
Modelo matemático para resolver colisiones


Día 131106_1 : Simulación : Partición del espacio AABB-Tree y OBB-Tree

Partición del espacio con AABB-Tree
  • AABB: Axis Aligned Bounding Boxes. 
  • Este tipo de partición del espacio es idoneo para colision de mallas poligonales con más de 1000 vértices.
  • Se utiliza mucho en videojuegos.

La contruccion es sencilla:
  • Se parte de una malla poligonal formada por triángulos.
  • Se define la caja orgogonal que contenga a todos los triangulos asignados
  • Si el número de triángulos es menor o igual a 12, se crea la hoja que contenga todo y hemos terminado.
  • Si existen más de 12 triángulos, se divide en dos la caja por un plano ortogonal al eje mayor de la nube de centros de triángulos y se crean dos nodos hijos.
  • Continua el mismo proceso de forma recursiva hasta que cada triángulo este en alguna hoja.

Ventajas
  • El procesado es rápido
  • La programación es fácil.
Partición del espacio con OBB-Tree
  • Es menos usada al tener una construcción más lenta, ya que incluye un cálculo estadístico y la actualización de sus elementos también es más lento. 
  • Es más preciso al ajustarse más a la malla y tiene una detección de colisiones más rápida.

lunes, 4 de noviembre de 2013

Día 131030 : Simulación : Partición del espacio kD-Tree

kD-Tree
  • Un Árbol kd (abreviatura de árbol k-dimensional) es una estructura de datos de particionado del espacio que organiza los puntos en un Espacio euclídeo de k dimensiones.
  • Un árbol kd emplea sólo planos perpendiculares a uno de los ejes del sistema de coordenadas. Además, todos los nodos de un árbol kd, desde el nodo raíz hasta los nodos hoja, almacenan un punto.
  • La letra k se refiere al número de dimensiones. Un árbol kd tridimensional podría ser llamado un árbol 3d. Sin embargo se suele emplear la expresión "árbol kd tridimensional".
  • Construcción:
    • Según se desciende en el árbol, se alterna por los ejes. (Por ejemplo, la raíz plano alineado con el eje x, sus descendientes planos alineados con el y y los nietos alineados con el z..)
    • En cada paso, el punto por donde pasa el plano será la mediana de los puntos.
    • Este método es balanceado, donde cada nodo hoja está a la misma distancia de la raíz. 

  • Dada una nube de 6 puntos, el siguiente algoritmo genera un árbol kd balanceado que contiene dichos puntos.
Función para construir el kDTree, dado un conjunto de puntos P y una profundidad en el árbol.
BuildKdTree ( P , PROFUNDIDAD ) 
  • SI P contiene sólo un punto ENTONCES devuelve la hoja que contiene el punto
  • SI TIENE MAS DE UN PUNTO
    • SI PROFUNDIDAD esta vacio
      • Divido P en dos subconjuntos con una línea vertical (1) en la mediana de todas las coordeanadas X de los puntos de P
        • A es el subconjunto de puntos de la izquierda
        • B es el subconjunto de puntos de la derecha
    • SI PROFUNDIDAD no esta vacio
      • Divido P en dos subconjuntos con una línea horizontal(2) en la mediana de todas las coordeanadas Y de los puntos de P
      • A es el subconjunto de puntos de por encima
      • B es el subconjunto de puntos de por debajo
      • Creo un nodo nuevo en el árbol almacenando la linea y sus hijos.
    • Con los puntos de la izquierda repito BuildKdTree ( P , PROFUNDIDAD ) 
    • Con los puntos de la derecha repito BuildKdTree ( P , PROFUNDIDAD ) 
  • Para encontrar la mediana en cada nodo es mejor crear una lista de puntos ordenados de cada una de las dimensiones.
KDTREE es lo más eficiente en entornos estáticos con Ray-Tracing.
  • Al pasar un rayo por una celda se producen 4 casos:
    1. Que el rayo atraviese el plano después de salir de la celda: 
      • Descarto la hoja al otro lado del plano: F
    2. Que el rayo atraviese el plano antes de salir: 
      • No se descarta ninguno de los hojas.
    3. Que el rayo atraviese el plano antes de llegar a la celda
      • Se descarta la hoja antes del plano: N
    4. Que no intercepto: la celda se descarta

Día 311028_2 : Simulación : Particiones del espacio

Particiones del espacio

  • Cuando aumenta el número de objetos que colisionan en el espacio, se deben buscar método que comprueben la posición de cada uno de esos objetos respecto al resto.
  • Para detectar la colisión entre n objetos en el espacio, se usa la expresión: n·( (n/2) - 1 ), es decir O(n^2)
  • Dada la tabla de n elementos:
    • Sin eliminar las colisiones repetidas y los de si mismos tendríamos: n^2 colisiones
    • Eliminando las repetidas y los de si mismo: n^2/2 - n ->  n·( (n/2) - 1 )
Grids
  • Partición del espacio en celdas del mismo tamaño
  • Las coordenas de la celda en la que esta un objeto es:
    • Xg= (x –xog)*Size_X_grid/Size_X
    • Yg= (y –yog)*Size_Y_grid/Size_Y
    • Zg= (z –zog)*Size_Y_grid/Size_Y
      • x = coordenadas del objeto respecto del origen
      • xog = coordenadas del origen del grid respecto del origen
      • Size_X_grid/Size_X es el número de celdas en la dimensión X
      • Es como una proporcion 
  • El tamaño del objeto no es lo importante, sólo se considera la posición de su centro.
  • El tamaño de la celda esta definido por el doble del radio de la Bouning Sphere del objeto más grande para que un objeto no pueda estar en la celdas vecinas.
  • En 3D cada objeto puede colisionar con las 27 celdas de su alrededor.

Necesidades al particionar el espacio
  • Entorno ACOTADOS con geometría ESTÁTICA.
  • PRECALCULAR las coordenadas del GRID para todos los objetos.
  • No considerar las celdas vacías (tetera en un estadio).
Partición del espacio para Ray-Tracing
  • Son entornos acotadas, son escenas de Render
  • La geometría es estática
  • Se consideran sólo las celdas por la que pasa el rayo usando el algoritmo de Anti-Aliasing o DDA (Analizador Diferenciador Digital).
  • Sigue teniendo el problema de celdas vacías.