| 12 c'est mieux ! » |
Donner des yeux à ses bots
Présentation
Je vais vous présenter une méthode simple que je viens de mettre en oeuvre pour donner un semblant de vision à une entité dans un espace 3D.
Elle est très simple car elle ne s'occupe pas de l'atmosphère ni de la dégradation de la vue sur une longue distance. Cependant, il n'est pas si difficile de prendre en compte ces deux détails, peut être dans un prochain billet...
La technique que je vais présenter ici peut être adaptée à la plupart des visions. Je m'explique.
- La vision pour une caméra, par exemple, va être fixe : elle va pointer dans une direction, va pouvoir repérer un mouvement plus ou moins loin selon sa qualité ;
- Pour un humain ou apparenté, les yeux vont reprendre les mêmes propriétés que la caméra, mais vont avoir tendance à balayer un champ de vision (imaginez un garde qui doit surveiller une zone et qui scanne cette zone) ;
- Enfin, une tourelle positionnée sur un tank va quant-à elle aussi reprendre le principe de l'humain, mais va effectuer une rotation totale et permanente.
On pourrait aussi imaginer d'autres visions, comme une vision omnidirectionelle.
Suite:
Comment procéder

La partie coloriée en bleu est la partie considérée pendant l'étape.
- Tout d'abord, votre "bot" doit posséder au minimum les attributs suivants :
- Une direction
- Un angle d'ouverture
- Une profondeur de vue maximale
- La première étape consiste à demander à votre moteur 3D les objets se trouvant dans un rayon donné (la profondeur de vue maximale). En général, il suffit de créer une sphère (avec comme centre le centre de votre "bot") et de demander quels sont les objets qui sont contenus dans cette dernière. La plupart des moteurs implémentent cette fonctionnalité de manière efficace ;
- La seconde étape consiste à appliquer quelques formules de trigo pour ne garder qu'un angle particulier (calculé avec la direction du "bot" ainsi que son angle d'ouverture). Vous obtenez donc tous les objets que le "bot" devrait voir dans un espace dégagé ;
- Enfin, il faut lancer un rayon vers chaque objet retenu et voir si le rayon touche bien l'objet attendu ou non. Ceci va permettre d'éviter de voir à travers les obstacles.
Améliorations
Cette méthode peut bien entendu être largement améliorée. Je pense particulièrement à la détection d'obstacles. En effet, il est surement possible de voir un acteur en partie ou à travers une vitre. Le dernier cas est simple à traiter, il suffit de considérer le taux d'opacité de l'objet atteind et d'éventuellement poursuivre le raycast.
En revanche, pour savoir si un objet peut être vu en partie, le problème est un peu plus complexe. On pourrait par exemple envoyer plusieurs rayons vers différentes parties du corps (ex: tête, pieds, bras, etc).
Si vous avez des idées d'améliorations, n'hésitez pas à laisser un commentaire !
3 commentaires
Ça s'appelle du raytracing et ça a plus de vingt ans. Suivre le lien associé à mon commentaire par exemple...
Sinon, je n'ai trouvé aucun document concluant qui explique comment faire ceci. Alors oui, c'est loin d'être une révolution, mais au moins c'est clair et ça aidera surement une poignée de débutants dans ce domaine.
Non ?
Les commentaires sont fermés pour cet article.