Algoritmo per il calcolo di un percorso bullet verso un target con max. 2 rimbalzi

20

Ci scusiamo per il titolo scarso, ma non avevo un modo migliore per esprimerlo ...

Quindi c'è questo fantastico gioco di Nintendo (sì!) su Wii chiamato WiiPlay . Ci sono 9 minigiochi e il mio preferito è chiamato Serbatoi! . Si tratta di distruggere i carri armati nemici della COM senza farsi distruggere. Ecco uno screenshot di un livello:

Unmodoperdistruggereicarriarmatièsparandoproiettili.C'èquestocarroarmatonemicoverdelimechesparaproiettiliadaltavelocitàcherimbalzano(contromurieblocchi)duevolte.Puoivederecomeilcarroarmatodelgiocatorepuòesseredistruttoistantaneamenteserimanenelpuntoincuisitrovaora,poichéquelserbatoiodicalcenelcentropuòsparareunproiettilechesegueilpercorsoverdechehodisegnatosull'immagine.

Comeprogrammatoredilettantemisonochiestocomepuòilcalcedeterminareladirezioneincuidovrebbespararepercolpireilserbatoiodelgiocatore.

Cihopensatoanch'iomanonhotrovatonessunalgoritmopossibile.Spiegheròlemieconclusioninelcasoincuiispirinoqualcuno.Persemplicità,durantelamiaspiegazione,presumochewallsiaqualsiasisuperficiecontrocuiunproiettilepuòrimbalzare.Unrettangoloisolatodiblocchiformaquindiquattropareti.

Hoconclusochei2puntiincuiilproiettilerimbalzasitrovanosempresuunlatodiunparallelogrammaodiventanoverticioppostidiunparallelogramma.Iltanknemicochesparaeiltankdelgiocatorechemiranonsononecessariamenteglialtri2verticimasitrovanosicuramentesullelineechesiallineanosuunodeiquattrolatidelparallelogramma.Eccoun'illustrazionedei4possibilimodiincuiunparallelogrammapuòessereformato:

HOR-VER significa che il proiettile colpisce prima un muro orizzontale, poi colpisce un muro verticale.

E poi sono bloccato. Ho pensato di muovere attorno a una linea che collega il serbatoio nemico e il serbatoio del giocatore intorno alla mappa per vedere se forma un parallelogramma con due colpi con qualsiasi muro, ma questo non funziona sempre perché il serbatoio nemico e il serbatoio del giocatore non sono necessariamente coincidente con i vertici del parallelogramma.

Inoltre, non sono sicuro del flusso generale dell'algoritmo. L'algoritmo prende una delle seguenti 2 strutture, o forse ho torto con entrambe queste cose?

  • Continua a cercare i possibili percorsi e segna sempre uno come migliore (può essere il più breve, il più oscuro, il più ineluttabile, o una valutazione combinata e ponderata basata su più criteri) e dimentica il resto. Quello che rimane dopo tutto il calcolo è il migliore da prendere.
  • Determina in primo luogo tutti i muri prima raggiungibili con il proiettile (il proiettile non deve rimbalzare contro nessun altro muro per raggiungere ognuna di queste mura), quindi determinare tutti gli intervalli raggiungibili su ciascuna di queste mura (a volte è impossibile raggiungere un punto lontano su un muro senza rimbalzo se un altro muro si trova vicino a te), quindi determinare nuovamente tutte le pareti raggiungibili con un rimbalzo e tutte le distanze raggiungibili su queste pareti. Questi 4 processi possono essere eseguiti in modo simile al ray-tracing. Durante ogni processo, se il serbatoio del giocatore viene colpito da qualsiasi raggio, individua il percorso del proiettile secondo quel raggio.

Secondo me, questo algoritmo è difficile da capire perché:

  • un proiettile può essere sparato in qualsiasi direzione; e
  • ci sono infiniti punti su qualsiasi parete, come in matematica, dove ci sono infiniti punti su una linea.

Ma la gente Nintendo l'ha fatto comunque, quindi ... qualcuno con un'idea?

    
posta Greek Fellows 23.07.2015 - 19:53
fonte

5 risposte

8

Data una linea di vista diretta, il problema è ovviamente banale. Tuttavia, abbiamo a che fare con la riflessione. Individuare correttamente quali parti della scena possono essere viste è una sfida quando si implementa la riflessione come parte di un ray tracer, poiché questo potrebbe perdere alcune aperture. Anche una "ricerca binaria" tra due angoli promettenti non è praticabile: a causa delle riflessioni, lo spazio effettivamente visibile non è continuo, quindi l'euristico "se è a destra di A e a sinistra di B, ci deve essere un bersaglio la soluzione tra A e B "è non consentita e mancheranno le soluzioni" creative ". Vorrei invece consigliare l'implementazione del riflesso eseguendo nuovamente il tracciante da una posizione virtuale, ovvero la posizione in cui il nostro sembra essere quando viene visto nello specchio:

target |obstacle
   X   |
    \  |  X real position
     \   /
      \ /
   ----------- mirror surface
        \
         \
          X virtual position

Il vantaggio è che il raggio specchiato ora è una linea retta che origina dalla posizione virtuale. Ho cercato di illustrare la tecnica nello schizzo seguente:

Xsegnalaposizioneditiro,(X)ilbersaglio.Leareecoloratesonovisibili.

  1. Lineadivistadiretta:ilbersagliononèvisibile.Tuttavia,possiamocolpiresuperfici(1)e(2).

  2. Unariflessione.Cisonodueposizionidifuocovirtualiall'internodegliostacoli.LaposizioneinferiorehaunaLOSdirettasulbersaglio,quindiabbiamolanostraprimasoluzionedifuoco:ilpercorsodelproiettileèlapartedelraggiotrailbersaglioelasuperficiedellospecchioinferiore,etrailpuntodicollisionedellospecchiodiraggioelaposizioneditiroreale.

  3. Dueriflessioni:laposizionevirtualesuperioredellaprimariflessionepuòvederepartedell'ostacoloinferioreattraversolasuasuperficieaspecchio.Poichésonoconsentitedueriflessioni,possiamorispecchiarequestaposizionenell'ostacoloinferiore.Leposizionisonocontrassegnatecome(I)laposizionereale,(II)laposizionevirtualedallaprimariflessionee(III)laposizionevirtualedallasecondariflessione.

    Da(III),abbiamounaLOSdirettaversoiltarget(X),quindiabbiamotrovatoun'altrasoluzionediattivazione.IlpercorsodelproiettileèlungolalineaX-IIIfinoalsecondopuntodicollisionedellospecchio,quindilungolalineaIII-IItraipuntidicollisionedellospecchio,einfinelungolalineaII-IdalprimopuntodicollisionedellospecchioallaposizionerealeI.

    Inrealtà,laposizionevirtualeinferioredellaprimariflessionepotrebbeancheessereriflessanell'ostacolosuperiore,maciònonporteràasoluzionidirette.

Unavoltacheèpossibilecapirequalipartidegliostacolisonovisibili(equindipossonoessereutilizzateperriflettereilproiettile),l'implementazionedelmirroringtramiteunaricercaapprofonditasembrerebbesemplice.Pertrovaresuperficispeculariadatte,letecnichedescrittein Nicky Case Sight & Light potrebbe essere usato: piuttosto che provare i 360 vettori - che potrebbero perdere le aperture, ed è anche uno spreco - lanciamo raggi solo ai bordi degli ostacoli.

    
risposta data 23.07.2015 - 23:15
fonte
6

Estendere l'idea di Karl Bielefeldt per le riflessioni su 2 pareti:

A e B sono dati (i carri armati). Per prima cosa devi elencare tutti i muri che A può vedere e un elenco di tutti i muri che B può vedere. Quindi fai delle coppie in cui il primo muro è nella lista dei pugno e il secondo muro è diverso dal primo muro e si trova nella seconda lista. Devi fare questo test per tutte le possibili coppie di muri (a meno che non trovi un modo per eliminare i candidati). Una volta trovato R e S per una data coppia di muri, controlli

1) se A ha una visione diretta di R

2) se R appartiene al muro1 (il muro è solo un segmento, non l'intera linea)

3) se R ha accesso diretto a S

4) se S appartiene a wall2 (il muro è solo un segmento, non l'intera riga)

5) se S ha accesso diretto a B.

Per trovare R e S : poiché sai wall1 puoi determinare l'equazione di linea tangente a wall1, poiché R appartiene alla linea tangente alla parete 1, hai una relazione tra le 2 coordinate di R (finire con un grado di libertà per R) Analogamente a S (hai una relazione tra le coordinate S poiché questo punto appartiene alla linea tanget a wall2). Quindi ora hai 2 gradi di libertà e devi avere 2 equazioni indipendenti aggiuntive per determinare una soluzione. Un'equazione è:

(AA')/(RA')=(SS')/(RS')

l'altra equazione è:

(BB')/(SB')=(RR')/(SR')

nota che nelle equazioni precedenti A, A ', B, B' sono note o possono essere calcolate direttamente. R 'e S' sono funzione delle coordinate di R e S e delle equazioni del muro. Non ho terminato la matematica, quindi non so come saranno le equazioni.

    
risposta data 23.07.2015 - 23:50
fonte
3

Puoi approfittare del fatto che l'angolo che lascia il ricochet deve essere uguale all'angolo che lo inserisce. Per una data parete orizzontale con coordinata y c e due serbatoi fissi con coordinate (a,b) e (d,e) , c'è solo un angolo che soddisfa l'equazione sottostante.

Basta risolvere x per ottenere la distanza lungo il muro a cui devi mirare. Due pareti funziona allo stesso modo. Hai solo due equazioni e due incognite.

    
risposta data 23.07.2015 - 21:11
fonte
1

Hai dei diagrammi nitidi che mostrano come dirigere i raggi, quindi lascerò i dettagli su come determinare una coppia di superfici riflettenti.

Chiamiamo la superficie che deve colpire la prima superficie A , e la seconda, B .

Prova a colpire i bordi (visibili) di B sparando a A . In altre parole, determina i punti in cui si vedrebbero i riflessi delle estremità di B se si guarda allo specchio A . Questo deve essere facile da fare, hai solo un punto di riflessione da gestire.

Ora conosci due raggi che colpiscono i bordi (visibili) di B . Chiamiamoli edge rays Calcola le loro riflessioni B; devono andare da qualche parte oltre il tuo obiettivo. È possibile determinare se il bersaglio si trova tra loro , cioè a sinistra di un raggio ma a destra dell'altro o viceversa. Questo è banale da fare usando la equazione generale della retta .

Se il bersaglio non è tra i raggi del bordo, ovviamente non puoi colpirlo con nessun raggio intermedio; scegli un altro paio di superfici.

Se il target è tra i raggi, cerca il raggio di attacco intermedio usando la ricerca binaria. Hai due angoli di fuoco corrispondenti ai raggi del bordo, il tuo angolo di colpo si trova tra di loro. A condizione che il diametro angolare del tuo bersaglio, come visto dal punto di tiro, non sia eccessivamente piccolo, avrai bisogno di poche iterazioni finché non trovi la direzione di un raggio che colpisce.

Ecco un'immagine:

Qui i due raggi del bordo sono mostrati in rosso e blu. A quanto pare puoi trovare un raggio emesso ad un angolo più piccolo di quello rosso ma maggiore di quello rosso in modo che quel raggio colpisca il bersaglio verde.

    
risposta data 23.07.2015 - 22:16
fonte
-3

Prima di tutto, ricorda in classe di fisica quando hai parlato della rifrazione della luce? Bene, il tuo problema può essere risolto usando quei principi. L'angolo di incidenza è uguale all'angolo di riflessione. quindi il carro armato nemico deve attraversare ogni angolo possibile per il primo rimbalzo in modo che il secondo rimbalzo possa colpire il giocatore. Continua anche con l'idea del ray tracing. Ora, questo diventa complicato quando il giocatore è in movimento, ma dovrebbe essere una buona idea per iniziare a utilizzare un algoritmo

    
risposta data 23.07.2015 - 20:35
fonte

Leggi altre domande sui tag