2012-05-22 9 views
5

Ho una mappa di collisione e alcuni posti che voglio essere fonti di luce. La fonte di luce fornisce una luce che è in realtà una forma in cui posso vedere il terreno. E ora si presenta così:Illuminazione 2D: non far passare la luce attraverso il muro

enter image description here

Così la luce passa attraverso le pareti. Voglio far sembrare questo:

enter image description here

(ho segnato le collisioni con le pareti di giallo scuro)

Così i raggi di luce di arresto quando incontro il muro. Voglio ottenere la forma della luce corretta, la migliore sarebbe la bitmap che la contiene)

La mia prima idea è stata lanciare raggi dalla sorgente e controllare quando si scontrano con il muro (so come farlo), ma poi avrei bisogno di lanciare ray ogni 0,001 gradi per esempio, quindi è troppo tempo per generare luci. La prossima cosa è che la forma della luce non è sempre un cerchio, a volte può essere un'ellisse o mezza ellisse, persino un triangolo o una parte del cerchio. Generalmente, ho la bitmap con la luce che non collide nulla, e voglio sottrarla un po 'per farla sembrare sulla seconda immagine.

E l'ultima cosa, sto usando allegro 4.2.1, ma tutti i bitmap precedentemente menzionati sono array a 2 dimmension con 0 e 1.

Grazie per qualsiasi aiuto, mi dispiace per la lunga domanda e il mio cattivo inglese.

+0

Puoi usare il fatto che l'ombra creata da un ostacolo in linea retta diventerà un settore? Inizia con la tua luce circolare, con raggio a seconda dell'intensità, e quindi disegna un trapezio nel colore inverso per ogni ostacolo. –

+0

hm, puoi spiegarlo un po 'di più? –

risposta

7

L'idea di base è calcolare la regione d'ombra delle pareti e non colorarla.

This article dovrebbe darti un buon inizio.

+0

bel link. thanx –

2

Nel vostro esempio particolare potete facilmente forzare la forza bruta controllando la linea di vista da ciascun pixel (vuoto) al centro della vostra fonte di luce. Se hai linea di mira e la distanza è all'interno del falloff, allora hai luce lì. Se no, allora è buio.

+0

Non ci vorrà molto tempo? : O –

+0

@kittyPL: è un'opzione forza bruta, non necessariamente il modo più efficace per farlo no. Il vantaggio è che potrebbe funzionare per qualsiasi forma di ostacolo, anche se solo per sorgenti puntiformi. –

+0

nessun modo migliore? Mi piacerebbe generarlo dinamico, così gli ostacoli in movimento possono gettare ombra ... –

2

La soluzione MadKeithV richiede O (numero di pixel^2).

La mia soluzione è un'idea MadKeithV espansa, ma eseguita in tempo O (numero di pixel). Con alcuni miglioramenti, funzionerà in O (numero di pixel in luce)

Innanzitutto, iniziare con il pixel contenente la fonte di luce. Quindi, utilizzando la procedura BFS, è possibile "infettare" i pixel più vicini con luce e intervallo di intervallo di memorizzazione della direzione in cui la luce può avanzare da ciascun punto.

Nelle seguenti istanze BFS, ripetere questa procedura, considerando solo i pixel nell'intervallo di infetti.

Problemi correlati