VIDEOJUEGOS 2 Detección de colisiones
Puntos a tratar Sistema de detección de colisiones Broad phase Bounding Volumes Particionamiento espacial Sweep and prune Narrow phase Geometría de colisión Tipos de formas Layering Sensores 2
Sistema de detección de colisiones Entrada Conjunto de objetos del mundo Cada objeto tiene una forma (geometría de colisión) Salida Conjunto de puntos de contacto entre objetos De cada contacto se proporciona la normal y la profundidad La detección de colisiones es un proceso complejo La comprobación de colisiones exacta entre objetos con formas complejas tiene un alto coste El número de comprobaciones crece de forma cuadrática con el número de objetos del mundo Es necesario optimizar el proceso 3
Fases de la detección de colisiones Para reducir el coste el proceso se divide en dos fases Broad phase (Filtrado de potenciales contactos) Filtra los objetos que pueden colisionar de forma eficiente No se utiliza la forma real de los objetos, sino formas simplificadas que abarcan todo el objeto (Bounding Volume) y que permiten comprobar de forma eficiente si intersectan Produce como salida un conjunto de pares de objetos que podrían colisionar (es posible que finalmente no lo hagan) Narrow phase (Generación de contactos) Recibe los pares de objetos que pueden colisionar (tras el filtrado de broad phase) Produce como salida los contactos exactos, junto a la normal y la profundidad de cada uno de ellos. 4
Bounding Volumes (BVs) El Bounding Volume debe abarcar todo el objeto Puede que dos objetos cuyos BVs intersectan realmente no colisionen (falso positivo) No puede ocurrir que dos BVs que no intersecten correspondan a objetos que realmente si colisionen (falso negativo) Utilizamos formas para las que resulte sencillo comprobar si intersectan Esfera Es la comprobación más sencilla. Comprobar si la distancia entre sus centros es mayor que la suma de sus radios. AABB Axis-Aligned Bounding Box. Según la forma y la orientación del objeto puede que no aproveche bien el espacio OBB Object Bounding Box. Aprovecha mejor el espacio pero la comprobación de intersecciones es más compleja 5
Algoritmos de broad phase Los BVs simplifican la comprobación de colisiones Aun así el número de pares de objetos a comprobar es demasiado elevado Se necesita un algoritmo que reduzca este número La idea fundamental es agrupar los objetos en islas Sólo comprobamos colisiones entre los objetos de una misma isla Estos agrupamientos pueden ser reutilizados por el motor gráfico Algunas de las principales técnicas utilizadas en broad phase son Bounding Volume Hierachies (BVHs) Particionamiento espacial Sweep and Prune 6
Bounding Volume Hierarchies (BVHs) Agrupamos los objetos (BVs) en una jerarquía de tipo árbol Suele tratarse de un árbol binario Las hojas del árbol son los BVs de los objetos del mundo Un nodo intermedio representa un BV que abarca a todos sus hijos Si los BVs de dos nodos no intersectan, sus hijos tampoco lo harán 7
Construcción del BVH Al construir el BVH debemos buscar Reducir el BV de los nodos del árbol Evitar solapes entre hermanos Obtener un árbol balanceado En el caso de objetos estáticos podemos construirlo offline Top-down Subdividimos a partir del conjunto completo Bottom-up Agrupamos los nodos desde las hojas Normalmente habrá objetos en movimiento Inserción Se realiza una búsqueda del mejor lugar donde añadir cada nodo Permite añadir objetos de forma dinámica 8
Actualización del BVH Se pueden definir dos BVH A. Objetos estáticos y dormidos B. Objetos en movimiento Los objetos que no han tenido movimiento en las últimas actualizaciones pueden quedar dormidos (sleep) para optimizar Comprobaremos las colisiones de B con B y de B con A Para un objeto en movimiento Si el BV del padre sigue abarcándolo no hacemos nada En caso contrario, lo eliminamos y lo reinsertamos Recomendaciones Ampliar el BV con un margen que evite recalcular para pequeños movimientos 9
Particionamiento espacial Similar a BVH En este caso el particionamiento se hace atendiendo al espacio, y no a la distribución de objetos en el mundo Dividimos el espacio del mundo en celdas, y sólo comprobamos las colisiones entre objetos dentro de una misma celda Existen diferentes estructuras para realizar el particionamiento Binary Space Partition (BSPs) Octrees / Quadtrees Rejillas Mapas multiresolución 10
Binary Space Partition (BSPs) El particionamiento se representa como un árbol binario Cada nodo del árbol representa un plano que divide el mundo El primer hijo contiene todos los objetos de un lado del plano, y el segundo hijo los del otro lado 2 1 1 2 11
Octrees El espacio se divide en 8 regiones Cada región puede a la vez subdividirse en otras 8 Subdividiremos hasta que cada región tenga la resolución adecuada Se representa como un árbol en el que cada nodo tiene 8 hijos 1 2 3 4 5 6 7 8 12
Quadtrees Similar al octree 1 2 Cada región se divide en 4 subregiones No se divide en altura 3.1 3.2 3.3 3.4 4 Se utilizará en Juegos 2D Juegos 3D en los que todos los objetos se encuentran al mismo nivel 1 1 2 3 4 3.1 3.2 3.3 3.4 13
Rejillas El espacio se divide como una rejilla uniforme Sigue una estructura de array bidimensional Problema Todos los puntos tienen la misma resolución Qué hacemos cuando un cuerpo abarca varias celdas? Podemos insertarlo en todas ellas Esto produce un mayor coste 14
Mapas multiresolución Mejora de la rejilla uniforme para soportar objetos de diferentes tamaños Tenemos varias rejillas con distintas resoluciones Situamos un objeto en la rejilla que mejor se adapte a su tamaño Comprobamos colisiones de los objetos con los de su propia celda, y con los de celdas de rejillas de menor resolución 15
Algoritmo Sweep and Prune (I) Se basa en la ordenación de los cuerpos a lo largo de cada eje Los cuerpos se representan mediante su AABB Algoritmo 1. De cada cuerpo tomamos sus coordenadas límite xmin y xmax 2. Ordenamos los cuerpos según xmin 3. Recorremos la lista seleccionando los pares de objetos que se solapan en x No hará falta comprobar todos los pares, sólo los cercanos, ya que está ordenado 4. Repetimos el proceso con los pares seleccionados en 3 para el eje y 5. Repetimos el proceso con los pares seleccionados en 4 para el eje z 6. Los pares seleccionados en 5 se solapan en los tres ejes Estos son los objetos cuyos AABBs interceptan y por lo tanto deben ser devueltos por broad phase 16
Algoritmo Sweep and Prune (II) y Ordenación en x Se seleccionan los pares ( ) ( ) Ordenación en y Se seleccionan los pares ( ) x El único par que puede estar en contacto es ( ) 17
Algoritmo Sweep and Prune (III) Si los cuerpos están en movimiento será necesario actualizar la ordenación La actualización será eficiente siempre que no haya habido muchos cambios El algoritmo Sweep and Prune (SAP) será conveniente en casos en los que no haya mucho movimiento en el mundo 18
Layering En ocasiones no nos interesa que todos los objetos puedan colisionar con todos Por ejemplo, podemos querer que nuestras balas sólo afecten a los enemigos, y no a nuestros compañeros Podemos asignar los objetos a capas de forma que sólo se comprueben colisiones entre los objetos si están en la misma capa Este filtrado se hará en broad phase 19
Generación de contactos (narrow phase) Entrada Conjunto de pares de objetos que pueden colisionar proporcionados por broad phase Detección fina de colisiones Comprobar si los pares de objetos realmente están en contacto Se usa su geometría de colisión Generación de contactos Obtiene los puntos de contacto junto a sus normales y profundidad de interpenetración Salida Conjunto de contactos detectados entre objetos 20
Detección fina de colisiones La geometría real del objeto puede ser demasiado compleja incluso para esta fase En su lugar utilizamos una geometría aproximada Geometría de colisión Formas geométricas típicas para la colisión Esfera Caja Cápsula Cilindro Cono Utilizada habitualmente para nuestro personaje 21
V2 Detección de colisiones Geometría de colisión Debemos utilizar como geometría de colisión la forma más sencilla que aproxime nuestros objetos A diferencia del motor gráfico, El orden de preferencia es el siguiente no siempre son mayas Esfera Caja Aproximar a una esfera o caja siempre que sea posible Videojuegos II Formas convexas Formas cóncavas Evitar siempre que sea posible! Sólo se debería usar para el escenario estático 2015-2016 Depto. Ciencia de la Computación e IA Detección de colisiones 22
Recubrimiento convexo Dada una maya, su recubrimiento convexo (convex hull) es la forma convexa que mejor se ajusta a la forma de la maya Siempre que sea posible, será mejor aproximar el objeto por una esfera o caja 23
Composición de formas Si no podemos aproximar el objeto con una única forma convexa, podemos crearlo como composición de varias formas convexas Esto es preferible a utilizar una forma cóncava El único uso que se le debería dar a una maya cóncava es la representación de la maya de colisión con el escenario estático La comprobación de colisiones entre dos mayas cóncavas es el caso más complejo y debe evitarse 24
Contacto esfera-esfera Existen algoritmos específicos para cada par de formas concretas El caso más sencillo es el de dos esferas Existe una colisión si la distancia entre sus centros es menor que la suma de sus radios La profundidad de interpenetración es la diferencia existente entre las cantidades anteriores Hay un único punto de contacto que se encuentra en la línea que une sus centros d 25
Contacto caja-esfera Es un caso más complejo que esfera-esfera Sólo existirá un punto de contacto con la esfera Puede estar en una cara, una arista, o una esquina Arista Cara Esquina 26
Contacto caja-caja Más complejo que caja-esfera La posibles combinaciones se multiplican Esquina-Esquina Esquina-Arista Esquina-Cara Arista-Arista Arista-Cara Cara-Cara Algunas de estas combinaciones son muy poco probables y podrían ignorarse, como esquina-esquina, esquina-arista o arista-arista En algunos casos el contacto se da en toda una arista o cara Normalmente sólo consideraremos una serie de puntos 27
Sensores En ocasiones queremos saber cuando un objeto entra en una determinada zona, pero no queremos que colisiones con ella Por ejemplo que al acercarnos a una puerta se abra Para esto podemos utilizar sensores Pertenecen al subsistema de detección de colisiones El sensor tiene una geometría de colisión La geometría del sensor no produce reacción a la colisión Si que se notifica cuando algún cuerpo entra en contacto 28
Preguntas...? 29