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

Auteur Sujet: [Résolu] Problème de rotation  (Lu 4102 fois)

0 Membres et 1 Invité sur ce sujet

horner

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
[Résolu] Problème de rotation
« le: Juillet 12, 2013, 05:33:10 am »
Hello, je suis nouveau sur le forum et j'ai franchi le pas, car j'ai un petit problème que je n'arrive pas à régler, n'étant pas un habitué des forums car je trouve assez rapidement la solution de moi-même je suis actuellement fatigué et désespéré, alors je m'en remet à vous  ;D

Je code donc un snake et pour des fonctionnalités graphiques poussées je souhaitais intégrer une texture spéciale pour un bloc (une entité sfml-like quad), c'est à dire le corps du serpent qui tourne, et plutôt que de faire 4images j'ai pensé en faire une et lui appliquer une rotation en fonction du besoin. Le problème, c'est donc que la rotation de ce petit bloc (10px) s'effectue avec toute la fenêtre j'ai l'impression, c'est bien seulement le bloc qui rotate mais il ne reste pas à sa position, il sort donc très vite de la fenêtre, j'ai testé plein de choses mais j'ai jamais réussi à faire ce que je voulais (changer l'origine, redéfinir une position etc...).

Le programme à l'heure actuelle est quand même bien découpé et ça ferait un peu long et pas très utile de poster le code comme ça de tous les fichiers, alors je le posterai sur demande, ça se trouve quelqu'un aura la solution à mon problème avec mes explications sans avoir le code. Je vous met néanmoins un petit screenshot de mon problème pour bien comprendre.



En tout cas merci d'avance  :)
« Modifié: Juillet 12, 2013, 07:33:05 pm par horner »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème de rotation
« Réponse #1 le: Juillet 12, 2013, 08:07:01 am »
Ce serait plus simple si tu nous postais un code complet minimal qui reproduit le problème (i.e. PAS ton code d'origine). Ca va être simple a priori : une fenêtre qui dessine un sprite non tourné, et le même avec la rotation de 10 degrés. On n'a besoin de rien d'autre n'est-ce pas ?
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Problème de rotation
« Réponse #2 le: Juillet 12, 2013, 05:47:22 pm »
Chez moi je n'ai aucun problème avec la rotation des entités SFML , tout dépend ou t'as mis l'origine pour la rotation.

A mon avis t'a mit l'origine au centre de la texture, et pas au centre du texture rect. (Je me souviens avoir eu un problème du genre a cause de ça parce que je ne savais pas trop comment la SFML plaçais le sprite en fonction de l'origine, mais je pense qu'elle se base sur le coin supérieur gauche de la texture à laquelle Laurent soustrait les coordonnées de l'origine à chaque sommets qui forment les coins de la texture avant de dessiner l'entité texturée.)
Bref ça été tout un bordel pour moi..., pour placer correctement mes textures.

Car moi je faisais toujours un setPosition mais pour placer le coin supérieur gauche du sprite du coup j'avais toujours mes textures décalées.
Du coup j'ai du tout recalculer en fonction de l'origine et du texturerect dans mon code pour tout bien placer au bonne endroit.

Parce que j'ai mis l'origine au centre du texture rect et ma classe peut renvoyer 2 positions, la position de la texture par rapport à l'origine et la position du coins supérieur gauche de la texture. (Car j'ai fais une classe sprite amélioré.)
Je pense que dans ton cas c'est ce que tu devrais essayer faire.
« Modifié: Juillet 12, 2013, 06:00:50 pm par Lolilolight »

horner

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : Problème de rotation
« Réponse #3 le: Juillet 12, 2013, 05:59:52 pm »
Merci pour vos réponses, j'ai donc fais un petit code rapide pour reproduire le même schéma, qui comprend le main et ma classe block :

#include <SFML/Graphics.hpp>

class Block : public sf::Drawable, public sf::Transformable
{
public:

    // ajoutez des fonctions pour jouer avec la géometrie / couleur / texture de l'entité...
        Block();

        int applyTexture(std::string path);
        void setBlockPosition(int w, int h);
        void setBlockRotation(Block& block, int a); // identique à rotate

private:

    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
    {
        // on applique la transformation de l'entité -- on la combine avec celle qui a été passée par l'appelant
        states.transform *= getTransform(); // getTransform() est définie par sf::Transformable

        // on applique la texture
        states.texture = &m_texture;

        // on dessine le tableau de vertex
        target.draw(m_vertices, states);
    }

    sf::VertexArray m_vertices;
    sf::Texture m_texture;
};


Block::Block()
: m_vertices(sf::Quads, 4)
, m_texture()
{}

int Block::applyTexture(std::string path)
{
        if (!m_texture.loadFromFile(path))
        {
                return EXIT_FAILURE;
        }
       
        m_vertices[0].texCoords = sf::Vector2f(0, 0);
        m_vertices[1].texCoords = sf::Vector2f(10, 0);
        m_vertices[2].texCoords = sf::Vector2f(10, 10);
        m_vertices[3].texCoords = sf::Vector2f(0, 10);

        return EXIT_SUCCESS;
}

void Block::setBlockPosition(int w, int h)
{
        m_vertices[0].position = sf::Vector2f(w, h);
        m_vertices[1].position = sf::Vector2f(w+10, h);
        m_vertices[2].position = sf::Vector2f(w+10, h+10);
        m_vertices[3].position = sf::Vector2f(w, h+10);
}

void Block::setBlockRotation(Block& block, int a)
{
        block.rotate(a);
}


int main()
{
        sf::RenderWindow window;
        window.create(sf::VideoMode(400, 400), "Titre", sf::Style::Titlebar | sf::Style::Close);

        while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
                }

                Block head;
                Block body;
                Block bodyTurn;
                Block tail;
               
                //head.applyTexture("head.jpg");
                //body.applyTexture("body.jpg");
                //bodyTurn.applyTexture("body-turn.jpg");
                //tail.applyTexture("tail.jpg");

                window.clear(sf::Color::Black);

                head.setBlockPosition(210, 180);
                window.draw(head);
       
                bodyTurn.setBlockPosition(210, 190);
                bodyTurn.setBlockRotation(bodyTurn, 10);
                window.draw(bodyTurn);

                bodyTurn.setBlockPosition(200, 190);      // vu que c'est le même bloc je dois remettre la même
                bodyTurn.setBlockRotation(bodyTurn, -10); // rotation négative pour qu'il revienne à la bonne place
                window.draw(bodyTurn);

                body.setBlockPosition(200, 200);
                window.draw(body);

                tail.setBlockPosition(200, 210);
                window.draw(tail);

                window.display();
    }

    return 0;
}

Et voici le résultat :


Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Problème de rotation
« Réponse #4 le: Juillet 12, 2013, 06:08:59 pm »
Tu l'as mis ou l'origine ?
Au centre du bloc ?
Et t'as fais une texture par bloc ?
C'est pas ce qui me semble le mieux.
« Modifié: Juillet 12, 2013, 06:11:10 pm par Lolilolight »

horner

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : Problème de rotation
« Réponse #5 le: Juillet 12, 2013, 06:16:46 pm »
Alors là l'origine n'est pas mise, j'ai essayé de la mettre au centre du bloc, à part devoir légèrement changer la position, ça ne change pas le problème de rotation...

Sinon je met une texture par type de bloc, ici il y en a plusieurs pour le serpent mais en totalité il n'y en aura qu'un ou deux en plus maxi. Mais à vrai dire c'était surtout des tests j'ai pas encore défini comment mettre à jour la map, je l'initialise juste avec un double for mais rien n'est fait dans l'algorithme à proprement parler.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème de rotation
« Réponse #6 le: Juillet 12, 2013, 06:43:57 pm »
La rotation se fait toujours par rapport au point (0, 0) tant que tu ne touches pas l'origine. Donc quand tu définis tes vertex en (210, 180), ils sont très éloignés du centre de rotation.

Ton problème c'est que tu mélanges tout. D'une part du dérives de sf::Transformable mais tu n'utilises pas les fonctions que cette classe te fournit, tu redéfinis les tiennes. D'autre part tu bouges tes vertex pour changer la position de ton bloc, il ne faut pas. La géometrie doit toujours être définie en coordonnées locales (relatives à (0, 0)), pour changer la position il faut utiliser setPosition qui va jouer sur la transformation de l'entité.

Ensuite, je crois que tu peux retirer le 1er paramètre de la fonction setBlockRotation ; tu n'as pas l'impression de te répéter lorsque tu l'appelles ? ;)
Laurent Gomila - SFML developer

horner

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : Problème de rotation
« Réponse #7 le: Juillet 12, 2013, 07:07:45 pm »
J'ai remis ma fonction de rotation pour montrer que j'ai essayé vraiment plein de choses, mais je compte la supprimer, en effet je me répète mais j'avais pas réussi à la faire marcher sans.

Merci en tout cas j'ai essayé de faire autrement, j'utilise ma fonction que pour initier les vertex à 0 puis j'utiliserai setPosition. La confusion s'est faite au départ, car je me suis recréer une fonction setPosition (sans être au courant de celle existante) qui repositionnait les vertex à chaque fois, ça marchait bien lors de mes tests mais ça m'a causé des soucis apparemment  ;D

Donc voilà j'ai réussi à faire une rotation correcte, je vais essayer d'appliquer ça aux fichiers de mon projet et si j'ai pas d'autre soucis je mettrai en résolu !

Encore merci.

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : [Résolu] Problème de rotation
« Réponse #8 le: Juillet 13, 2013, 11:38:00 am »
Personnellement je ne fais jamais mes transformations dans la classe qui hérite de Drawable et de Transformable, je m'en sert juste pour placer les vertices et coordonnées de texture de mes sprites qui pointent vers la même texture pour accélérer le rendu un peu comme pour une RenderTexture.
Je suis même entrain d'essayer de faire une version personnalisée de la SFML pour pouvoir avoir un ordre d'affichage pour chaque sprites de ma tilemap et non pas un ordre d'affichage pour tout les sprites de la tilemap.
Mais là ça m'embête, je suis bloqué car mon PC sur lequel je développe le projet est en réparation depuis une semaine déjà et mon ancien portable ne me sert juste que pour faire le site web vu qu'il est plus lent.

Bref...

J'aimerais poser une question au sujet des render texture justement, l'envoi des vertex à openGL et le dessins sont effectué quand ?
A chaque fois qu'on ajoute une entité sur la render texture ou bien dès que l'on dessine la rendertexture ???

En gros est ce que une rendertexture fonctionne un peu comme une tilemap mais avec laquelle je pourrais mieux gérer la semi-transparence ???

Car les tilemap ne me servent juste que pour tout ce qui n'est pas semi-transparent, mais à partir du moment ou j'ai de la semi-transparence, je suis obligé d'utiliser autre chose car le depthtest ne marche pas dans ce cas là, mes lumières et mes ombres semi-transparente viendrais caché les entités ou le sol de la map.
Donc ma question est, est ce que les rendertexture sont bien optimisée pour gérer ce genre de choses ?
« Modifié: Juillet 13, 2013, 11:40:28 am par Lolilolight »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [Résolu] Problème de rotation
« Réponse #9 le: Juillet 13, 2013, 11:53:06 am »
Merci de ne pas détourner les sujets, si tu as une question qui n'a rien à voir ouvre une nouvelle discussion.
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : [Résolu] Problème de rotation
« Réponse #10 le: Juillet 13, 2013, 03:36:05 pm »
Ha oui juste désolé, bref, pas grave je regarderai ça dans le code source.