2011-09-23 12 views
9

Sto lavorando ad una demo di gioco 2D (top-view) relativamente piccola, usando OpenGL per la mia grafica. Sta per un angolo base basato sulla furtività, e come tale con tutti i miei nemici sto disegnando un arco di mira in modo che il giocatore sappia dove sta guardando.OpenGL- Semplice metodo di ritaglio/occlusione 2D?

Uno dei miei problemi è così lontano che quando disegno questo spettacolo ad arco (come un poligono pieno) si mostra naturalmente attraverso tutte le pareti sullo schermo poiché non c'è niente di fermarla:

http://tinyurl.com/43y4o5z

I' Sono curioso di sapere come potrei essere in grado di prevenire qualcosa di simile. Ho già un codice che consentirà di rilevare intersezioni di linea con muri e così via (per il rilevamento della vista del nemico), e in teoria potrei usarlo per rilevare un caso del genere e disegnare il poligono di conseguenza, ma probabilmente sarebbe abbastanza laborioso e/o inefficiente, quindi penso che se ci sono sistemi OpenGL incorporati che possono farlo per me probabilmente lo farebbero molto meglio.

Ho provato a cercare domande su argomenti come ritaglio/occlusione ma non sono nemmeno sicuro se questi sono esattamente ciò che dovrei cercare; le mie abilità OpenGL sono limitate. Sembra che qualsiasi cosa utilizzi, per esempio, glClipPlanes o glScissor non sarebbe adatta a questo a causa della grande quantità di singole pareti e così via.

Infine, questa è solo una demo che sto facendo nel mio tempo libero, quindi la grafica non è esattamente la mia preoccupazione principale. Se c'è un modo (abbastanza ragionevole) indolore per farlo, spero che qualcuno possa indicarmi la giusta direzione; se non c'è un modo semplice allora posso solo lasciare il problema per ora o trovare altri rimedi.

+0

In realtà sto cercando qualcosa di simile, per gestire le ombre in un gioco di tessere top-down. I miei sospetti finora sono stati sulla falsariga del raycasting (lento ma perfetto) e la creazione di una maschera dagli occluder e una sorta di meccanica esquadra-mappatura delle ombre. – ssube

+0

Hai mai pensato di utilizzare l'illuminazione OpenGL? Potrebbe significare un po 'di lavoro, ma una luce posizionata in modo appropriato potrebbe dare l'effetto desiderato. – Keith

+0

@ Keith: Grazie, potrebbe essere una buona idea. Anche la mia esperienza con l'illuminazione è limitata, e probabilmente dovrei apportare alcune modifiche al mio codice per far funzionare tutto. Ma terrò a mente se non succede niente di meglio. – Linkage

risposta

4

Questo è essenzialmente un problema di ombreggiamento. Ecco come procedere:

Per ogni punto intorno al bordo dell'arco, traccia un raggio (2D) dal nemico verso il punto, cercando le intersezioni con le caselle verdi. Se le caselle verdi saranno sempre allineate sull'asse, la matematica sarà molto più semplice (cercare l'intersezione Ray-AABB). Il rendering dei punti di intersezione come una ventola a triangolo ti darà il tuo arco.

Come accennato al fatto che il codice di intersezione del muro di linea è già attivo, fino a quando questo vi dirà la distanza dal nemico al muro, sarete in grado di utilizzarlo per l'arco della vista. Non supponiamo automaticamente che sia troppo lento - non stiamo più correndo su 486s. Puoi sempre ridurre il numero di punti attorno al bordo del tuo arco per accelerare le cose.

+0

Questo suona abbastanza bene, anche se sarei ancora un po 'preoccupato per la velocità. Voglio dire, supponiamo di avere fino a 10 nemici in una mappa, diciamo almeno 30 punti d'arco per nemico, e di dire 25 muri ... è 10 * 30 * 25 controlli di intersezione per un fotogramma, che suona come un sacco di lavoro del processore per un effetto relativamente semplice. Indipendentemente da ciò, è una buona risposta, e potrei provarlo presto. – Linkage

+2

Non dimenticare [indicizzazione spaziale] (http://en.wikipedia.org/wiki/Spatial_database#Spatial_Index) per ridurre il numero di muri che devi controllare per le intersezioni. – genpfault

+0

@genpfault si, assolutamente. – geofftnz

4

La gestione dell'occlusione incorporata di OpenGL è progettata per le attività 3D e non riesco a pensare a un modo semplice per configurarlo per ottenere l'effetto desiderato. Se fossi in me, il modo in cui risolverei questo è usare un programma di framment shader, ma sappi che questo sicuramente non rientra in un "(ragionevolmente) modo indolore per farlo". In breve, per prima cosa rendi una "mappa di occlusione" binaria che è nera dove ci sono muri e bianco altrimenti. Quindi si rende "l'arco di visualizzazione" come si sta facendo attualmente con un programma di frammenti che è progettato per cercare dal visualizzatore verso la posizione di destinazione, alla ricerca di un occlusore (pixel nero). Se trova un occlusore, rende quel pixel dell '"arco di visualizzazione" trasparente al 100%. Nel complesso però, mentre questa è una soluzione "corretta" direi sicuramente che questa è una caratteristica complessa e sembri a posto senza implementarla.

+1

Questo sarà * costoso *, ma potrebbe funzionare. Disegnarli come trasparenti potrebbe essere più lento rispetto all'utilizzo dello scarto integrato, però. – ssube

+0

Una bella idea e una che funzionerà con funzionalità a livello di pixel. Ci sarà una buona quantità di carico sulla GPU, ma se gli archi visivi coprono una porzione relativamente piccola dello schermo dovrebbe andare bene. – geofftnz

4

Immagino che se ci sono sistemi OpenGL incorporati che possono farlo per me, probabilmente lo farebbero molto meglio.

OpenGL è un'API di disegno, non una libreria di elaborazione geometria.

In realtà il metodo di test intersezione è il modo giusto per farlo. Tuttavia per accelerarlo dovresti usare una struttura di suddivisione spaziale. Nel tuo caso hai qualcosa che piange per un Binary Space Partitioning albero. Gli alberi BSP hanno la bella proprietà, che la complessità per trovare intersezioni di una linea con muri è in media circa O (log n) e il caso peggiore è O (n log n), o in altre parole, gli alberi BSP sono molto efficiente. Vedere le domande frequenti su BSP per i dettagli http://www.opengl.org//resources/code/samples/bspfaq/index.html

+0

Non ho mai guardato prima in alberi BSP, ma guardandoci ora sembra davvero molto utile. Probabilmente cercherò di implementarlo se finirò a lavorare con il precedente suggerimento di geofftnz (o se trovo che i miei sistemi di collisione mancheranno in seguito). – Linkage