Teorema degli assi di separazione con più poligoni?


9

Sto tentando di implementare il teorema degli assi di separazione in C #. Ho una funzione che può calcolare il vettore minimo di traduzione tra due poligoni. Tuttavia, non riesco a creare una funzione che calcola il vettore di traduzione minimo tra un poligono e più altri poligoni. Onestamente, ci sto lavorando da mesi e non sono più vicino a una soluzione e non sono stato in grado di trovare una soluzione online. Ci sono sempre alcuni casi limite che non restituiscono il risultato corretto, portando a bug ad alta priorità nel mio gioco.

Ecco alcuni casi limite comuni che non funzionano correttamente:

casi limite

Esiste una soluzione ben nota per questo problema? Tutto quello che riesco a trovare è la gente che dice "esegui il SAT su ciascun poligono", ma raramente produce il vettore minimo di traduzione.

Qualsiasi aiuto sarebbe molto apprezzato.


Un'idea, che in realtà non ho mai provato, è che alcuni assi di separazione - quelli che ti sposterrebbero lateralmente in un poligono adiacente - potrebbero essere contrassegnati per non essere mai considerati come il minimo. Quindi un qualche tipo di test ripetuto darebbe buoni risultati (possibilmente con qualche tipo di FIFO e / o limite di iterazione per evitare di rimanere bloccati in un loop).
Andrew Russell,

Una versione ancora più difficile da risolvere è quando un bordo di una forma è coperto solo parzialmente da un'altra. Ad esempio nell'immagine in alto a destra, se il quadrato centrale si estendeva verso destra, per essere un rettangolo più grande. Questo è simile all'output di un codice che uso che prende decine di migliaia di celle occupate / non occupate e lo riduce fino a meno di cento forme di collisione più grandi
Richard Tingle,

Risposte:


2

Idealmente, non costruisci il tuo ambiente dai poligoni. Lo costruisci fuori dai bordi (che forse calcoli da un insieme di poligoni). Nel tuo primo esempio, ad esempio, c'è un solo bordo diagonale; nell'ultimo esempio, la scatola poggia su un unico bordo orizzontale.

Il fatto che l'editor o gli strumenti utilizzino forme individuali più piccole per creare un livello non dovrebbe influire sul tempo di esecuzione.

Un approccio leggermente più semplice eliminerebbe semplicemente i bordi "interni" delle forme di base. Per il tuo ultimo esempio, ci sono due bordi tra le caselle "piano"; ignorarli durante il rilevamento delle collisioni.

Puoi trovare alcune immagini migliori e alcune idee di implementazione leggendo la sezione 4.5 (bordi e catene di bordi) nella documentazione di Box2D .


2
Utilizzando bordi (bordi particolare, è leggermente migliore con catene di bordo) ha il grande inconveniente che tale diventa molto facile per la fisica oggetti al glitch all'interno geometria livello.
Andrew Russell,

1
@AndrewRussell: questi problemi vengono evitati con le solite correzioni di tunneling. Assicurati che i tuoi oggetti in movimento abbiano un volume / area abbastanza decente, mantieni la loro velocità massima per fotogramma abbastanza bassa in modo che non possano spostarsi più della metà della loro dimensione più corta (o spostali più volte se ne hai bisogno per spostarti più velocemente), evita fessure molto nitide e simili nella geometria del livello, ripetono la risoluzione più volte fino a convergere in una posizione finale "sicura", ecc.
Sean Middleditch
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.