700 likes | 822 Views
Tractament de col·lisions en temps real. Objectius. Donar un model de tractament de col·lisions independent de l’aplicació Tractar les col·lisions en menys de 20 milisegons. Temes tractats. Model general pel tractament de col·lisions Gravetat Error de precisió Exemple d’una aplicació real.
E N D
Objectius • Donar un model de tractament de col·lisions independent de l’aplicació • Tractar les col·lisions en menys de 20 milisegons
Temes tractats • Model general pel tractament de col·lisions • Gravetat • Error de precisió • Exemple d’una aplicació real
Components d’un sistema de tractament de col·lisions • Algoritme de detecció • Algoritme de reacció
Un algoritme de detecció bàsic 12345678910111213 Aplicació(){ per ( t = t0 fins a t1 en increments de trep ) { obté dades dels dispositius d’entrada actualitza el comportament dels objectes per t fes { infoCol = detecta( t, objectes ) si ( infoCol conté col·lisions ) resposta a les col·lisions } mentre ( infoCol contingui col·lisions ) representa cada objecte de objectes per t }}
Un algoritme de detecció bàsic 141516171819202122 /* La variable tant persisteix d’una crida a l’altre. *//* Inicialment tant = t0. */detecta( tact, objectes ){ per ( t = tant fina a tact en increments de tdet ) { mou objectes a la seva posició per t per ( cada objecte Oi de objectes ) { per ( cada objecte Oj de {objectes – Oi} ) si ( Oi i Oj interseccionen ) afegir Oi i Oj a infoCol }
Un algoritme de detecció bàsic 2324252627282930 si ( infoCol conté col·lisions ) {tant = t retorna ( infoCol ) } }tant = tact retorna ( infoCol )}
Problemes de l’algoritme bàsic • Comprovar les col·lisions a només certs instants de l’interval de temps (fixed-timestep weakness) • Comprovar les interseccions entre totes les parelles d’objectes (all-pairs weakness) • Determinar si les superfícies de dos objectes interseccionen (pair-processing weakness)
Fixed-timestep weakness • Problema: • Algunes col·lisions poden no detectar-se • Solucions: • Increment de temps adaptable • Bounding de moviment
Bounding de moviment • Engloba tot l’espai pel que passa l’objecte durant l’interval de temps • Si dos objectes col·lisionen els seus boundings de moviment interseccionaran
Bounding de moviment • Avantatges: • Es detecten col·lisions en tot l’interval de temps • Amb una sola iteració es comprova tot l’interval de temps • Requeriments: • S’ha de generar ràpidament • El test d’intersecció entre boundings ha de ser ràpid
Bounding de moviment • Conté regions que no corresponen a l’espai pel que passa l’objecte • Problema: • Es pot detectar una falsa col·lisió • Solució: • Posterior càlcul exacte de la col·lisió
Bounding de moviment • No guarda la informació temporal • Problema: • Es pot detectar una falsa col·lisió • Solucions: • Posterior càlcul exacte de la col·lisió • Bounding espacio-temporal
Bounding de moviment • Un objecte varia el seu comportament en col·lisionar • Problema: • No es detecten les possibles noves col·lisions • Solució: • Recalcular el bounding de moviment
All-pairs weakness • Problema: • Es realitzen moltes comprovacions d’intersecció • Solució: • Organització espacial • Bounding de moviment
Pair-processing weakness • Problema: • Comprovar la intersecció entre les superfícies de dos objectes és costós • Solució: • Aproximar l’objecte amb un bounding
Bounding d’objecte • Problema: • El món visual i el de les col·lisions són diferents • Solució: • Arbre de boundings
Sopa de polígons • Algunes aplicacions consten d’un món estàtic de polígons • Cada polígon es considera com un objecte estàtic • El bounding d’objecte d’un polígon és el mateix polígon
Boundings tractats • Esfera (bounding sphere) • Caixa alineada al món (axis aligned bounding box – AABB) • Caixa orientada (oriented bounding box – OBB)
Necessitats d’un bounding de moviment • Rapidesa de creació • Màxima aproximació a l’espai pel que passa l’objecte • Eficiència en l’algoritme d’intersecció
Esfera • Punts forts: • Creació • Algoritme d’intersecció • Punts febles: • Aproximació
Caixa alineada al món • Punts forts: • Creació • Algoritme d’intersecció • Punts febles: • Aproximació
Caixa orientada • Punts forts: • Aproximació • Punts febles: • Algoritme d’intersecció
Necessitats d’un bounding d’objecte • Rapidesa d’actualització • Màxima aproximació a la forma de l’objecte • Eficiència en l’algoritme d’intersecció
Esfera • Punts forts: • Actualització • Algoritme d’intersecció • Punts febles: • Aproximació
Caixa alineada al món • Punts forts: • Algoritme d’intersecció • Punts febles: • Actualització • Solució: caixa de mida fixa • Aproximació
Caixa orientada • Punts forts: • Aproximació • Punts febles: • Algoritme d’intersecció
Arbres de boundings • Aproximen millor la forma de l’objecte • Es pot interrompre l’algoritme d’intersecció en funció del temps de càlcul disponible • Dos tipus: • El mateix bounding per tots els nivells • Un bounding més senzill a l’arrel
Procediment de la reacció • Què cal fer en detectar una col·lisió? • Variar el comportament de l’objecte • Detectar noves col·lisions per la resta de l’interval de temps • Com? • Aplicant lleis de la dinàmica • Simulant aquestes lleis
Reaccions simulades • Lliscament amb fricció • Rebot amb esmorteïment
Lliscament amb fricció • Trobar el pla de col·lisió • Projectar la velocitat excedent sobre el pla de col·lisió • Escurçar el vector projectat per un factor de fricció • Vector resultant = vector de lliscament
Rebot amb esmorteïment • Trobar el pla de col·lisió • Reflectir la velocitat excedent sobre el pla de col·lisió • Escurçar el vector reflectit per un factor d’esmorteïment • Vector resultant = vector de rebot
Simulació • Com a força constant • Com a vector afegit al vector de velocitat
Aplicació del vector de gravetat • Dos mètodes: • Aplicar la gravetat sobre el vector de velocitat • Aplicar la gravetat com a vector de velocitat en una segona iteració
Problema • Els ordinadors treballen amb números finits • Algunes operacions poden donar un resultat erroni • El sistema de tractament de col·lisions pot fallà
Exemple d’operació errònia 1234 si ( a > 0 i b > 0 ) { c = a · b d = 1 / c} • Situació: • Límit de precisió = 3 decimals; a = 0.012; b = 0.025 • Resultat de l’operació c = a·b: • Sobre el paper: c = 0.0003 • En l’ordinador: c = 0 • Solució: • Comparar a i b amb un valor EPSILON proper al zero
Exemple d’una aplicació real Sistema de col·lisions de la versió beta del motor OpenDoor
Què suporta el motor • Un món estàtic de polígons • Un personatge explorant el món
Decisions preses • Sistema de visualització basat en el portal rendering: • Organització de la geometria en habitacions • Impera la rapidesa del tractament de col·lisions en front de la precisió: • Personatge aproximat amb una esfera • Pocs objectes en un mateix lloc: • Caixa alineada al món com a bounding de moviment
Algoritme de tractament de col·lisions 1234567891011 Joc(){ per ( t = t0 fins a en increments de trep ) { obté dades dels dispositius d’entrada actualitza el comportament del personatge per t velocitat = velocitat del personatge per ttracta( personatge, velocitat ) tracta( personatge, gravetat ) representa el món per t}}
Algoritme de tractament de col·lisions 121314151617181920 tracta( objecte, velocitat ){ fes {infoCol = detecta( objecte, velocitat ) actualitza la posició de objecte segons infoColsi ( infoCol conté col·lisions )velocitat = respon( infoCol, objecte, velocitat ) } mentre ( infoCol contingui col·lisions )}
Algoritme de detecció 123456789 detecta( objecte, velocitat ){boundObj = bounding de objecte boundMov = genera_bound_mov( boundObj, velocitat )polsPot = obté_pols_potencials( boundObj, boundMov )cols = troba_col·lisions( boundObj, velocitat, polsPot )infoCol = primera_col·lisió( cols ) retorna ( infoCol )}
Generació del bounding de moviment • Cal trobar els 6 plans que formen la caixa: • Es resta el radi a les components x, y i z més petites dels punts origen i destí • Es suma el radi a les components majors
Generació del bounding de moviment 123456789101112 genera_bound_mov( esfera, velocitat ){origen = posició de esfera destí = origen + velocitat radi = radi de esfera caixa.xmín = mínim( origen.x, destí.x ) – radicaixa.xmàx = màxim( origen.x, destí.x ) + radicaixa.ymín = mínim( origen.y, destí.y ) – radicaixa.ymàx = màxim( origen.y, destí.y ) + radicaixa.zmín = mínim( origen.z, destí.z ) – radicaixa.zmàx = màxim( origen.z, destí.z ) + radi}
Obtenció dels polígons potencials • S’aprofita l’organització en habitacions: • Només es comproven interseccions amb els polígons de les habitacions per on passa el personatge • Bounding de moviment: • Es descarten ràpidament la majoria dels polígons