Comment mettre en œuvre un éclairage occlus dans un jeu 2D basé sur des blocs?

11

Je veux un éclairage 2D qui peut être bloqué par des objets en jeu. Mon jeu a une vue de haut en bas et tous les objets du jeu sont décrits par des rectangles.

Disons que j'ai un monde 10x10 et que je place une lumière à 1x1 et des murs tout autour de cette lumière. Je veux pouvoir voir la source de lumière à 1x1, mais pas ailleurs, car elle est bloquée par les murs.

J'ai entendu parler de la diffusion de rayons lumineux, mais comment cela fonctionne-t-il vraiment?

LiquidFeline
la source
1
J'aimerais voir des réponses indépendantes de la langue à cette question.
Dashto
2
@Dashto: Vous avez besoin d'un morceau de code fonctionnel dans la langue que vous utilisez? C'est un mauvais endroit pour demander ..
Kromster
Qu'as-tu essayé? Quand vous dites "nulle part ailleurs sans source de lumière", que voulez-vous dire? Je viens de vous éclairer 1,1 bloc et c'est tout. Peut-être que je ne comprends pas votre question, pourriez-vous poster une illustration?
Laurent Couvidou
1
@Krom Stern: Je demande exactement le contraire, en fait - une réponse conceptuelle qui ne dépend pas de la langue. Les deux fils liés comme doublons ne parlent pas beaucoup des concepts. En fait, la plupart des questions similaires sur ce site ont simplement des réponses disant "Utilisez cette bibliothèque!" ce qui est moins utile pour quelqu'un qui veut comprendre comment cela fonctionne.
Dashto
@Dashto: C'est une information importante, vous devez l'ajouter à la question;)
Kromster

Réponses:

13

Amit Patel a écrit un très bel article sur le lancer de rayons 2D.

Cela implique de projeter des rayons sur chacun des sommets à l'intérieur de la plage de la source de lumière pour créer un maillage léger.

entrez la description de l'image ici

Tous les exemples visuels sont interactifs dans le message et très faciles à comprendre.

Vous n'avez pas non plus à vous limiter à une boîte, le périmètre que vous tracez peut être n'importe quelle forme que vous aimez.

MichaelHouse
la source
1

Vous devez utiliser l' algorithme de diffusion de rayons, ce qui signifie que vous devriez pouvoir calculer l'intersection du rayon (demi-ligne) avec n'importe quel objet de votre scène (lignes, carrés, cercles, triangles ...) et choisir l'intersection la plus proche. Vous lancez le rayon dans toutes les directions, puis "dessinez la lumière" uniquement vers l'objet le plus proche.

Voici à quoi cela peut ressembler .

Ivan Kuckir
la source
Je viens de demander comment j'utiliserais le lancer de rayons. Je sais à ce sujet.
LiquidFeline
0

Si vous savez ce qu'est le lancer de rayons, alors tout ce que vous avez à faire est de le coder en dur. Ce n'est pas trop complexe tant que vous avez des coordonnées pour chaque sommet.

Créez d'abord un objet émanant de la lumière. Placez votre lumière aux coordonnées x, y.

#include <math.h>
int i = 0;
if ( sqrt( abs( light.x - vertex.x )^2 + abs( light.y - vertex.y )^2 ) <= light.radius)
{
    lightOccludingVertices[i] = vertex;
    i++;
}

//If two or more vertices are both a member of an individual wall,
//illuminate the triangular area between the light, the furthest 
//vertex on the x-axis, and the furthest vertex on the y-axis

Il n'est pas garanti que cela fonctionne pour un polygone concave, mais cela devrait fonctionner très bien pour tous les polygones convexes.

Cela fonctionnera si vos objets occlus (murs, personnage, mangeur de personnes violettes volantes) sont peints à l'écran après avoir appliqué l'éclairage. Sinon, la moitié d'un mur apparaîtra beaucoup plus lumineuse que l'autre moitié. Si votre lumière ponctuelle est équidistante de deux paires de sommets du même mur (exactement la moitié de la hauteur de votre mur), appliquez le triangle aux deux sommets les plus proches, plutôt que les deux plus éloignés.

Je dois également mentionner que cette méthode nécessite un point de sommet créé dynamiquement où le bord du rayon de la lumière rencontre la surface de l'objet occlus. Cela crée un minimum de 3 sommets pour tout objet occlus et permettra aux murs qui s'étendent au-delà du rayon de la lumière (ou hors de l'écran) de bloquer également toute lumière.

Plus d'informations sur les polygones concaves et convexes

igrad
la source