|
eagle4
|
Posté le 26 Fév 2008 à 11:38
|
|

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
|
Posté le 26 Fév 2008 à 16:54
|
|

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.
J'espère que c'est bien ce que tu souhaitais .
|
|
eagle4
|
Posté le 27 Fév 2008 à 09:16
|
|

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
|
Posté le 27 Fév 2008 à 09:43
|
|

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.
|
|
graphiboc
|
Posté le 27 Fév 2008 à 12:36
|
|

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
|
Posté le 27 Fév 2008 à 13:18
|
|

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
|
Posté le 27 Fév 2008 à 13:29
|
|

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
|
Posté le 27 Fév 2008 à 13:33
|
|

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

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
|
Posté le 02 Mar 2008 à 15:51
|
|

Messages : 4017
GCPoints : 347288
|
Interressant comme probleme...
Ca pourra servir a bien du monde.
Merci graphiboc^^
|
|
SEB
|
Posté le 15 Août 2008 à 16:36
|
|

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
|