- #VK,
Bonjour à tous,
J'essaye de comprendre comment calculer un angle à partir de deux positions dans un jeu. J'ai pris pour exemple Counter Strike Source (car il est simple à comprendre et beaucoup de ressource grace a AlliedModders). Le but est simplement de calculer l'angle ideal d'un joueur pour tuer un adversaire.
Pour arriver à ça j'ai trois valeur, Counter Strike fonctionne bizarrement, la position des joueurs (leur origine) est toujours entre leurs jambes (0 sur Z (en local par rapport au joueur et pas au monde)), j'ai donc comme valeur la position de mon joueur, la position de l'ennemie (sa tête en l’occurrence) et ce qu'ils appellent le Eye Position ('est la position de la camera).
Je par du principe que la première information dont j'ai besoin est l’hypoténuse de mon triangle mais je n'ai aucune idée de comment le calculer depuis mes deux points. Je sais même pas si je doit représenter mes valeurs comme ça ou simplement comme une droite, la représentation au dessus vient d'un autre jeu qui fonctionne pas forcément de la même façon.
Une fois que j'ai cette valeur il faut que je calcule l'angle approprié. Dans counter strike l'angle est stocké dans un vecteur2D comme ceci:
1 2 3 4 5 6 | struct Vec2D { float yaw; float pitch; }; |
(Il y a en fait une troisième valeur (roll) mais elle vaut toujours 0.0f donc je ne m'en occupe pas du tout).
Le but est simplement de calculer le nouvel angle que je pourrai utiliser avec setang (fonction dispo dans le SDK).
Notez que ce code est utilisé sur le serveur est pas chez le client, je peux donc facilement le calculer avec les méthodes du SDK mais le but est de comprendre comment ça fonctionne.
J'ai trouvé un thread sur StackOverflow qui explique plus ou moins ce que je cherche à faire mais je comprend pas forcément ce qu'il essaye d'expliquer.
Le SDK (dispo sur GitHub) si vous en avez besoin.
EDIT: Voici comment l'angle est calculer dans le SDK
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | void VectorAngles( const float *forward, float *angles ) { Assert( s_bMathlibInitialized ); float tmp, yaw, pitch; if (forward[1] == 0 && forward[0] == 0) { yaw = 0; if (forward[2] > 0) pitch = 270; else pitch = 90; } else { yaw = (atan2(forward[1], forward[0]) * 180 / M_PI); if (yaw < 0) yaw += 360; tmp = sqrt (forward[0]*forward[0] + forward[1]*forward[1]); pitch = (atan2(-forward[2], tmp) * 180 / M_PI); if (pitch < 0) pitch += 360; } angles[0] = pitch; angles[1] = yaw; angles[2] = 0; } |