Besoin d'aide sur 360°

eagle4 Message lu Posté le 26 Fév 2008 à 11:38 Bulle
Avatar de eagle4
Membre Confirmé

Messages : 177
GCPoints : 27624
Bonjour à tous,

Comme vous le savez, je développe actuellement Project S.U.A.I sous MMF2. Dans la démo a paraitre prochainement, vous aurez à combattre des petit drone d'entrainement qui auront une IA basique.

Mon problème est là, je m'explique :

je voudrais que mes drones puissent se tourner fluidement vers la direction où ils doivent aller... S'ils voient le joueur, ils vont aller vers lui. Mais pour être joli, je voudrais que le drone se tourne doucement vers sa direction.

genre:
mon drone vois le joueur à 90° alors qu'il est à 180°

je veut qu'il se tourne proprement, je lui retire donc 1° tout les 0.01 secondes.

seulement si mon joueur est à 90 et que mon drone est à 80°, je vais lui ajouter 10° et si mon joueur est à 90° et que mon drone est à 100° je vais lui retirer 10°

donc pour faire la différence, c'est pas dur, je dis si mon drone à un angle plus grand, je lui retire 1 jusqu'à ce qu'il est le meme angle que mon joueur et si mon drone à un angle plus petit, je lui ajoute 1 jusqu'à ce qu'il sois égal

bon donc le pb vient au moment où mon joueur est à un angle de 2° et que mon perso regarde à 350°... il dois pas soustraire 1° jusqu'à arriver à 2°, il dois faire le tour donc ajouter 1° jusqu'à arriver à 2°

Mon problème se situe au moment où je dois détermine si mon drone dois aller vers la droite ou vers la gauche... Je sais c'est un pb tout bête, mais comme je sature un peu en ce moment ^^

Sous MMF2, on peut demander des choses genre (si A est plus grand que B -> retire 1°), mais pas de fonctions avancé en Maths (enfin plus avancé que cos sin voir arctan).

Voilà c'est un bête pb de logique mais si quelqu'un vois comment faire je suis preneur ;)

Ps : je n'ai pas trouvé de sections adapté à l'entraide, ce serais pas mal d'en créer une...
Mod Message lu Posté le 26 Fév 2008 à 16:54 Bulle
Avatar de Mod
Webmaster

Messages : 4954
GCPoints : 2100823
Hum, ça me rappelle de mauvais souvenirs, je n'avais jamais réussi à résoudre ce problème... Ca remonte à quelques années, cette fois la solution est sortie rapidement (vacances powa, je dirais...).

Image pour expliquer plus simplement :
Ici, la barre rouge représente la direction dans laquelle le drone regarde, la verte la direction dans laquelle le joueur regarde.
L'objectif n'est pas de comparer l'angle de façon absolue au repère du monde, mais de façon relative entre les deux objets : le drone et le joueur. Tu peux facilement déterminer à partir des coordonnées des deux objets l'angle a.
Ensuite, le calcul de l'angle b peut également être réalisé simplement. Tout dépend de la manière dont tu gères tes angles....
Une fois que tu as obtenu a et b, tu fais une bête somme et tu compares à 180°. Si la somme de a et b est supérieure à 180°, tu réduis l'angle jusqu'à ce qu'il soit égal à 180°. Inversement si l'angle est plus petit que 180°, tu augmentes l'angle.

Image



J'espère que c'est bien ce que tu souhaitais :wink: .
eagle4 Message lu Posté le 27 Fév 2008 à 09:16 Bulle
Avatar de eagle4
Membre Confirmé

Messages : 177
GCPoints : 27624
oui ça m'a l'air pas mal ton truc... et simple, c'est surement ce que je cherche, je vais faire un essai et je revient te le dire ;)

en tout cas, merci de m'aider ^^
eagle4 Message lu Posté le 27 Fév 2008 à 09:43 Bulle
Avatar de eagle4
Membre Confirmé

Messages : 177
GCPoints : 27624
mmm nan ça ne fonctionne pas... en fait par rapport à l'image, ça n'est pas exacte :

Le point rouge correspond à mon joueur et le point vert à mon ennemi. La direction de mon joueur n'influe aucunement sur la direction de mon ennemi.

L'angle A correspond à l'angle entre les 2 objets et l'angle B à l'angle en cours de l'ennemi. Et ce que je veut c'est ajouter ou soustraire 1 selon le chemin le plus rapide pour que A devienne B.

Image
graphiboc Message lu Posté le 27 Fév 2008 à 12:36 Bulle
Membre Avancé

Messages : 262
GCPoints : 40352
j'ai une autre solution : tu ajoute 360° a ton angle de départ et tu calcul la distance angulaire entre ton drone et l'angle de départ, puis ton drone et l'angle de départ+360°
ensuite tu considère l'angle pour lequel la distance angulaire est la plus petite et tu determine s'il faut ajouter ou retirer des degrés.

ceci implique bien sur que ton angle de personnage et de drone soit dans le meme intervalle (par exemple, tous deux compris entre 0 et 360° , pas d'angle négatif, ou bien encore compris entre -180° et 180°enfin tu vois le principe je pense et généralement c'est un probleme qui ne se pose pas)
L'Homme est un créateur...
eagle4 Message lu Posté le 27 Fév 2008 à 13:18 Bulle
Avatar de eagle4
Membre Confirmé

Messages : 177
GCPoints : 27624
mmm
je comprend pas trop ce que tu veut dire... L'angle de départ c'est bien l'angle A sur mon dessin ?

tu voudrais tester A+360 - B par rapport à A - Bet en fonction du résultat le plus petit, déterminer s'il faut ajouter 1 ou soustraire 1 c'est ça ?

ps : ma plage d'angle est bien sur entre 0° et 360°
Dernière édition le 27 Fév 2008 à 13:18
Mod Message lu Posté le 27 Fév 2008 à 13:29 Bulle
Avatar de Mod
Webmaster

Messages : 4954
GCPoints : 2100823
Je me demande justement si passer sur une plage d'angle de 180° à -180° au moment des tests ne te simplifierait pas la tâche...
eagle4 Message lu Posté le 27 Fév 2008 à 13:33 Bulle
Avatar de eagle4
Membre Confirmé

Messages : 177
GCPoints : 27624
ben le pb restera entier, -179° est plus proche de 179° en soustrayant qu'en additionnant.
graphiboc Message lu Posté le 27 Fév 2008 à 13:58 Bulle
Membre Avancé

Messages : 262
GCPoints : 40352
exemple : tu est à 5°(angle A), ton drone à 355°(angle B), il faut donc ajouter +10° en toute logique.

Faisons alors un petit test:
abs(B-A)=350° (abs étant la valeur absolue)
abs(B-(A+360))=abs(355-365)=10

il est évident que 10<350 donc tu ajoutes 10°

Prenons maintenant A=355 et B=5° (la situation inverse koi)
abs(B-A)=350
abs(B-(A+360))=abs(5-715)=710

On a 350<710, donc tu retranches 10°

enfin pour finir, dans un cas sans complication:
A=50,B=80
abs(B-A)=30
abs(B-(A+360))=abs(80-410)=330
30<330 donc on retranchera peu à peu des degrés...

voilà, simple, rapide et efficace :P
L'Homme est un créateur...
Darktib Message lu Posté le 02 Mar 2008 à 15:51 Bulle
Avatar de Darktib
Membre Ultime

Messages : 4017
GCPoints : 347288
Interressant comme probleme...
Ca pourra servir a bien du monde.
Merci graphiboc^^

SEB Message lu Posté le 15 Août 2008 à 16:36 Bulle
Avatar de SEB
Membre Evolué

Messages : 554
GCPoints : 103313
Je retrouve ce vieux sujet... peut-etre qu'il n'est plus d'actualité mais je me demandais si on ne pouvais pas faire différemment. L'idée c'est que si l'angle entre les deux est de moins de 180 on diminue sinon on augmente...

donc je ferais quelque chose du genre (en pseudo c)

Code :
int getSign( float angleJoueur, float angleEnemi ) {
   int sign = 1;
   if( angleJoueur < angleEnemi ) {
      if( angleEnemi - angleJoueur < 180 )
         sign = -1;
   } else {
      if( angleJoueur - angleEnemi > 180 )
         sign = -1;
   }
   return sign;
}


Attention cette methode donne un signe à un temps donné T et elle a pour précondition que tous les angles soit normalisés entre 0 et 360. Apres d'un point de vue de l'efficatite... à tester ^^

@+
Seb
Dernière édition le 15 Août 2008 à 16:37
NextGine : 3D games engine
Nombre de lignes actuel : 77683
Répondre
GameCorp - Site d'apprentissage et d'entraide à la création de jeux vidéo.
XHTML Valid 1.1 - Page générée en 0.0472 secondes