Comment pourriez-vous modéliser des «sentiers parfumés» dans un jeu?

11

Supposons que vous souhaitiez créer un jeu en 3D et que les joueurs ou les mobiles soient en mesure de tracter une autre entité en suivant leurs traces de parfum. Existe-t-il une structure de données connue qui correspond à ce cas d'utilisation?

Si vous n'avez que peu d'individus, vous pouvez probablement faire quelque chose comme une carte de coordonnées 3D à l'ID d'entité, mais le vrai parfum fonctionne différemment, car il s'estompe avec le temps, mais lentement. Et la plupart du temps, vous ne pouvez savoir qu'environ ce qui s'y est passé et combien de choses de ce type s'y sont rendues. Et l'approximation devient pire avec le temps, jusqu'à ce qu'elle disparaisse.

J'imagine que c'est un peu comme commencer avec un nombre exact et perdre lentement les chiffres les moins significatifs, jusqu'à ce que vous perdiez aussi le chiffre le plus significatif. Mais cela ne m'aide pas vraiment, car les ID d'entité ne sont normalement pas codés pour contenir le type d'entité, en plus de son ID individuel.

Sébastien Diot
la source
Dwarf Fortress fait quelque chose comme ça dans la prochaine version.
Russell

Réponses:

10

Il existe une grande variété de façons de procéder; Je vais suggérer les choix «évidents pour moi», mais il existe de nombreuses variantes qui pourraient être conçues. Avertissement: je n'ai en fait rien implémenté de ce genre.

Tout d'abord, vous avez besoin d'une structure de données qui couvre votre monde. Si vous effectuez un mouvement de PNJ dans un espace 3D, vous avez probablement, ou aurez éventuellement besoin, d'une telle structure à des fins d'orientation - par exemple, un maillage de navigation. Supposons donc que nous pouvons ajouter un champ pour les parfums à cela.

Alors, que mettons-nous dans ce domaine? Je propose une liste de records ( parfum , force , temps ). Cette liste est conservée à une longueur maximale ou inférieure à celle-ci, et triée par force - les odeurs faibles seront donc éliminées. Le parfum peut être soit quelque chose explicitement défini pour chaque entité ou type d'entité, soit simplement le type d'entité - selon ce que vous voulez pouvoir suivre distinctement. L' heure est un horodatage de la dernière mise à jour de cet enregistrement de parfum.

Lorsqu'une entité traverse une zone (par exemple un triangle donné du maillage de navigation), il est temps de mettre à jour la liste des parfums. Tout d'abord, diminuez toutes les forces en fonction du temps passé en fonction de la valeur temporelle par rapport à l'heure actuelle - la décroissance exponentielle est probablement un choix raisonnable ici. Ajoutez ensuite le parfum de l'entité actuelle à la liste, peut-être avec une force dépendant du type d'entité. Ensuite, si la liste est trop longue, jetez la force la plus faible.

Pour obtenir un résultat de suivi, recherchez l'odeur dans la liste pour l'emplacement actuel, puis faites de même pour tous ses voisins, et allez dans la direction de l'odeur la plus forte (ce n'est pas la direction d'où vient le traqueur).

Pour plus de réalisme:

  • Diffusion: transférez périodiquement une fraction du parfum de chaque emplacement à ses voisins. Cela confond les sentiers, mais signifie également que les objets stationnaires peuvent être flairés (trouver de la nourriture, des cadavres, etc.). (C'est même une sorte d'IA reconnue pour baser entièrement ses actions sur ce type d'informations - le paysage fournit des informations sur la voie à suivre pour obtenir une ressource particulière, etc. J'oublie son nom.) Le principal inconvénient est le temps passé calculer la diffusion partout.

  • Les odeurs fortes devraient empêcher la détection des odeurs faibles; divisez la force du parfum recherché par la force du parfum le plus fort et échouez s'il est trop petit. Cela pourrait permettre de confondre délibérément sa trace de parfum.

Kevin Reid
la source
9

Je modifierais une technique appelée cartographie d'influence pour créer une carte des parfums. Il se dissipera et se fanera naturellement, se mélangera et rivalisera avec d'autres parfums, et probablement plus. Cela semble faire exactement ce dont vous avez besoin, mais il peut être plus élaboré que ce que vous cherchez à mettre en œuvre. À tout le moins, cela devrait vous donner de bonnes idées, et il est assez simple à mettre en œuvre par-dessus la structure que vous utilisez actuellement.

Un tutoriel / explication que j'ai trouvé utile.

jsonnull
la source