Unity3D: comment connaître le degré d'éclairage d'un point dans une scène?

Salutations!

Je sais, et au fond, vous savez ce qui manque à vos jeux de cartes ou aux jeux trois en un. Systèmes furtifs!

Et bien sûr, tout système de furtivité qui se respecte devrait pouvoir prendre en compte l'illumination de l'environnement autour du joueur. J'ai été étonné de découvrir le sujet et de trouver une quantité anormalement petite d'informations. Par conséquent, je m'empresse de partager les fruits.

Aujourd'hui, nous ne développerons pas un système de furtivité à part entière pour le joueur, nous considérerons uniquement des interactions avec l'éclairage.

Méthode 1: collisionneurs


Un moyen simple et peu gourmand en ressources.

Nous ajoutons un collisionneur sphérique à chaque source de lumière. Nous en faisons un déclencheur. Nous fixons les dimensions approximativement égales au rayon de lumière.

Le reste est aussi clair qu'une ombre. Nous écrivons un script simple, où dans OnTriggerEnter () nous plaçons l'activation du calcul de la lumière (pour que les sources de lumière ne fonctionnent pas "inactives" lorsque le joueur n'est pas à proximité).

Le calcul d'éclairage lui-même sera situé dans Update (). En substance, c'est la physique habituelle.Raycast (). S'il frappe le joueur, le joueur est dans la zone claire. S'il ne tombe pas, cela signifie que le joueur est derrière des obstacles et donc à l'ombre.

Vous pouvez également ajouter ici le calcul de la distance entre le lecteur et la source lumineuse. Ainsi, pour déterminer l'illumination, nous utiliserons un flotteur simple, qui variera en fonction de la distance aux sources lumineuses. Et vous pouvez l'utiliser partout où votre cœur le désire.

Exemple

Au point 1, l'éclairage est proche du maximum. Au point 2, l'éclairage est minimal - il y a un obstacle entre la lumière et le point. Au point 3, l'éclairage est moyen.

Et ce n’est pas tout! Vous pouvez ajouter des collisionneurs déclencheurs à diverses «zones d'ombre» où le joueur doit se cacher. Dans les meilleures traditions de Manhunt. De même, vous pouvez marquer les zones lumineuses avec le collisionneur, simulant, par exemple, la lumière d'un projecteur.

Avantages:


  • Lumières ponctuelles faciles à personnaliser.
  • Assez économique en termes de ressources, si vous ne spammez pas les sources de lumière.

Inconvénients:


  • La lumière Spot et la lumière directionnelle sont fortement accordées. Si pour le premier il suffit de positionner le collisionneur dans le champ de lumière (pour augmenter la visibilité du joueur à l'entrée), alors le second est une véritable horreur. Vous devez soit placer des collisionneurs à chaque ombre (pour réduire la visibilité du joueur à l'entrée), soit vérifier constamment avec Physics.Raycast () entre le joueur et le «soleil» - il est situé sous les rayons ou dans l'ombre.
  • Un grand nombre de collisionneurs encombrent la scène, compliquant la physique.
  • Des précautions doivent être prises avec les sources de lumière qui se croisent.
  • La lumière dynamique (en mouvement ou en variation d'intensité) doit être ajoutée séparément via des scripts.

Méthode 2: RenderTexture


Que faisons-nous ici? En fait, nous obtenons une «capture d'écran» de la caméra, et pas nécessairement de la caméra principale. Et puis nous analysons la couleur de la capture d'écran pour savoir comment la lumière brillante tombe sur le sujet.

Pour commencer, nous avons besoin d'un objet à partir duquel nous "lirons" la lumière. Créez une sphère ou un plan régulier, faites-le petit (échelle de 0,1), placez-le près du sol, rendez-le blanc, retirez le collisionneur:

Texte masqué


Ajoutez une caméra (assurez-vous de supprimer l'écouteur audio et vérifiez que la balise MainCamera n'en vaut pas la peine). Liez-le à notre objet. On le met un peu plus haut, on le dirige vers le bas. Nous exposons dans les paramètres pas l'affichage principal. Le faire orthographique est à votre goût.

Au final, nous le positionnons pour qu'il regarde notre objet et seulement lui.

Texte masqué


Au final, configurez le masque Culling des caméras primaire et secondaire pour que le primaire n'affiche pas nos objets «légers», tandis que les secondaires ne les voient que, sans encombrer autre chose.

Et ici, le plaisir commence. Nous attachons le script à la caméra:

public Camera cam; //   RenderTexture tex; Texture2D _tex; void Start () { //    "". // ,       -   . // Depth   0   -   . tex = new RenderTexture (1, 1, 8); // RenderTexture "" , //   ,    . _tex = new Texture2D (1, 1, TextureFormat.RGB24, false); } void Update () { //   ""  cam.targetTexture = tex; cam.Render (); //     RenderTexture.active = tex; //   Texture2D _tex.ReadPixels (new Rect (0, 0, 1, 1), 0, 0); _tex.Apply (); Color col = _tex.GetPixel (0, 0); float vis = (col.r + col.g + col.b) / 3; } 

En sortie, nous obtenons un flotteur vis, qui, par essence, est une représentation numérique du niveau d'éclairage incident sur notre objet. Si la source est proche - l'objet est blanc - vis est 1. S'il est sombre - l'objet est noir - vis est ~ 0.

Nous n'avons pas besoin d'effectuer l'opération ci-dessus à chaque image, nous incorporons donc une petite seconde minuterie:

 float interval = 0; void Update () { interval += Time.deltaTime; if (interval < 1) return; interval = 0; //   } 

Ensuite, nous lions l'ensemble de notre système au joueur afin qu'il bouge avec lui. Et notre variable vis renvoie automatiquement la lumière autour du lecteur!

Ce système peut être utilisé non seulement conjointement avec le lecteur. Vous pouvez le placer n'importe où et comme vous le souhaitez, créant une sorte de capteurs de lumière. En règle générale, il existe des moyens plus efficaces de les mettre en œuvre, mais est-il toujours agréable d'avoir des alternatives?

Les avantages sont évidents, parlons des inconvénients.

Inconvénients


  • Chaque «détecteur de lumière» (s'il y en a plusieurs) nécessite une caméra distincte.
  • Texture2D.ReadPixels () - enfin, extrêmement lent. Même si vous le faites une fois par seconde, et pas à chaque image, même si vous divisez les fonctions d'écriture et de lecture des textures en différentes images, il existe toujours des dispositions à 40-110 ms.
  • Ce système ne prend pas en compte de rares cas. Par exemple, une lampe de poche brille sur un personnage. Le personnage est bien éclairé, mais la lumière tombe sur lui et derrière lui, et non vers le bas, respectivement, notre détecteur de lumière montre un faible niveau d'éclairage. Vous pouvez résoudre le problème, par exemple, en plaçant le détecteur non pas sur le sol, mais au niveau de la poitrine du personnage. Ensuite, vous devez placer deux caméras sur les côtés opposés pour lire la lumière de chaque côté. Ce qui va ralentir le système de moitié.

Source: https://habr.com/ru/post/fr417135/


All Articles