Come posso implementare un rilevamento 2D e preciso delle collisioni?


11

Sono ben consapevole di come rilevare se due o più oggetti 2D si scontrano, ma sono interessato a come decidere se verificare una collisione. Nei progetti precedenti, avevo appena controllato ogni oggetto rispetto a qualsiasi altro oggetto (lo so, O (n ^ 2) livello di stupidità) e questo ha creato un gameplay tutt'altro che fluido.

Vari forum salutano la grandezza di Quadtrees, B-Trees e qualsiasi altro tipo di albero o struttura che ti viene in mente.

Qual è la struttura più efficiente per determinare se una collisione deve essere controllata?


1
Una cosa che potresti prendere in considerazione è controllare solo le collisioni per gli oggetti che si sono spostati e gli unici oggetti che ti sono vicini. Il mio sistema attuale funziona bene (centinaia di migliaia di oggetti) - ed è tutto ciò che sto facendo.
ultifinito

Penso che gamedev.stackexchange.com/questions/14369/… potrebbe aiutarti molto. originariamente era pensato per e algoritmo per l'elaborazione parallela, ma penso che lo stesso algoritmo potrebbe anche migliorare le applicazioni a thread singolo.
Ali1S232,

1
@ultifinitus Questo è essenzialmente quello che sto chiedendo. Come faccio a determinare quali oggetti sono vicini senza scorrere tutti gli oggetti e verificarne la posizione?
Mike Cluck

Mike, puoi inviarmi un'e-mail per un codice specifico che ho usato, è in c ++ - oppure posso darti la struttura di base, anche se potrebbe diventare piuttosto ambigua e complicata per questo.
ultifinito

1
Non è un duplicato perché stavo chiedendo quale tipo di struttura è più adatta per determinare se dovremmo preoccuparci di verificare una collisione. L'altra domanda riguardava le collisioni trasparenti e non trasparenti. Per non parlare, questa domanda è stata posta circa un anno prima di quella a cui ti sei collegato.
Mike Cluck,

Risposte:


12

Per un gioco 2D, a meno che gli oggetti 2D non abbiano una distribuzione molto pesante su un lato della mappa, una griglia uniforme è quasi sempre la strada da percorrere. La complessità della memoria è semplice, (proporzionale alle dimensioni della tua mappa) e con una distribuzione ragionevole, ha O (1) tempo di ricerca e una media di log (numberOfObjects / (righe * colonne)) ^ 2 test di intersezione fatto per cella. Potresti decidere di controllare solo le celle in cui è stato spostato un oggetto, il che rende la geometria statica molto più efficiente. È facile modificare al volo una griglia uniforme (molto meno dolorosa rispetto alle soluzioni basate su alberi) ed è più semplice da implementare. L'unica volta in cui direi di non usarlo in un gioco 2D è quando i requisiti di memoria di una griglia uniforme diventano troppo grandi (diciamo una sim di spazio in cui i livelli sono scarsi ma enormi).


In che modo questa soluzione gestisce gli oggetti che delimitano 2 o 4 celle della griglia?
ashes999,

1
Qualsiasi cella in cui l'oggetto si sovrappone, è considerata in essere, quindi un oggetto può trovarsi in più celle. La maggior parte delle strutture di dati spaziali affronterà il problema delle sovrapposizioni in modo simile.
Darcy Rayner,

Wow, è una cosa intelligente. +1 Saluti amico.
ashes999,


1

Se il tuo mondo ha una dimensione molto "lunga" (chiamalo X), rispetto ad altri, puoi tenere gli oggetti in un elenco ordinato che puoi riordinare mentre si muovono, e quindi il rilevamento delle collisioni significa solo controllare gli oggetti che si sovrappongono nell'asse X.

Un'altra possibilità è quella di mantenere elenchi di oggetti attivi / passivi e non preoccuparsi degli oggetti passivi (che non si muovono affatto).

Se sono tutti oggetti di medie dimensioni che sono visibili al giocatore sullo schermo, tutto rispetto a tutto probabilmente non è poi così male.

A parte questo, sono con Darcy, una griglia uniforme è buona.

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.