Tractament de collisions en temps real Objectius l
Tractament de col·lisions en temps real
Objectius l Donar un model de tractament de col·lisions independent de l’aplicació l Tractar les col·lisions en menys de 20 milisegons
Temes tractats l Model general pel tractament de col·lisions l Gravetat l Error de precisió l Exemple d’una aplicació real
Components d’un sistema de tractament de col·lisions l Algoritme de detecció l Algoritme de reacció
Detecció de col·lisions
Un algoritme de detecció bàsic 1 Aplicació() 2 { 3 per ( t = t 0 fins a t 1 en increments de trep ) { 4 obté dades dels dispositius d’entrada 5 actualitza el comportament dels objectes per t 6 fes { 7 info. Col = detecta( t, objectes ) 8 si ( info. Col conté col·lisions ) 9 resposta a les col·lisions 10 } mentre ( info. Col contingui col·lisions ) 11 representa cada objecte de objectes per t 12 } 13 }
Un algoritme de detecció bàsic 14 15 16 17 18 19 20 21 22 /* La variable tant persisteix d’una crida a l’altre. */ /* Inicialment tant = t 0. */ 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 info. Col }
Un algoritme de detecció bàsic 23 si ( info. Col conté col·lisions ) { 24 tant = t 25 retorna ( info. Col ) 26 } 27 } 28 tant = tact 29 retorna ( info. Col ) 30 }
Problemes de l’algoritme bàsic Comprovar les col·lisions a només certs instants de l’interval de temps (fixedtimestep weakness) l Comprovar les interseccions entre totes les parelles d’objectes (all-pairs weakness) l Determinar si les superfícies de dos objectes interseccionen (pair-processing weakness) l
Fixed-timestep weakness l Problema: – Algunes col·lisions poden no detectarse l 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 l Si dos objectes col·lisionen els seus boundings de moviment interseccionaran l
Bounding de moviment l Avantatges: – Es detecten col·lisions en tot l’interval de temps – Amb una sola iteració es comprova tot l’interval de temps l Requeriments: – S’ha de generar ràpidament – El test d’intersecció entre boundings ha de ser ràpid
Bounding de moviment l 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 l No guarda la informació temporal – Problema: • Es pot detectar una falsa col·lisió – Solucions: • Posterior càlcul exacte de la col·lisió • Bounding espaciotemporal
Bounding de moviment l 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 l Problema: – Es realitzen moltes comprovacions d’intersecció l Solució: – Organització espacial – Bounding de moviment
Pair-processing weakness l Problema: – Comprovar la intersecció entre les superfícies de dos objectes és costós l Solució: – Aproximar l’objecte amb un bounding
Bounding d’objecte l Problema: – El món visual i el de les col·lisions són diferents l Solució: – Arbre de boundings
Sopa de polígons l Algunes aplicacions consten d’un món estàtic de polígons l Cada polígon es considera com un objecte estàtic l El bounding d’objecte d’un polígon és el mateix polígon
Tipus de boundings més comuns
Boundings tractats l Esfera (bounding sphere) l Caixa alineada al món (axis aligned bounding box – AABB) l Caixa orientada (oriented bounding box – OBB)
Necessitats d’un bounding de moviment l Rapidesa de creació l Màxima aproximació a l’espai pel que passa l’objecte l Eficiència en l’algoritme d’intersecció
Esfera l Punts forts: – Creació – Algoritme d’intersecció l Punts febles: – Aproximació
Caixa alineada al món l Punts forts: – Creació – Algoritme d’intersecció l Punts febles: – Aproximació
Caixa orientada l Punts forts: – Aproximació l Punts febles: – Algoritme d’intersecció
Necessitats d’un bounding d’objecte l Rapidesa d’actualització l Màxima aproximació a la forma de l’objecte l Eficiència en l’algoritme d’intersecció
Esfera l Punts forts: – Actualització – Algoritme d’intersecció l Punts febles: – Aproximació
Caixa alineada al món l Punts forts: – Algoritme d’intersecció l Punts febles: – Actualització • Solució: caixa de mida fixa – Aproximació
Caixa orientada l Punts forts: – Aproximació l Punts febles: – Algoritme d’intersecció
Arbres de boundings l Aproximen millor la forma de l’objecte l Es pot interrompre l’algoritme d’intersecció en funció del temps de càlcul disponible l Dos tipus: – El mateix bounding per tots els nivells – Un bounding més senzill a l’arrel
Reacció a les col·lisions
Procediment de la reacció l 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 l Com? – Aplicant lleis de la dinàmica – Simulant aquestes lleis
Reaccions simulades l Lliscament amb fricció l Rebot amb esmorteïment
Lliscament amb fricció 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 1.
Rebot amb esmorteïment 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 1.
Gravetat
Simulació l Com a força constant l Com a vector afegit al vector de velocitat
Aplicació del vector de gravetat l 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ó
Problema l Els ordinadors treballen amb números finits l Algunes operacions poden donar un resultat erroni l El sistema de tractament de col·lisions pot fallà
Exemple d’operació errònia 1 si ( a > 0 i b > 0 ) { 2 c=a·b 3 d=1/c 4 } l Situació: – Límit de precisió = 3 decimals; a = 0. 012; b = 0. 025 l Resultat de l’operació c = a·b: – Sobre el paper: c = 0. 0003 – En l’ordinador: c = 0 l 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 Open. Door
Què suporta el motor l Un món estàtic de polígons l Un personatge explorant el món
Decisions preses l Sistema de visualització basat en el portal rendering: – Organització de la geometria en habitacions l Impera la rapidesa del tractament de col·lisions en front de la precisió: – Personatge aproximat amb una esfera l Pocs objectes en un mateix lloc: – Caixa alineada al món com a bounding de moviment
Algoritme de tractament de col·lisions 1 Joc() 2 { 3 per ( t = t 0 fins a en increments de trep ) { 4 obté dades dels dispositius d’entrada 5 actualitza el comportament del personatge per t 6 velocitat = velocitat del personatge per t 7 tracta( personatge, velocitat ) 8 tracta( personatge, gravetat ) 9 representa el món per t 10 } 11 }
Algoritme de tractament de col·lisions 12 tracta( objecte, velocitat ) 13 { 14 fes { 15 info. Col = detecta( objecte, velocitat ) 16 actualitza la posició de objecte segons info. Col 17 si ( info. Col conté col·lisions ) 18 velocitat = respon( info. Col, objecte, velocitat ) 19 } mentre ( info. Col contingui col·lisions ) 20 }
Algoritme de detecció 1 detecta( objecte, velocitat ) 2 { 3 bound. Obj = bounding de objecte 4 bound. Mov = genera_bound_mov( bound. Obj, velocitat ) 5 pols. Pot = obté_pols_potencials( bound. Obj, bound. Mov ) 6 cols = troba_col·lisions( bound. Obj, velocitat, pols. Pot ) 7 info. Col = primera_col·lisió( cols ) 8 retorna ( info. Col ) 9 }
Generació del bounding de moviment l 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 1 genera_bound_mov( esfera, velocitat ) 2 { 3 origen = posició de esfera 4 destí = origen + velocitat 5 radi = radi de esfera 6 caixa. xmín = mínim( origen. x, destí. x ) – radi 7 caixa. xmàx = màxim( origen. x, destí. x ) + radi 8 caixa. ymín = mínim( origen. y, destí. y ) – radi 9 caixa. ymàx = màxim( origen. y, destí. y ) + radi 10 caixa. zmín = mínim( origen. z, destí. z ) – radi 11 caixa. zmàx = màxim( origen. z, destí. z ) + radi 12 }
Obtenció dels polígons potencials l S’aprofita l’organització en habitacions: – Només es comproven interseccions amb els polígons de les habitacions per on passa el personatge l Bounding de moviment: – Es descarten ràpidament la majoria dels polígons
Obtenció dels polígons potencials Quan un objecte canvia d’habitació forçosament ha de travessar un portal l Llavors el portal intersecciona amb el bounding de moviment l
Obtenció dels polígons potencials Si els boundings de moviment no interseccionen ja es pot descartar el polígon l Un posterior clipping pot ajudar a descartar més polígons l
Obtenció dels polígons potencials 1 obté_pols_potencials( esfera, bound. Mov ) 2 { 3 habs. Ocupades = habitacions que interseccionen amb bound. Mov 4 per ( cada habitació Hi de habs. Ocupades ) { 5 per ( cada polígon Pj dels polígons que conté Hi ) { 6 bound. Pol = bounding de Pj 7 si ( bound. Mov i bound. Pol interseccionen ) 8 si ( bound. Mov i Pj interserccionen ) ) 9 afegeix Pj a pols. Pot 10 } 11 } 12 retorna ( pols. Pot ) 13 }
Càlcul de les col·lisions l L’esfera només pot col·lisionar amb un polígon si hi fa cap l Els polígons només consten de cara frontal l Se suposa un món ben construït l Sempre hi ha un sol punt de contacte entre una esfera i un polígon
Cà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 l En un món ben construït un objecte mai s’aproparà a un polígon per darrera l
Càlcul de les col·lisions Es mou el pla del polígon fins a tocar l’esfera l Es troba el punt de col·lisió de l’esfera en la seva posició inicial (pt. Cole) l
Càlcul de les col·lisions Des de pt. Cole es traça un raig paral·lel al vector de velocitat l Es troba el punt d’intersecció amb el pla del polígon (pt. Colp) l
Càlcul de les col·lisions El punt pt. Colp pot estar fora del polígon l Es troba el punt del polígon més proper al pt. Colp (nou pt. Colp) l
Càlcul de les col·lisions Des del nou pt. Colp es traça un raig paral·lel i de sentit invers al vector de velocitat. l El primer punt d’intersecció amb l’esfera serà el nou pt. Cole l Si el raig no intersecciona tampoc es produeix col·lisió l
Càlcul de les col·lisions 1 troba_col·lisions( esfera, velocitat, polígons ) 2 { 3 origen = posició de l’esfera 4 velu = velocitat normalitzada 5 per ( cada polígon Pi de polígons ) { 6 norm = normal de Pi 7 si ( norm * velu < 0 ) { 8 pt. Cole = punt d’intersecció del raig definit per origen i -norm amb esfera 9 pt. Colp = punt d’intersecció del raig definit per pt. Cole i velu amb el pla que defineix Pi
Càlcul de les col·lisions 10 11 12 13 14 15 si ( pt. Colp no està dins Pi ) { pt. Colp = punt de Pi més proper a pt. Colp pt. Cole = primer punt d’intersecció del raig definit per pt. Colp i -velu amb l’esfera si ( no existeix pt. Cole ) continuar amb la següent iteració }
Càlcul de les col·lisions 16 dist. Col = mòdul de pt. Colp – pt. Cole 17 si ( dist. Col <= mòdul de velocitat ) 18 afegeix dist. Col i Pi a col·lisions 19 } 20 } 21 retorna ( col·lisions ) 22 }
Elecció de la col·lisió més immediata l Després de la primera col·lisió es varia el vector de velocitat l Només és vàlida la primera col·lisió
Elecció de la col·lisió més immediata 1 primera_col·lisió( col·lisions ) 2 { 3 si ( col·lisions no conté cap col·lisió ) 4 retorna ( ) 5 distmín = 6 per ( cada col·lisió Ci de col·lisions ) { 7 dist = distància de col·lisió de Ci 8 si ( dist < distmín ) { 9 distmín = dist 10 pol = polígon de Ci 11 } 12 }
Elecció de la col·lisió més immediata 13 afegeix distmín i pol a info. Col 14 retorna ( info. Col ) 15 }
Algoritme de reacció l 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 l 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ó El pla de col·lisió és el pla tangent a l’esfera en el punt de col·lisió l Perquè l’esfera es mogui el mòdul de la projecció de la velocitat ha de ser major que el factor de fricció l
Algoritme de reacció 1 respon( info. Col, objecte, velocitat ) 2 { 3 esfera = bounding de objecte 4 pol = polígon que conté info. Col 5 vel. Excedent = tros del vector velocitat després del punt de col·lisió 6 pla. Col = pla tangent a esfera en el punt de col·lisió 7 lliscament = projecció de vel. Excedent sobre pla. Col 8 lliscament = lliscament escurçat pel factor de fricció de pol 9 retorna ( lliscament ) 10 }
Adreces d’interès
Adreces d’interès l Codi de tests d’intersecció: – http: //www. magic-software. com/Source/ Intersection 3 D/Intersection 3 D. html l Generació i utilització d’arbres d’esferes: – http: //www. cs. wustl. edu/~pmh/research. html l Articles sobre la detecció de col·lisions – http: //www. stanford. edu/~jgao/collision-detection. html l Articles sobre el motor Open. Door: – http: //www. macedoniamagazine. com PER MÉS INFORMACIÓ. . . is 04732@salleurl. edu (Carles Ros Martínez – CITe. M)
- Slides: 70