J'ai un sprite qui a Velocity
et Position
, soit stocké en tant que Vector2
. À chaque Update
cycle, la vitesse est ajoutée à la position.
Je voudrais donner l'image - objet un troisième vecteur, Target
. De nouvelles cibles peuvent être données à n'importe quelle itération. Je voudrais que le sprite se déplace essentiellement selon un modèle de marche aléatoire, mais deux paramètres doivent être exposés:
- Une marche aléatoire typique est également susceptible d'augmenter ou de diminuer la distance jusqu'à un point donné
Target
(plus la petite chance de mouvement tangentiel). Je dois être capable de biaiser ma marche aléatoire de telle sorte que, tout en restant aléatoire, la direction dans laquelle le sprite "décide" devrait être plus susceptible de le rapprocherTarget
. - La marche aléatoire doit être "douce" - le sprite ne doit pas changer rapidement de direction, car cela ressemblera à un "scintillement" ou "tremblement" pour le joueur. Il devrait progressivement virer de cette façon ou de cela, se déplaçant au hasard, tout en se rapprochant lentement lors de la moyenne.
Quelle est la bonne manière simple de procéder? Si possible, donnez la réponse comme Vector2 RandomWalk(Vector2 target)
méthode.
J'ai déjà une NextGaussian(mean, stdev)
méthode disponible, si cela est utile.
xna
c#
random
linear-algebra
Superbest
la source
la source
Réponses:
Je prendrais le comportement de direction "vagabond" (le code source peut être trouvé ici ) et le modifier de manière à ce que les nombres aléatoires soient biaisés vers votre cible.
la source
Pour obtenir une marche aléatoire en douceur, vous pouvez utiliser des splines Catmull-Rom . Ce type de spline prend une séquence de points et génère des courbes douces qui passent par chaque point. Ainsi, vous pouvez générer des waypoints aléatoires pour que l'image-objet se déplace et l'animer le long d'une spline Catmull-Rom à travers les waypoints. Pour que la spline fonctionne, vous aurez besoin d'un total de quatre points de cheminement: les deux précédents et les deux suivants. Lorsque le sprite atteint un waypoint, jetez le plus ancien de votre ensemble de quatre et générez-en un nouveau, puis continuez à animer le long de la spline.
Quant à éventuellement se diriger vers la cible, une idée serait de compenser la distribution de la marche aléatoire vers la cible. Par exemple, si vous choisissez habituellement un point de cheminement aléatoire en utilisant une distribution gaussienne centrée sur la position actuelle de votre sprite, vous pouvez plutôt décaler le centre du gaussien d'une certaine distance prédéfinie vers la cible. Les tailles relatives de l'offset et de l'écart-type gaussien détermineraient la polarisation du mouvement.
la source
Voici quelque chose que j'ai fouetté en 20 minutes environ. Nous prenons la direction du marcheur vers la cible, choisissons une direction à un certain degré de cette direction (une quantité qui diminue à mesure que le marcheur se rapproche de sa cible). Cet algorithme tient également compte de la distance jusqu'à la cible afin qu'il ne dépasse pas la cible. Pour faire court, il oscille essentiellement à gauche et à droite une petite quantité aléatoire et se rapproche de la cible à mesure qu'elle se rapproche.
Pour tester cet algorithme, j'ai placé le déambulateur à (10, 0, 10) et la cible à (0, 0, 0). La première fois que l'algorithme a fonctionné, il a choisi au hasard une position vers laquelle le marcheur doit marcher (3.73f, 0, 6.71f). Une fois que le marcheur a atteint cette position, il a choisi (2.11f, 0, 3.23), puis (0.96f, 0, 1.68f), puis (0.50f, 0, 0.79f), puis il s'est dirigé directement vers la cible car il était à l'intérieur une distance de tolérance minimale.
Représenté graphiquement à vol d'oiseau, le chemin ressemblerait aux points de l'image ci-dessous, commençant à «W» (marcheur) et se terminant à «T» (cible). Si vous voulez un mouvement plus naturel, vous devez précalculer quelques points à l'avance et créer une spline, vous donnant beaucoup plus de points que le marcheur peut suivre. J'ai estimé à quoi ressemblerait ce chemin après avoir été transformé en spline, et cela est représenté par la ligne dans l'image.
Et voici l'exemple de code:
En fonction de votre jeu spécifique, vous pouvez modifier les distances, le champ de vision, le caractère aléatoire et la fréquence d'exécution, jusqu'à ce qu'il réponde à vos besoins. Je suis sûr que l'algorithme pourrait être un peu nettoyé et optimisé, je n'y ai pas passé beaucoup de temps, je voulais juste qu'il soit facile à lire.
la source