Orario: 22-05-2013, 1:55 Benvenuto ospite! (Log inRegistrati)


Rispondi 
Collisioni rectangle e rilevazione faccia
Autore Messaggio
Garu
Junior Member

Messaggi: 7
Registrato: Apr 2012
Offline Offline
#1 Collisioni rectangle e rilevazione faccia
0
Salve a tutti, sto creando uno sparatutto utilizzando XNA 3.1, mi sono trovato davanti ad un bel problema:

In pratica io genero proceduralmente degli edifici che visti dall'alto saranno rettangoli o quadrati, al momento dell'intersezione tra un nemico (zombie) e un muro devo rilevare la faccia di collisione ( semplice tra rettangoli) dopo aver rilevato la faccia spostare il nemico nella direzione opposta in base alla sua velocità.

Ho provato inizialmente a fare così:

Citazione: Private Sub Sposta_Zombie(ByVal Muro As Muro, ByVal Zombie As Zombie, ByVal Spostamento As Integer)

If Zombie.Rectangle.Right > Muro.Rectangle.Left And Zombie.Rectangle.Right < Muro.Rectangle.Right And Zombie.Rectangle.Top > Muro.Rectangle.Top Then

Zombie.Posizione += New Vector2(-Spostamento, 0)

End Sub

Ma poi ho trovato difficoltà nel rilevare le altre facce e mi sono bloccato, grazie in anticipo per le risposte Inchino
(Questo messaggio è stato modificato l'ultima volta il: 07-08-2012 20:48 da Garu.)
07-08-2012 20:40
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
fatto
T_T

Messaggi: 991
Registrato: May 2009
Offline Offline
#2 RE: Collisioni rectangle e rilevazione faccia
0
perchè usi xna 3.1? Look
edit:cazzata domani rispondo meglio và Asd

Marco Fattorel ╯°□°)╯ ︵ ┻━┻
(Questo messaggio è stato modificato l'ultima volta il: 07-08-2012 22:24 da fatto.)
07-08-2012 22:23
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Garu
Junior Member

Messaggi: 7
Registrato: Apr 2012
Offline Offline
#3 RE: Collisioni rectangle e rilevazione faccia
0
(07-08-2012 22:23)fatto ha scritto:  perchè usi xna 3.1? Look
edit:cazzata domani rispondo meglio và Asd

Appena avrò finito il progetto giuro che lo convertirò in XNA 4 è che fino ad ora ho utilizzato questa versione ed essendo il progetto già abbastanza avanti ho deciso di convertirlo una volta arrivato ad un certo punto.

Attenderò con ansia la tua risposta Fermofumo
07-08-2012 22:58
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Gian
Strange Tech Owner

Messaggi: 1,018
Registrato: Jul 2012
Offline Offline
#4 RE: Collisioni rectangle e rilevazione faccia
0
La gente di solito fa un sacco di confusione tra collisione e sovrapposizione ("overlap"). Zizi
Overlap vuol dire che in un certo fotogramma due rettangoli hanno una parte della loro area in comune, cioè "uno sta sopra all'altro"; sebbene questo non sia un modo affidabile per rilevare le collisioni, molti lo usano in virtù della sua semplicità.
Rilevare una collisione è molto più complicato anche nei casi più semplici (es. cerchio che collide con una retta) e vuol dire considerare un'oggetto con tutta la sua fisica, e controllare che il vettore spostamento non intersechi mai un segmento impostato come limite. La collision response è un tema ancora più complesso.
Cercare overlaps frame per frame per approssimare la collision detection vuol dire in pratica ignorare tutto quello che accade tra un frame e l'altro: se ad esempio ci fossero degli oggetti molto piccoli e la velocità del tuo personaggio fosse molto alta (o il framerate molto basso) il tuo personaggio potrebbe passare attraverso tali oggetti perchè si troverebbea passare da una parte all'altra dell'oggetto senza mai essersi trovato sovrapposto.
Una buona soluzione (per quanto complessa) è:
1) per ogni spostamento del tuo personaggio principale considerare il segmento di spostamento [A, B] (posizione precedente - posizione successiva); il vettore di spostamento s = B- A
2) se il segmento overlappa uno dei rettangoli (facile), cercare l'intersezione più vicina P tra il segmento e il perimetro del rettangolo
3) calcolare il versore dello spostamento v = s / lunghezza(s)
4) calcolare il versore della risposta vr che è -v specchiato nella retta perpendicolare al bordo di collisione (facile se i rettangoli sono sempre axis aligned)
4) calcolare il vettore di risposta alla collisione r = (distanza(P,B) ) * vr * k (in pratica tutta la distanza che avresti percorso in più se non ci fosse stato un ostacolo in mezzo, nella direzione del rimbalzo, per una costante)
5) posizionare il personaggio in A + r

Questo da al personaggio un comportamento "rimbalzoso" in cui l'ammontare del rimbalzo dipende dalla costante scalare k. E' comunque una semplificazione (il personaggio è approssimato ad un punto e al passo 5 in realtà bisognerebbe iterare per controllare che il rimbalzo non ti abbia spinto in un'altra collisione... consiglio di tenere k piccolo)
Per approfondire il tema delle collisioni, c'è anche un meraviglioso articolo di metanet http://www.metanetsoftware.com/technique/tutorialA.html sul teorema di separazione degli assi.
Sorry se il mio post sembra scritto in aramaico ma le collisioni sono toste, ed io sono sveglio dalle 6:00 Fermofumo

Giancarlo Todone
[Immagine: smallStar.png] www.stareat.it
Google+ / Twitter / LinkedIn
08-08-2012 8:39
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Garu
Junior Member

Messaggi: 7
Registrato: Apr 2012
Offline Offline
#5 RE: Collisioni rectangle e rilevazione faccia
0
(08-08-2012 8:39)jean80it ha scritto:  La gente di solito fa un sacco di confusione tra collisione e sovrapposizione ("overlap"). Zizi
Overlap vuol dire che in un certo fotogramma due rettangoli hanno una parte della loro area in comune, cioè "uno sta sopra all'altro"; sebbene questo non sia un modo affidabile per rilevare le collisioni, molti lo usano in virtù della sua semplicità.
Rilevare una collisione è molto più complicato anche nei casi più semplici (es. cerchio che collide con una retta) e vuol dire considerare un'oggetto con tutta la sua fisica, e controllare che il vettore spostamento non intersechi mai un segmento impostato come limite. La collision response è un tema ancora più complesso.
Cercare overlaps frame per frame per approssimare la collision detection vuol dire in pratica ignorare tutto quello che accade tra un frame e l'altro: se ad esempio ci fossero degli oggetti molto piccoli e la velocità del tuo personaggio fosse molto alta (o il framerate molto basso) il tuo personaggio potrebbe passare attraverso tali oggetti perchè si troverebbea passare da una parte all'altra dell'oggetto senza mai essersi trovato sovrapposto.
Una buona soluzione (per quanto complessa) è:
1) per ogni spostamento del tuo personaggio principale considerare il segmento di spostamento [A, B] (posizione precedente - posizione successiva); il vettore di spostamento s = B- A
2) se il segmento overlappa uno dei rettangoli (facile), cercare l'intersezione più vicina P tra il segmento e il perimetro del rettangolo
3) calcolare il versore dello spostamento v = s / lunghezza(s)
4) calcolare il versore della risposta vr che è -v specchiato nella retta perpendicolare al bordo di collisione (facile se i rettangoli sono sempre axis aligned)
4) calcolare il vettore di risposta alla collisione r = (distanza(P,B) ) * vr * k (in pratica tutta la distanza che avresti percorso in più se non ci fosse stato un ostacolo in mezzo, nella direzione del rimbalzo, per una costante)
5) posizionare il personaggio in A + r

Questo da al personaggio un comportamento "rimbalzoso" in cui l'ammontare del rimbalzo dipende dalla costante scalare k. E' comunque una semplificazione (il personaggio è approssimato ad un punto e al passo 5 in realtà bisognerebbe iterare per controllare che il rimbalzo non ti abbia spinto in un'altra collisione... consiglio di tenere k piccolo)
Per approfondire il tema delle collisioni, c'è anche un meraviglioso articolo di metanet http://www.metanetsoftware.com/technique/tutorialA.html sul teorema di separazione degli assi.
Sorry se il mio post sembra scritto in aramaico ma le collisioni sono toste, ed io sono sveglio dalle 6:00 Fermofumo

Grazie per la risposta, a leggerla bene non era poi in aramaico ma io avevo bisogno di qualcosa di più semplice così mi sono scritto una funzione che, in caso di intersezione calcola la direzione opposta rispetto a quella dell'intersezione,calcolando la direzione dell'oggetto e spostandolo per il negativo della direzione, così sembra funzionare abbastanza bene.
Spero di non aver detto qualche stro** Inchino
(Questo messaggio è stato modificato l'ultima volta il: 09-08-2012 17:34 da Garu.)
09-08-2012 17:27
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Gian
Strange Tech Owner

Messaggi: 1,018
Registrato: Jul 2012
Offline Offline
#6 RE: Collisioni rectangle e rilevazione faccia
0
No guarda, fai benissimo a semplificare se il tuo modello non richiede di più.
Io potendo tornare indietro non so se mi impelagherei più in certi calcoli...Fermofumo
Ti ho buttato li qualcosa in più che non si sa mai possa dare comunque uno spunto... Smile

Giancarlo Todone
[Immagine: smallStar.png] www.stareat.it
Google+ / Twitter / LinkedIn
09-08-2012 21:09
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Rispondi 


Vai al forum: