Forum de la communauté SFML

Aide => Général => Discussion démarrée par: Diamond le Mars 05, 2015, 08:35:26 pm

Titre: Problème de rotation
Posté par: Diamond le Mars 05, 2015, 08:35:26 pm
Bonjour tout le monde !
Mon problème est que je veux appliquer une rotation sur un CircleShape(jai créé un triangle isocèle), jusque la tout va bien mais lorsque j'effectue la rotation le centre de rotation est le point situé sur l'origine (0;0) alors que je voudrais effectuer la rotation a partir du sommet du triangle isocèle.
J'ai déjà essayé avec sf::setOrigin() mais sans succès ...

Merci de votre aide !  ::)
Titre: Re : Problème de rotation
Posté par: yhu420 le Mars 05, 2015, 08:48:55 pm
Je ne pense pas pouvoir être très utile, mais pense peut-être à effectuer plusieurs tests, quant au point d'origine que tu donnes. Utilises-tu "setRotation" ou "rotate"?
Aussi, pourrait-on avoir un peu de code?
Merci
Titre: Re : Problème de rotation
Posté par: G. le Mars 05, 2015, 08:54:20 pm
Je comprends pas, un triangle isocèle avec une CircleShape ?  ???
Et comment ça sans succès ? Les rotations effectuées avec rotate ou setRotation se font par rapport à l'origine, donc si tu la déplaces, tes rotations (et tes déplacements hein !) s'effectueront à partir de ce point.
Titre: Re : Problème de rotation
Posté par: kimci86 le Mars 05, 2015, 09:08:42 pm
Bonsoir,

Si je comprends bien ton problème, tu veux faire tourner un objet autour d'un point donné.
En effet, tu peux t'en sortir avec setOrigin. Tu peux définir la position de l'objet au niveau du point de rotation et définir la position relative à ce point avec setOrigin.
Cependant, cela ne me semble pas être une solution très propre étant donné que l'origine et la position d'un objet ont une signification bien précise et il me semble impropre de les dénaturer de la sorte. En revanche on peut imaginer un objet auxiliaire servant à définir un point d'attache avec des transformations, autrement dit un repère local.
Concrètement, tu peux définir un classe Node qui est Drawable et Transformable et qui contient des objets fils.
Tu peux t'inspirer du tutoriel officiel (http://www.sfml-dev.org/tutorials/2.2/graphics-transform-fr.php#les-hicerarchies-dobjets-scenegraph).
Titre: Re : Problème de rotation
Posté par: Diamond le Mars 05, 2015, 09:13:34 pm
Ah oui désolé je me suis trompé c'est un "ConvexShape" et non un "CircleShape" !
En fait le triangle isocèle représente un faisceau de lumière sortant d'une torche qui est censé bouger en fonction de la position de la souris j'ai donc utilisé une tangente(si vous avez une meilleure solution je suis preneur !)
Voila quelques bouts de codes (seuls ceux qui posent probleme):

//m_masque = triangle isocèle (representant un faisceau de lumiere d'une torche)
    m_masque.setPointCount(3);
    m_masque.setPoint(0, sf::Vector2f(8*ECHELLE_MAP, 32*ECHELLE_MAP));
    m_masque.setPoint(1, sf::Vector2f(0, 0));
    m_masque.setPoint(2, sf::Vector2f(16*ECHELLE_MAP, 0));
    m_masque.setOutlineColor(sf::Color(256,256,256,200));
    m_masque.setOutlineThickness(200);
    m_masque.setFillColor(sf::Color(256,256,256,50));

 //rotation de la torche
m_masque.setRotation( ( 180*atanf( (posSourisX-heros.getPosX()) / (heros.getPosY()-posSourisY) ) ) / PI );

 

ps: j'aimerai éviter de déplacer l'origine pour faciliter les calculs mais s'il n'y a pas le choix je ferais avec  :-\
Titre: Re : Problème de rotation
Posté par: kimci86 le Mars 05, 2015, 09:34:04 pm
Effectivement, je n'avais pas bien compris ton problème.
Dans ce cas un setOrigin paraît adapté.
m_masque.setOrigin(m_mask.getPoint(0));

Tu peux aussi définir la position de tes points autrement pour avoir celui qui t'intéresse directement en (0,0).
Titre: Re : Problème de rotation
Posté par: kimci86 le Mars 05, 2015, 09:44:53 pm
Autre remarque : tu utilises atanf pour calculer un angle. Déjà, c'est une fonction C, mais en plus atanf donne un angle modulo π. Tu veux probablement calculer un angle modulo 2π. Pour cela, tu peux utiliser atan2 (http://en.cppreference.com/w/cpp/numeric/math/atan2).
Titre: Re : Problème de rotation
Posté par: Diamond le Mars 05, 2015, 09:49:50 pm
Ce que tu me dit m'a l'air pas mal du tout  ;D je n'y avais pas du tout pensé, j'essaierai ca demain
Merci beaucoup pour votre rapidité !
Titre: Re : Problème de rotation
Posté par: Diamond le Mars 06, 2015, 07:34:43 pm
Voila, la rotation se fait maintenant très bien , seul petit problème restant, le fait d'afficher un ConvexShape (semi-transparent) d'environs la taille de mon écran fait chauffer mon ordi à peine je lance le programme, est-ce normal ?  :o
Titre: Re : Problème de rotation
Posté par: G. le Mars 06, 2015, 09:47:28 pm
Si tu limites pas le nombre d'images par secondes (en activant la synchronisation vertical ou en limitant les FPS) ça tourne à plein régime.