Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: Cmdu76 le Juillet 03, 2013, 02:23:40 am

Titre: Problème de mathématiques ?
Posté par: Cmdu76 le Juillet 03, 2013, 02:23:40 am
Bonjour,

je suis en train de mettre au point un peu truc avec la SFML mais je bute actuellement sur un petit problème...

J'essaye de faire pivoter un objet dans la direction de la souris.

sf::Vector2i pos = sf::Mouse::getPosition(window);
float diffx = fabs(pos.x - player.getOrigin().x);
float diffy = fabs(pos.y - player.getOrigin().y);
if(diffy == 0)
    diffy = 0,001; //0 est une valeur interdite !
float angle = atan(diffx/diffy) * 180 / PI; //#define PI 3.14159265
if(pos.x > player.getOrigin().x && pos.y < player.getOrigin().y)
    player.setRotation(angle);
else if(pos.x > player.getOrigin().x && pos.y > player.getOrigin().y)
    player.setRotation(90 + angle);
else if(pos.x < player.getOrigin().x && pos.y > player.getOrigin().y)
    player.setRotation(180 + angle);
else if(pos.x < player.getOrigin().x && pos.y < player.getOrigin().y)
    player.setRotation(360-angle);

Voilà, mais cet algorithme ne marche pas... pourtant je n'arrive pas à comprendre...
Les angles obtenus via atan sont en radian, je les passe donc en degré (ce qui est attendu par SFML)
Je pense avoir pensé à tout, à la valeur interdite pour la division, j'ai même fait des dessins, je vois pas le problème... Mais l'orientation de mon objet reste incohérente....

Merci d'avance :)
Titre: Re : Problème de mathématiques ?
Posté par: Laurent le Juillet 03, 2013, 08:08:07 am
Y a pas mal d'erreurs dans ton code :

- il faut utiliser la position de l'entité, pas son origine
- il faut transformer la position de la souris ; même si tu n'as pas de vue perso, c'est une bonne habitude à prendre
- il ne faut jamais utiliser std::atan, mais plutôt sa variante std::atan2

sf::Vector2i cursor = sf::Mouse::getPosition(window);
sf::Vector2f diff = window.mapPixelToCoords(cursor) - player.getPosition();
float angle = std::atan2(diff.y, diff.x) * 180 / PI;
player.setRotation(angle);

Il faudra peut-être inverser l'angle ou bien diff.y, mais sinon ça devrait le faire.
Titre: Re : Problème de mathématiques ?
Posté par: Cmdu76 le Juillet 03, 2013, 12:14:13 pm
Merci maintenant ça marche super bien ;)