Domanda

Sto iniziando un progetto di gioco che permetterà caratteri di nascondere nelle aree scure. Nascosto in un angolo buio dovrebbe rendere più difficile per gli altri personaggi di vederti.

Che cosa ho bisogno è un modo per calcolare quanto le condizioni di luce sono dove si trova il personaggio.

L'ideale sarebbe avere un

double getLightFactor(GameCharacter observer, GameCharacter target)

poiché suppongo che ci potrebbero essere le condizioni di luce in cui la luce cade in modo che i diversi lati del bersaglio viene colpito da diverse quantità di luce. Ma vorrei volentieri accontentare di

double getLightFactor(GameCharacter target)

per ottenere la luce per un carattere specifico senza riguardo a dove si sta guardando o anche da

double getLightFactor(int x, int z)

per ottenere solo la luce in un determinato punto della mappa del terreno.

Il metodo deve tener conto del fatto che le condizioni di illuminazione possono cambiare durante il gioco, ma dal momento che è a turni alcuni calcoli pesanti potrebbe essere consentito. Ho intenzione di rendere possibile l'uso di torce elettriche in modo che devono essere prese in considerazione anche (ma potrebbero essere modellati e manipolati separatamente).

Userò Ogre3D per gestire la mia scena, ma sarò felice di accettare soluzioni generiche o anche soluzioni per gli altri motori (la mia scelta di motore non è scolpito nella pietra).

Le idee, documenti o davvero qualcosa di rilevante è molto gradito!

È stato utile?

Soluzione

Si può solo rendere la scena dal punto di vista dell'osservatore ad un buffer fuori schermo (anche in un piuttosto bassa risoluzione) tenendo conto delle impostazioni della luce correnti. Poi si potrebbe calcolare un valore di luminosità media intorno alla metà del personaggio bersaglio.

Non so sul motore Ogre3D, ma questo dovrebbe essere un modo piuttosto generico per gestire il vostro problema (è solo rendendo la scena da un punto di vista diverso, dopo tutto ...)

Altri suggerimenti

Oh ragazzi. Questo dipende molto sul motore. Vi posso dire ora che si desidera che la seconda opzione.

Come funziona l'illuminazione? E 'dinamico o statico? Supponiamo che si tratta di una combinazione di entrambi.

Per l'illuminazione statica, controllare il lightmap nelle vicinanze. E 'o vertex o basato su una trama, in entrambi i casi, si può gustare in un secondo paio di punti nelle vicinanze e li media. Guarda a come il motore calcola l'illuminazione per i modelli, scavare nel codice grafico e vedere dove i dati proviene in realtà da, è possibile utilizzare la stessa fonte. Alcuni giochi hanno informazioni di illuminazione volumetrica, Quake 2 fa questo su una base per-foglia nell'albero BSP (facile da controllare) e Quake 3 ha texture volumetriche (anche facile da controllare).

Quindi è necessario aggiungere le luci dinamiche. Un modo per farlo è sparando raggi dal lettore (probabilmente un paio di raggi differenti per essere sicuri, provenienti da diverse parti del giocatore) verso la sorgente luminosa. Contare quanti sono colpito e aggiungere un po 'per il proprio numero per ciascuno di essi, a seconda di quanto la luce è. Tutti i motori di gioco decente hanno una procedura per "sparare raggi e vedere quello che colpisce", è come fare IA linea di vista e come capire cosa proiettili hanno colpito e che cosa accade quando si esegue in parete. Non sparare troppi raggi troppo perché potrebbe essere lento.

Non avrebbe dovuto ricalcolare questo valore troppo spesso, si potrebbe fare ogni volta che viene creata una nuova sorgente di luce e poi ogni secondo o giù di lì.

A seconda della complessità del contesto, si potrebbe bari usando un lightmap 2D sovrapposto sul terreno. Ogni cella avrebbe un valore di intensità della luce in base alle vicine sorgenti di luce. Sarebbe veloce per calcolare anche per oggetti in movimento, e veloce per accedere a determinare il "buio" di un luogo.

Si può avere a forme "stamp" su di esso utilizzando semplice scatola o cerchio algoritmi a seconda del tipo di luci che avete.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top