Evitamento delle collisioni 3D: ricerca del vettore di velocità aggiornato (al di fuori dei coni di "velocità di collisione")


8

Sto cercando di comprendere e attuare il meccanismo di un sistema di prevenzione delle collisioni (comportamento dello sterzo) completamente in 3D per il movimento di volo (sei gradi di libertà), concentrandomi attualmente sull'elusione di ostacoli statici (tutti a forma di sfera).

Tuttavia, non capisco come capire il nuovo vettore di velocità dell'agente in movimento. La figura seguente illustra la scena. L'agente in movimento (verde) deve guidare tre oggetti statici (blu). La linea rossa rappresenta il vettore di velocità iniziale iniziale.

inserisci qui la descrizione dell'immagine

Si noti che ci sono anche tre coni bianchi / semitrasparenti. Questi rappresentano i "vettori di velocità proibiti" riguardanti ogni ostacolo. Significa, l'insieme dei vettori di velocità che, se usato come nuovo vettore di vettori dell'agente, farebbe collidere l'agente con uno o più ostacoli (si noti inoltre che il raggio di ciascun cono è uguale al raggio dell'ostacolo dato più il raggio dell'agente, in modo da consentire un offset per il giocatore di muoversi).

Al fine di scoprire il nuovo vettore in anticipo dell'agente in movimento in tale ambiente 3D, considerando i tre ostacoli, un approccio ingenuo sarebbe semplicemente quello di portare in 3D la classica soluzione spiegata in questo articolo spesso citato ed esemplificata dalla seguente immagine 2D:

inserisci qui la descrizione dell'immagine

Lì, una nuova velocità (freccia arancione) viene semplicemente calcolata normalizzando la distanza minima (freccia nera) tra la velocità originale e il centro dell'ostacolo e quindi moltiplicando tale normale per la somma tra il raggio dell'ostacolo e il raggio del agente in movimento. Quindi, una media delle nuove velocità calcolate per ciascuno degli ostacoli darebbe la velocità finale totale.

In molti casi, è sufficiente. Tuttavia, dai un'occhiata ai casi seguenti (esemplificati in 2D per facilitare la visualizzazione):

inserisci qui la descrizione dell'immagine

In tutti loro, l'approccio ingenuo si tradurrà in una collisione. In aeb, la nuova velocità finale coinciderà con la velocità originale (freccia rossa) e l'agente in movimento si sposterà in avanti nonostante sia parzialmente o completamente bloccato. In c) ed), la nuova velocità (freccia arancione) comporterà comunque la stessa conseguenza.

Quindi, la mia domanda è: qual è il modo più efficiente dal punto di vista computazionale per scoprire il nuovo vettore in anticipo dell'agente in movimento in tale ambiente 3D, considerando i tre ostacoli, in modo da evitare la collisione? O, in altre parole, il nuovo vettore che anticipa che:

1) non è all'interno di nessuno dei coni;

2) è il più vicino possibile al vettore originale in avanti (linea rossa nell'immagine).

PS: Preferibilmente, non sto cercando una biblioteca, sto cercando di imparare come farlo.

Risposte:


1

Non credo che esista un modo efficace per risolvere esattamente il problema, ma ecco come proverei ad affrontarlo.

Innanzitutto, utilizzerei i volumi di delimitazione attorno a ciascun oggetto, anziché agli oggetti stessi. Tuttavia, ogni oggetto può essere approssimato dall'unione di più di un volume limite.

La soluzione più semplice sarebbe quella di calcolare un singolo volume di delimitazione che contiene tutti gli oggetti necessari per evitare e calcolare il cono da quel volume.

Questo potrebbe non essere abbastanza buono se gli oggetti non sono relativamente vicini tra loro. Potresti quindi voler fare un po 'di cluster in modo che due oggetti appartengano allo stesso cluster se non è possibile, o almeno non banale passare tra di loro. Calcola il gruppo di oggetti considerando i loro volumi di delimitazione più le dimensioni del volume di delimitazione del giocatore più un margine extra. Potresti usare qualcosa del genere:

http://lab.polygonal.de/?p=120

Dopo aver ottenuto i cluster, trova quello più vicino e calcola il cono per evitare di scontrarsi con esso. A causa del modo in cui i cluster sono stati creati, se sterzi quanto basta per evitare di colpire un cluster, non ne colpirai un altro.

Inoltre, puoi creare una struttura ricorsiva durante il calcolo dei cluster che ti aiuterà a trovare il cluster più vicino.

Ci sono alcune cose con cui puoi giocare. Ad esempio, invece di selezionare il cluster più vicino, selezionare i due cluster più vicini e calcolare un singolo cono che li evita entrambi. Inoltre, è possibile provare altri volumi di delimitazione diversi dalle sfere.


0

Ci sono due modi per affrontare questa domanda che posso vedere. In primo luogo, se vuoi semplicemente trovare un modo di guidare, devi solo implementare il pathfinding ( lo trovo abbastanza utile ). Questa sarebbe la fine (ed è la risposta pratica corretta a questa domanda), ma penso che tu sia più curioso di una soluzione matematica al tuo problema.

Per risolverlo, esaminiamo un problema equivalente. Prendi una porzione 2D della tua scena "avanti" rispetto al tuo pilota di un piano normale al vettore originale. Ciò che otterrai è un punto che rappresenta il tuo vettore originale e una serie di ellissi che sono le proiezioni 2D dei coni di occlusione. Ora quello che vuoi fare è trovare il punto più vicino al punto originale (chiamiamolo P) che si trova all'esterno di ellissi non sovrapposte. Si scopre che questo è un problema piuttosto difficile da risolvere. Ci sono 3 passaggi:

  • Scopri i punti di intersezione di tutte le ellissi
  • Trova eventuali buchi nell'unione di tutte le ellissi
  • Scopri il punto più vicino a Psu tutte le ellissi all'esterno dell'unione (che può essere all'interno di un buco)

Va bene, tutto ciò richiede moltiplicatori e controllo dell'angolo di Lagrange e alcune altre cose davvero complicate da risolvere. Diamo un'occhiata ad altre opzioni. Se invece trasformiamo il nostro problema in spazio angolare, vediamo che ciò che vogliamo effettivamente fare è trovare la distanza minima tra un punto e più cerchi proiettati sulla superficie di una sfera. Nella geometria differenziale, questa è spesso chiamata a 2 sfere ed è utile qui. Quindi, prima di tutto, dobbiamo trovare la distanza tra due punti sulla superficie della sfera, che useremo per trovare la metrica a 2 sfere. Fortunatamente, è abbastanza facile:, ds^2 = (R^2)*(dth^2) + (R^2)*(sin(th)^2)*(dph^2)dove manteniamo Rcostante il raggio della nostra 2 sfera proiettata nello spazio 3. Venendo dalla fisica, prendo thper essere l'angolo dal positivo ze phper essere l'angolo dal positivo xconsessendo la distanza.

Cosa compie questo? Ci consente di rimuovere l'uso dei moltiplicatori di Lagrange per minimizzare la distanza e ci consente di lavorare in coordinate "native" (poiché definiamo i nostri coni in termini di angolo di occlusione). Quindi ora dobbiamo trovare il raggio delle nostre proiezioni a cono. Prendiamo un cono per ora e chiamiamo l'angolo che lo definisce a. Il raggio della proiezione è quindi semplicemente R*a. È stato abbastanza facile: quale altra quantità dobbiamo sapere sui coni? Dobbiamo conoscere il centro della proiezione, che è definito dal vettore di look dell'attore. Per prima cosa convertiamo x, ye zin coordinate sferiche dove sappiamo di essere a distanza R, e risolviamo per the ph, cosa che possiamo fare semplicemente inserendo le nostre formule di conversione:th = acos(z/R)e ph = atan2(y/x)(usare atan2qui per spiegare le ambiguità del quadrante di arctangent). Il processo è lo stesso per trovare la posizione del vettore originale in coordinate sferiche.

Quindi il problema è stato semplificato. Tuttavia, il problema è ancora abbastanza difficile da risolvere, ma ora devi solo preoccuparti di cerchi e punti invece di ellissi e punti o angoli e vettori. Il resto del processo è piuttosto procedurale. Devi essenzialmente trovare un'area di delimitazione formata dalle tue cerchie, per la quale esistono più soluzioni. Presenterò un metodo che potrebbe non essere il migliore, ma funzionerà.

Prima confronterei la somma dei raggi di tutte le coppie di cerchi e la distanza tra i centri, quindi se la somma è maggiore della distanza centrale, li metterei uguali e risolverei per thephper trovare le intersezioni. Sai che ogni coppia di intersezioni descrive "angoli proibiti" per il cerchio in questione, che memorizzeresti come una matrice di angoli di punto di intersezione (dal centro del cerchio) per ogni cerchio che interseca questo - importante che devi " unisci "tutti gli intervalli che si sovrappongono quando li aggiungi all'array affinché la parte successiva funzioni correttamente. Quindi trovi il punto più vicino sul bordo del cerchio al punto originale (che è semplice come tracciare una linea attraverso il punto centrale del cerchio e il punto originale, quindi trovare la posizione sulla linea nel raggio del cerchio lontano dal centro). Quindi passare in rassegna l'array memorizzato e verificare se tale angolo è compreso nell'intervallo di ciascun angolo proibito. In tal caso, selezionare il bordo più vicino. Questo è il punto più vicino all'esterno descritto all'interno di questo cerchio. Ripeti il ​​processo per tutti i cerchi (è possibile eseguire alcune ottimizzazioni nel processo di selezione - non è necessario calcolarlo per ogni cerchio). Ora confronta tutte le distanze più brevi, trova la più piccola e questa è la tua risposta, descritta negli angolithe ph. Ricordare che la distanza è descritta con la metrica a 2 sfere durante l'esecuzione di questo calcolo. Dal momento che non ti interessa la sfera in cui tutto è acceso, solo gli angoli, puoi impostare R=1e fare questi calcoli sulla sfera dell'unità.

Questo è il modo più semplice in cui potrei pensare di farlo. Non sono sicuro che sia il modo più semplice in assoluto, ma funzionerebbe abbastanza bene. Praticamente per un gioco, tuttavia, vuoi solo implementare il pathfinding.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.