Tractament de col·lisions en Tractament de col·lisions en temps realtemps real
ObjectiusObjectius
Donar un model de tractament de col·lisions independent de l’aplicació
Tractar les col·lisions en menys de 20 milisegons
Temes tractatsTemes tractats
Model general pel tractament de col·lisions
GravetatError de precisióExemple d’una aplicació real
Components d’un sistema de Components d’un sistema de tractament de col·lisionstractament de col·lisionsAlgoritme de deteccióAlgoritme de reacció
Detecció de col·lisionsDetecció de col·lisions
Un algoritme de detecció bàsicUn algoritme de detecció bàsic
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 }}
123456789
10111213
Un algoritme de detecció bàsicUn algoritme de detecció bàsic
/* 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
}
141516171819202122
Un algoritme de detecció bàsicUn algoritme de detecció bàsic
si ( infoCol conté col·lisions ) { tant = t
retorna ( infoCol ) } } tant = tact
retorna ( infoCol )}
2324252627282930
Problemes de l’algoritme bàsicProblemes 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 weaknessFixed-timestep weakness
Problema:– Algunes col·lisions
poden no detectar-se
Solucions:– Increment de temps
adaptable– Bounding de
moviment
Bounding de movimentBounding 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 movimentBounding 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 movimentBounding 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 movimentBounding 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 movimentBounding 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 weaknessAll-pairs weakness
Problema:– Es realitzen moltes comprovacions
d’intersecció
Solució:– Organització espacial– Bounding de moviment
Pair-processing weaknessPair-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’objecteBounding d’objecte
Problema:– El món visual i el
de les col·lisions són diferents
Solució:– Arbre de
boundings
Sopa de polígonsSopa 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
Tipus de boundings més comunsTipus de boundings més comuns
Boundings tractatsBoundings 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 Necessitats d’un bounding de movimentmovimentRapidesa de creacióMàxima aproximació a l’espai pel que
passa l’objecteEficiència en l’algoritme
d’intersecció
EsferaEsfera
Punts forts:– Creació– Algoritme
d’intersecció
Punts febles:– Aproximació
Caixa alineada al mónCaixa alineada al món
Punts forts:– Creació– Algoritme
d’intersecció
Punts febles:– Aproximació
Caixa orientadaCaixa orientada
Punts forts:– Aproximació
Punts febles:– Algoritme
d’intersecció
Necessitats d’un bounding Necessitats d’un bounding d’objected’objecteRapidesa d’actualitzacióMàxima aproximació a la forma de
l’objecteEficiència en l’algoritme
d’intersecció
EsferaEsfera
Punts forts:– Actualització– Algoritme
d’intersecció
Punts febles:– Aproximació
Caixa alineada al mónCaixa alineada al món
Punts forts:– Algoritme
d’intersecció
Punts febles:– Actualització
• Solució: caixa de mida fixa
– Aproximació
Caixa orientadaCaixa orientada
Punts forts:– Aproximació
Punts febles:– Algoritme
d’intersecció
Arbres de boundingsArbres 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
Reacció a les col·lisionsReacció a les col·lisions
Procediment de la reacció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 tempsCom?– Aplicant lleis de la dinàmica– Simulant aquestes lleis
Reaccions simuladesReaccions simulades
Lliscament amb friccióRebot amb esmorteïment
Lliscament amb friccióLliscament amb fricció
1. Trobar el pla de col·lisió
2. Projectar la velocitat excedent sobre el pla de col·lisió
3. Escurçar el vector projectat per un factor de fricció
4. Vector resultant = vector de lliscament
Rebot amb esmorteïmentRebot amb esmorteïment
1. Trobar el pla de col·lisió
2. Reflectir la velocitat excedent sobre el pla de col·lisió
3. Escurçar el vector reflectit per un factor d’esmorteïment
4. Vector resultant = vector de rebot
GravetatGravetat
SimulacióSimulació
Com a força constantCom a vector afegit al vector de
velocitat
Aplicació del vector de gravetatAplicació 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ó
Error de precisióError de precisió
ProblemaProblema
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òniaExemple d’operació errònia
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
si ( a > 0 i b > 0 ) { c = a · b d = 1 / c}
1234
Exemple d’una aplicació realExemple d’una aplicació real
Sistema de col·lisions de la versió beta del motor OpenDoor
Què suporta el motorQuè suporta el motor
Un món estàtic de polígonsUn personatge explorant el món
Decisions presesDecisions 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 Algoritme de tractament de col·lisionscol·lisions
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 t tracta( personatge, velocitat ) tracta( personatge, gravetat ) representa el món per t }}
123456789
1011
Algoritme de tractament de Algoritme de tractament de col·lisionscol·lisions
tracta( objecte, velocitat ){ fes { infoCol = detecta( objecte, velocitat ) actualitza la posició de objecte segons infoCol si ( infoCol conté col·lisions ) velocitat = respon( infoCol, objecte, velocitat ) } mentre ( infoCol contingui col·lisions )}
121314151617181920
Algoritme de deteccióAlgoritme de detecció
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 )}
123456789
Generació del bounding de Generació del bounding de movimentmoviment 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 Generació del bounding de movimentmoviment
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 ) – radi
caixa.xmàx = màxim( origen.x, destí.x ) + radi
caixa.ymín = mínim( origen.y, destí.y ) – radi
caixa.ymàx = màxim( origen.y, destí.y ) + radi
caixa.zmín = mínim( origen.z, destí.z ) – radi
caixa.zmàx = màxim( origen.z, destí.z ) + radi
}
123456789
101112
Obtenció dels polígons potencialsObtenció 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
Obtenció dels polígons potencialsObtenció dels polígons potencials
Quan un objecte canvia d’habitació forçosament ha de travessar un portal
Llavors el portal intersecciona amb el bounding de moviment
Obtenció dels polígons potencialsObtenció dels polígons potencials
Si els boundings de moviment no interseccionen ja es pot descartar el polígon
Un posterior clipping pot ajudar a descartar més polígons
Obtenció dels polígons potencialsObtenció dels polígons potencials
obté_pols_potencials( esfera, boundMov ){ habsOcupades = habitacions que interseccionen amb boundMov per ( cada habitació Hi de habsOcupades ) {
per ( cada polígon Pj dels polígons que conté Hi ) {
boundPol = bounding de Pj
si ( boundMov i boundPol interseccionen ) si ( boundMov i Pj interserccionen ) )
afegeix Pj a polsPot
} } retorna ( polsPot )}
123456789
10111213
Càlcul de les col·lisionsCàlcul de les col·lisions
L’esfera només pot col·lisionar amb un polígon si hi fa cap
Els polígons només consten de cara frontal
Se suposa un món ben construïtSempre hi ha un sol punt de contacte
entre una esfera i un polígon
Càlcul de les col·lisionsCàlcul de les col·lisions
Un objecte s’acosta a un polígon si el seu vector de velocitat i la normal del polígon són de sentits oposats
En un món ben construït un objecte mai s’aproparà a un polígon per darrera
Càlcul de les col·lisionsCàlcul de les col·lisions
Es mou el pla del polígon fins a tocar l’esfera
Es troba el punt de col·lisió de l’esfera en la seva posició inicial (ptCole)
Càlcul de les col·lisionsCàlcul de les col·lisions
Des de ptCole es traça un raig paral·lel al vector de velocitat
Es troba el punt d’intersecció amb el pla del polígon (ptColp)
Càlcul de les col·lisionsCàlcul de les col·lisions
El punt ptColp pot estar fora del polígon
Es troba el punt del polígon més proper al ptColp (nou ptColp)
Càlcul de les col·lisionsCàlcul de les col·lisions
Des del nou ptColp es traça un raig paral·lel i de sentit invers al vector de velocitat.
El primer punt d’intersecció amb l’esfera serà el nou ptCole
Si el raig no intersecciona tampoc es produeix col·lisió
Càlcul de les col·lisionsCàlcul de les col·lisions
troba_col·lisions( esfera, velocitat, polígons ){ origen = posició de l’esfera velu = velocitat normalitzada
per ( cada polígon Pi de polígons ) {
norm = normal de Pi
si ( norm * velu < 0 ) {
ptCole = punt d’intersecció del raig definit per origen i
-norm amb esfera ptColp = punt d’intersecció del raig definit per ptCole i velu
amb el pla que defineix Pi
12345678
9
Càlcul de les col·lisionsCàlcul de les col·lisions
si ( ptColp no està dins Pi ) {
ptColp = punt de Pi més proper a ptColp
ptCole = primer punt d’intersecció del raig definit per
ptColp i -velu amb l’esfera
si ( no existeix ptCole )
continuar amb la següent iteració }
101112
131415
Càlcul de les col·lisionsCàlcul de les col·lisions
distCol = mòdul de ptColp – ptCole
si ( distCol <= mòdul de velocitat ) afegeix distCol i Pi a col·lisions
} } retorna ( col·lisions )}
16171819202122
Elecció de la col·lisió més Elecció de la col·lisió més immediataimmediataDesprés de la primera col·lisió es
varia el vector de velocitatNomés és vàlida la primera col·lisió
Elecció de la col·lisió més Elecció de la col·lisió més immediataimmediata
primera_col·lisió( col·lisions ){ si ( col·lisions no conté cap col·lisió ) retorna ( ) distmín = per ( cada col·lisió Ci de col·lisions ) {
dist = distància de col·lisió de Ci
si ( dist < distmín ) {
distmín = dist
pol = polígon de Ci
} }
123456789
101112
Elecció de la col·lisió més Elecció de la col·lisió més immediataimmediata
afegeix distmín i pol a infoCol
retorna ( infoCol )}
131415
Algoritme de reaccióAlgoritme de reacció
El personatge ha de lliscar per la superfície amb la que col·lisiona– El personatge no s’atura al més mínim contacte– Es pugen automàticament rampes i obstacles
baixos La intensitat del lliscament ha de ser funció
de la textura i angle de col·lisió– Es roman quiet en rampes de poc pendent– Superfícies com el gel o la sorra generen
diferents comportaments
Algoritme de reaccióAlgoritme de reacció
El pla de col·lisió és el pla tangent a l’esfera en el punt de col·lisió
Perquè l’esfera es mogui el mòdul de la projecció de la velocitat ha de ser major que el factor de fricció
Algoritme de reaccióAlgoritme de reacció
respon( infoCol, objecte, velocitat ){ esfera = bounding de objecte pol = polígon que conté infoCol velExcedent = tros del vector velocitat després del punt de col·lisió plaCol = pla tangent a esfera en el punt de col·lisió lliscament = projecció de velExcedent sobre plaCol lliscament = lliscament escurçat pel factor de fricció de pol retorna ( lliscament )}
12345
6789
10
Adreces d’interèsAdreces d’interès
Adreces d’interèsAdreces d’interès
Codi de tests d’intersecció:– http://www.magic-software.com/Source/
Intersection3D/Intersection3D.html
Generació i utilització d’arbres d’esferes:– http://www.cs.wustl.edu/~pmh/research.html
Articles sobre la detecció de col·lisions– http://www.stanford.edu/~jgao/collision-detection.html
Articles sobre el motor OpenDoor:– http://www.macedoniamagazine.com
PER MÉS INFORMACIÓ...
[email protected] (Carles Ros Martínez – CITeM)
Top Related