0 votes

Rotation des unités dans un jeu

J'ai une unité dans un jeu qui pointe dans une direction particulière ; lorsqu'elle tourne dans une autre direction, elle doit prendre le virage le plus court possible. Le schéma commence à un angle particulier et nécessite un angle donné pour l'interpolation linéaire.

Par exemple, un alignement de 10 degrés à 350 degrés permet de calculer un angle cible de -10. À l'inverse, une descente de 350 à 10 doit permettre de calculer un angle final de 370 degrés.

Quel algorithme permet de calculer les valeurs finales requises ?

EDIT: : Il semble y avoir une certaine confusion sur ce dont j'ai besoin

J'utilise l'interpolation linéaire pour calculer les angles dans le temps. Ainsi, si je veux passer de 10 à 20, la valeur finale doit être 20, j'interpole de 10 à 20 et je tourne à droite. De même, si je veux aller de 20 à 10, l'interpolation de 20 à 10 se fera dans le sens inverse des aiguilles d'une montre, ce qui n'est pas grave non plus. Le problème est que lorsque le virage est supérieur à 180 dans le sens des aiguilles d'une montre, pour aller de 270 à 80 (210 degrés), il faut tourner dans le sens des aiguilles d'une montre, l'interpolation directe de 270 à 80 se fera dans le sens inverse des aiguilles d'une montre, je dois interpoler de 270 à 420 (360+80), ce qui se fera dans le sens inverse des aiguilles d'une montre.

4voto

user231967 Points 1516

Vous avez besoin

dist = (end - start + 360) % 360;
if (dist > 180)
   dist = dist - 360;

ce qui vous donne quelque chose de l'ordre de -180...180. Si c'est ce que vous voulez.

1voto

Chris Burt-Brown Points 2423

Si vous voulez quelque chose de plus axé sur l'angle d'attaque, que diriez-vous de ceci ?

float startAngle = something, endAngle = something;

endAngle = ((endAngle - startAngle) % 360) + startAngle;
if(endAngle < startAngle - 180) endAngle += 360;
if(endAngle > startAngle + 180) endAngle -= 360;

Cela permet de rapprocher le plus possible l'angle final de l'angle initial par incréments de 360.

0voto

Si vous tournez vers un point spécifique et que vous voulez savoir si vous devez tourner dans le sens des aiguilles d'une montre ou dans le sens inverse pendant cette image, la méthode habituelle consiste à considérer la direction du joueur comme un vecteur et à prendre le produit croisé entre ce vecteur et le vecteur qui va du joueur au point. S'il est positif, on tourne dans le sens inverse des aiguilles d'une montre ; s'il est négatif, on tourne dans le sens des aiguilles d'une montre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X