Come posso implementare luci e ombre in una piastrella 2D multistrato?


11

Sto scrivendo un gioco isometrico da zero e vorrei sapere come / se posso aggiungere luci e ombre.

Il codice che ho finora può essere trovato qui , ma dovrebbe essere sufficiente sapere che in questo momento , le mappe sono semplici matrici 3d di valori veri / falsi . Ecco una foto dell'ambiente:Schermata della tilemap multistrato

Se fosse una piastrella a singolo strato sarebbe diretta. Riesco a capire il semplice raycasting in 2d richiesto.

Tuttavia, dato che le mie mappe hanno livelli multipli di altezza e aree simili a grotte, non so davvero come fare per creare ombre convincenti per questo. Forse una soluzione per blocco è l'unico modo realistico?


Cerchi un'illuminazione precotta o generata dinamicamente? Le “aree simili a caverne” sono tagliate se il giocatore entra o la luce deve considerare anche il soffitto? Ti aspetti che ogni riquadro sia binario illuminato / scuro o abbia una sorta di valore frazionario?
Anko,

1
@Anko Preferirei qualcosa di frazionario, come 0 - 1.1 (per aree troppo luminose come esplosioni, ecc.), Ma potrebbe essere semplicemente basato su blocchi, senza interpolazione reale o qualcosa del genere. Voglio davvero che sia dinamico e che supporti più luci. E mentre le aree "a grotta" / coperte saranno mostrate tagliate via, l'algo dovrebbe considerare i blocchi non mostrati durante il calcolo della luce. Ad esempio, se cammini in una casa, i blocchi del tetto scompariranno, ma dovrebbe comunque essere ombreggiato all'interno.
Danie Clawson,

Se cerchi una soluzione come quella con grotte e altezza, sembra che tu non abbia nulla di 2D. Probabilmente stai cercando una soluzione 3D completa, anche se la fotocamera è sempre alla ricerca di una direzione nord-45º verso il basso. Dovresti guardare tecniche come stencil-shadow o simili.
Adrian Maire,

In secondo luogo, @AdrianMaire dovrai eseguire calcoli 3d corretti, ma fare alcune scorciatoie se non c'è interpolazione tra le facce di una "piastrella". Se non stai facendo interpolazione, probabilmente potresti usare i raggi.
NeomerArcana,

Non ho lo spazio mentale in questo momento per digerirlo in una risposta, ma mi sono appena imbattuto in questo post sul blog sulla determinazione della linea di vista per il terreno in altezza . Sembra proprio quello che stai cercando.
Anko,

Risposte:


1

Posso consigliare di far funzionare prima le ombre 2D, anche se è solo per il livello su cui si trova attualmente il tuo avatar. Sarà più facile iniziare a guardare il codice in quel modo e farlo funzionare.

Ho implementato le ombre nelle mappe delle piastrelle 2D in un paio di modi. Un metodo di shadowcasting che ho trovato descritto da Eric Lippert alla Microsoft funziona abbastanza bene.

E l'altro modo, che ho fatto io stesso la prima volta che ho visto questo genere di cose, è stato quello di spazzare ortogonalmente le tessere visibili e i bordi delle piastrelle e generare bordi (e forse angoli iirc) descrivendo la scena con il minor numero di bordi. Puoi quindi tagliare i bordi nascosti e formare qualsiasi funzione di ombreggiatura personalizzata come le ombre incassate se vuoi mostrare un po 'di muro. Quindi crea la tua geometria dell'ombra (proiezione proiettiva dell'ombra?) E rendila sopra.

Ma se provo a portare quell'idea in 3d, diventa più facile farlo in 3d. Mentre il metodo descritto da Eric Lippert potrebbe presumibilmente essere convertito in 3d. Ma penso che scoprirai che farlo in 3d è costoso. Forse dai un'occhiata al codice sorgente di Brogue . Potrebbe avere un'implementazione più efficiente per la visibilità 2D / casting ombra.

In bocca al lupo.

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.