Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [RESOLU]petites questions au sujet de sf::Transform.  (Lu 2653 fois)

0 Membres et 1 Invité sur ce sujet

Varden

  • Newbie
  • *
  • Messages: 46
    • Voir le profil
[RESOLU]petites questions au sujet de sf::Transform.
« le: Février 04, 2015, 09:56:09 am »
Bien le bonjour.

Tout d'avord je précise que j'utilise encore SFML 2.1.

Dans le cadre d'un projet que je ne détaillerai pas ici car mes questions sont d'ordres général, j'ai créer une classe possédant un tableau de vertexs. Je souhaite appliquer des transformation a ce tableau, translation, rotation et scale. j'ai donc créer une instance de "sf::RenderStates" dans ma classe et je lui applique toutes ces modifications, puis fournis a la methode "Draw" hérité de "sf::Drawable", le sf::RenderStates en question.
tout fonctionne bien, les translation, les modifications d'échelle (scale), et les rotations... cependant, un petit détail me chagrine.
lorsque j'effectue une rotation, il semblerait que les axes soit également tourner, puisque l'effet des translations est perturbé. par exemple, si j'effectue une rotation de 90°, et qu'ensuite j'effectue une translation avec la valeur (10.f,0.f), l'image ne se déplace plus a l'horyzontale, mais a la verticale...
Apres quelques recherche sur ce forum j'ai lu quelques choses a propos d'un ordre de transformation... or je n'ai pu trouver lequel... de plus en lisant le code source...(bien que je ne m'y connaisse pas en matrice...) je n'arrive pas a comprendre quel est cet ordre...

enfin voila... si quelqu'un pouvais m'éclairer d'avantage sur le fonctionnement de sf::Transform, ou vers une meilleure utilisation de celui-ci, je vous en serai reconnaissant.

en attendant une éventuelle réponse, je vais tacher de faire des tests...

merci d'avance.
« Modifié: Février 04, 2015, 12:30:38 pm par Varden »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : petites questions au sujet de sf::Transform.
« Réponse #1 le: Février 04, 2015, 10:08:27 am »
Et bien c'est tout bête, si tu veux que ta translation s'applique sur le repère d'origine et non le repère tourné, il faut appliquer la translation en premier.

transform.translate(x, y).rotate(a);

Si tu veux le même comportement que les entités SFML (sprite, text, shape) tu peux aussi utiliser la classe sf::Transformable.
Laurent Gomila - SFML developer

Varden

  • Newbie
  • *
  • Messages: 46
    • Voir le profil
Re : petites questions au sujet de sf::Transform.
« Réponse #2 le: Février 04, 2015, 10:17:25 am »
tout d'abord merci pour ta réponse aussi rapide!

ensuite, dans mon cas, ma classe stocke un sf::RenderStates, et chaque modification lui est apporter, puis il est fournit a draw(). ce qui signifie qu'une modification peut arriver sans ordre précis... d'une boucle de rendu a l'autre, le RenderStates ne change pas... dois-je le remettre a zéro? ou dois-je sauvegarder les modification dans des sf::Transform séparé (rotation, translation, scale) puis les combiner dans un ordre précis dans le draw()?

ensuite, au final je dessine un tableau de vertex, est-ce utile de faire hérité ma classe possédant ce tableau de sf::Transform? ou ai-je mal compris ta proposition d'utilisation de sf::Transform?
« Modifié: Février 04, 2015, 10:20:03 am par Varden »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : petites questions au sujet de sf::Transform.
« Réponse #3 le: Février 04, 2015, 10:25:19 am »
Citer
ensuite, dans mon cas, ma classe stocke un sf::RenderStates, et chaque modification lui est apporter, puis il est fournit a draw(). ce qui signifie qu'une modification peut arriver sans ordre précis...
Dans ce cas, si tu veux qu'une nouvelle transformation s'applique au repère d'origine plutôt qu'au repère courant, il faut effectivement stocker séparément les composantes de la transformation finale (translation, rotation, scale) et les recombiner à chaque fois dans l'ordre voulu. Ca tombe bien, c'est exactement ce que fait sf::Transformable ;)

Du coup tu as le choix, comme expliqué dans la doc, entre une utilisation interne :

class MyClass
{
    ...
    sf::Transformable m_transform;
};

m_transform.move(x, y);
m_transform.rotate(a);
...

// dans le draw :
states.transform *= m_transform.getTransform();

... ou bien en classe de base, si tu veux que ta classe hérite de toutes ces fonctions de transformation dans son API publique :

class MyClass : public sf::Transformable
{
    ...
};

move(x, y);
rotate(a);
...

// dans le draw :
states.transform *= getTransform();

Encore une fois, il me semble que tout ceci est très clairement expliqué dans la doc et le tutoriel correspondant.
Laurent Gomila - SFML developer

Varden

  • Newbie
  • *
  • Messages: 46
    • Voir le profil
Re :[RESOLU] petites questions au sujet de sf::Transform.
« Réponse #4 le: Février 04, 2015, 10:32:29 am »
dans ce cas je m'excuse pour la perte de temps, et vais relire tout de suite la doc et jeter un coup d'oeil a Transformable.cpp... ma classe ne souhaite que gérer les translations, rotations et scales, si sf::Transformable ne fournit rien de plus j'en hériterai.
merci encore pour tes réponses, je trouve plus simple et rassurant de demander conseil sur le forum et d'avoir une réponse clair de la part du créateur de la SFML, plutot que de faire des tests hasardeux... bien que je fasse cela la plupart du temps. je me permet juste de rares perturbations sur ce forum...

quoi qu'il en soit, je vais appliquer ton conseil et je passerai en résolu des que j'aurai réussi. merci a toi ^^.

[EDIT]
bon, j'ai fais hérité ma classe de sf::Transformable et ca roule ^^.
« Modifié: Février 04, 2015, 12:29:51 pm par Varden »