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?
opengl
2d
lighting
raycasting
LiquidFeline
la source
la source
Réponses:
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.
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.
la source
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 .
la source
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.
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
la source