Calculer la visibilité d'un objet dans une scène 3D pour une utilisation dans la logique de jeu/IA

StackOverflow https://stackoverflow.com/questions/924761

Question

Je démarre un projet de jeu qui permettra aux personnages de se cacher dans des zones sombres.Se cacher dans un coin sombre devrait empêcher les autres personnages de vous voir plus difficilement.

Ce dont j'ai besoin, c'est d'un moyen de calculer les conditions d'éclairage là où se trouve le personnage.

L'idéal serait d'avoir un

double getLightFactor(GameCharacter observer, GameCharacter target)

car je suppose qu'il pourrait y avoir des conditions d'éclairage dans lesquelles la lumière tombe de sorte que différents côtés de la cible soient touchés par différentes quantités de lumière.Mais je me contenterais volontiers de

double getLightFactor(GameCharacter target)

pour obtenir la lumière d'un personnage spécifique, quel que soit l'endroit d'où vous regardez ou même

double getLightFactor(int x, int z)

pour obtenir simplement la lumière à un point spécifique de la carte sur le terrain.

La méthode doit prendre en compte le fait que les conditions d'éclairage peuvent changer pendant le jeu, mais comme il s'agit d'un jeu au tour par tour, certains calculs lourds pourraient être autorisés.J'ai l'intention de rendre possible l'utilisation de lampes de poche, elles doivent donc également être prises en compte (mais elles pourraient être modélisées et manipulées séparément).

J'utiliserai Ogre3d pour gérer ma scène, mais j'accepterai volontiers des solutions génériques ou même des solutions pour d'autres moteurs (mon choix de moteur n'est pas gravé dans le marbre).

Les idées, les articles ou tout ce qui est pertinent sont les bienvenus !

Était-ce utile?

La solution

Vous pouvez tout simplement rendre la scène du point de vue de l'observateur à un tampon hors écran (même dans une résolution assez faible) en tenant compte des paramètres de lumière actuels. Ensuite, vous pouvez calculer une valeur de luminosité moyenne autour du milieu du caractère cible.

Je ne sais pas sur le moteur Ogre3D, mais cela devrait être une manière assez générique pour traiter votre problème (il est juste de rendre la scène d'un point de vue différent après tout ...)

Autres conseils

Oh mec.Cela dépend beaucoup du moteur.Je peux vous dire maintenant que vous souhaitez la deuxième option.

Comment fonctionne l'éclairage ?Est-ce dynamique ou statique ?Supposons que ce soit une combinaison des deux.

Pour un éclairage statique, consultez la carte lumineuse à proximité.Il s'agit soit d'un sommet, soit d'une texture. Dans tous les cas, vous pouvez l'échantillonner à quelques points proches et en faire la moyenne.Regardez comment le moteur calcule l'éclairage des modèles, explorez le code graphique et voyez d'où proviennent réellement les données, vous pouvez utiliser la même source.Certains jeux ont des informations d'éclairage volumétriques, Quake 2 le fait feuille par feuille dans l'arborescence BSP (facile à vérifier) ​​et Quake 3 a des textures volumétriques (également faciles à vérifier).

Ensuite, vous devrez ajouter les lumières dynamiques.Une façon de procéder consiste à projeter des rayons depuis le joueur (probablement quelques rayons différents, bien sûr, depuis différentes parties du joueur) vers la source de lumière.Comptez combien sont touchés et ajoutez un peu à votre nombre pour chacun, en fonction de la distance dans laquelle se trouve la lumière.Tous les moteurs de jeu décents ont une procédure pour "tirer un rayon et voir ce qu'il frappe", c'est ainsi que les IA font la ligne de mire et comment vous déterminez quelles balles frappent et ce qui se passe lorsque vous heurtez le mur.Ne tirez pas trop de rayons trop loin car cela pourrait être lent.

Vous n'auriez pas besoin de recalculer cette valeur trop souvent, vous pourriez le faire chaque fois qu'une nouvelle source de lumière est créée, puis toutes les secondes environ.

Selon la complexité de l'environnement, vous pouvez tricher et utiliser un lightmap 2D sur le terrain overlayed. Chaque cellule aurait une valeur d'intensité lumineuse en fonction des sources lumineuses à proximité. Il serait rapide de calculer même pour les objets en mouvement, et rapide pour accéder à déterminer la « obscurité » d'un emplacement.

Vous devrez peut-être des formes de « timbre » sur celui-ci en utilisant des algorithmes de boîte ou simple cercle en fonction du type de lumières que vous avez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top