Comment puis-je implémenter des lumières et des ombres dans un tilemap 2D multicouche?

11

Je suis en train d'écrire un jeu isométrique à partir de zéro, et j'aimerais savoir comment / si je peux ajouter des lumières et des ombres.

Le code que j'ai jusqu'à présent peut être trouvé ici , mais il devrait suffire de savoir qu'en ce moment , les cartes sont de simples tableaux 3D de valeurs vraies / fausses . Voici un aperçu de l'environnement:Capture d'écran du tilemap multicouche

S'il s'agissait d'un tilemap à une seule couche, ce serait simple. Je peux comprendre le raycasting simple en 2d qui est requis.

Cependant, étant donné que mes cartes ont plusieurs niveaux de hauteur ainsi que des zones ressemblant à des grottes, je ne sais pas vraiment comment faire des ombres convaincantes pour cela. Peut-être qu'une solution par bloc est le seul moyen réaliste?

Danie Clawson
la source
Vous recherchez un éclairage précuit ou généré dynamiquement? Les «zones ressemblant à des grottes» sont-elles coupées si le joueur entre ou la lumière doit-elle également tenir compte du plafond? Vous attendez-vous à ce que chaque tuile soit binaire éclairée / sombre, ou ait une sorte de valeur fractionnaire?
Anko
1
@Anko, je préférerais quelque chose de fractionnel, comme 0 - 1.1 (pour les zones trop lumineuses comme les explosions, etc.), mais cela pourrait être simplement basé sur des blocs, sans véritable interpolation ou quelque chose comme ça. Je veux vraiment qu'il soit dynamique et supporte plusieurs lumières. Et tandis que les zones "en grotte" / couvertes seront montrées coupées, l'algo devra tenir compte des blocs qui ne sont pas montrés lors du calcul de la lumière. Par exemple, si vous marchez dans une maison, les blocs de toit disparaîtront, mais il devrait toujours être ombragé à l'intérieur.
Danie Clawson
Si vous cherchez une solution comme ça avec des grottes et de la hauteur, il semble que vous n'ayez rien de 2D. Vous recherchez probablement une solution 3D complète, même si la caméra est toujours orientée vers le nord-45 ° vers le bas. Vous devriez regarder des techniques comme l'ombre du pochoir ou similaire.
Adrian Maire
J'appuie @AdrianMaire, vous aurez besoin de faire des calculs 3D appropriés, mais de faire des raccourcis s'il n'y a pas d'interpolation sur les faces d'une "tuile". Si vous ne faites pas d'interpolation, vous pourriez probablement utiliser des rayons.
NeomerArcana,
Je n'ai pas l'espace mental pour le digérer en une réponse, mais je suis juste tombé sur ce billet de blog sur la détermination de la ligne de visée pour le terrain de la carte de la hauteur . Cela ressemble à ce que vous recherchez.
Anko

Réponses:

1

Puis-je recommander que les ombres 2D fonctionnent en premier, même si c'est uniquement pour le niveau sur lequel votre avatar est actuellement. Il sera plus facile de commencer à regarder le code de cette façon et de le faire fonctionner.

J'ai implémenté les ombres dans les cartes de tuiles 2d de plusieurs manières. Une méthode de shadowcasting que j'ai trouvée décrite par Eric Lippert chez Microsoft fonctionne assez bien.

Et l'autre façon, ce que j'ai fait moi-même la première fois que j'ai regardé ce genre de chose, était de balayer orthogonalement les carreaux et les bords de carreaux visibles et de générer des bords (et peut-être des coins iirc) décrivant la scène avec le plus petit nombre de bords. Vous pouvez ensuite supprimer les bords cachés et former toutes les fonctions d'ombrage personnalisées telles que les ombres encastrées si vous souhaitez afficher un peu de mur. Créez ensuite votre géométrie d'ombre (projection d'ombre projective?) Et rendez-la par-dessus.

Mais si j'essaye de porter cette idée en 3D, il devient simplement plus facile de le faire en 3D. Alors que la méthode décrite par Eric Lippert pourrait vraisemblablement être convertie en 3D. Mais je pense que vous constaterez que le faire en 3D coûte cher. Jetez peut-être aussi un œil au code source de Brogue . Il peut avoir une implémentation plus efficace pour la visibilité 2D / la projection d'ombres.

Bonne chance.

Gavin Williams
la source