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

Auteur Sujet: Problème de Bounding Box  (Lu 2799 fois)

0 Membres et 1 Invité sur ce sujet

MrMahus

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Problème de Bounding Box
« le: Août 20, 2017, 07:17:32 pm »
Hello tout le monde :)

Je me suis mis à apprendre la SFML depuis quelque semaine, le fait est que je prend vraiment mon temps donc je ne suis pas très loin encore mais j'ai voulu afficher une grille isométrique et ensuite surligner la case sous laquelle est ma souris.

Pour se faire j'ai utilisé la fonction getGlobalBounds, je parcours mon tableau de ConvexShape en testant chaque case si les GlobalBounds de celle ci contiennent deux points : sourisX et sourisY .


Tout marche très bien mais seulement à certain endroit, en effet je vous laisse voir l'image jointe mais même si mon curseur est très bien placé à l'intérieur d'une seule case j'en ai pourtant 2 autres qui "pensent" contenir les coordonnées de ma souris.





Si quelqu'un saurait me dire pourquoi je suis preneur et je le remercie d'avance :)

Cordialement, un jeune apprentis en SFML :)

Guillaume__

  • Newbie
  • *
  • Messages: 42
    • Voir le profil
Re: Problème de Bounding Box
« Réponse #1 le: Août 22, 2017, 01:14:44 pm »
Bonjour MrMahus,

Peux-tu nous donner du code même partiel pouvant être susceptible de causer ce bug ?

Détecter une collision avec getGlobalBounds comme tu le fais n'est pas la meilleure des façons, en effet ce dernier ne te permet pas de détecter une collision au pixel prêt. C'est à dire qu'il va détecter une collision, même si pour toi ce n'est pas le cas en retour visuel. Ce que tu souhaites faire c'est plus une collision du style pixel perfect non ?

Cordialement G
Rejoignez-nous sur le serveur
Discord SFML

MrMahus

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Re: Problème de Bounding Box
« Réponse #2 le: Août 23, 2017, 09:12:10 am »
Biensur que je peux montrer ça , voilà comment j'ai procédé :

J'ai une fonction qui n'est appelée qu'une seule fois et qui me permet de dessiner ma " scène " :


int xCursor = 0;
int yCursor = 0;
bool terminated = false;
int time = 0;

while (terminated == false) {

    ConvexShape shape;
    shape.setPointCount(4);

    shape.setPoint(0, Vector2f(0, 16));
    shape.setPoint(1, Vector2f(32, 0));
    shape.setPoint(2, Vector2f(63, 16));
    shape.setPoint(3, Vector2f(32, 32));

    shape.setFillColor(Color::Transparent);
    shape.setOutlineThickness(1);
    shape.setOutlineColor(Color::White);

    shape.setPosition(Vector2f(xCursor, yCursor));

    tabConvex.push_back(shape);
    arrayCollision.push_back(false);
    xCursor += 63;

    if (xCursor >= 756) {
        int rest = time % 2;

        if (rest == 0) {
            yCursor += 17;
            xCursor = 32;
            time++;
        }
        else if (rest != 0) {
            xCursor = 0;
            yCursor += 17;
            time++;
        }
    }

    if (time == 34) {
        terminated = true;
    }
}

 

Puis à chaque tour de boucle j’appelle cette fonction qui me permet de mettre la case que je survole en "surbrillance", la premiere boucle for me permet simplement de remettre à zéro la "surbrillance" :


int mouseX = (int)sf::Mouse::getPosition(p_window).x;
int mouseY = (int)sf::Mouse::getPosition(p_window).y;

for (int i = 0; i < tabConvex.size(); i++) {

    tabConvex[i].setFillColor(Color::Transparent);
}

for (int i = 0; i < tabConvex.size(); i++) {
    FloatRect boundBox = tabConvex[i].getGlobalBounds();

    if (boundBox.contains(mouseX, mouseY)) {
        tabConvex[i].setFillColor(Color::Red);
    }
}


 


Ne connaissant pas du tout la SFML il y a encore 3 semaines je me suis posé la question de si ces fameuses bounding box étaient du pixel-perfect collision .. Apparemment vous semblez m'indiquer que non et c'est ce que je craignais.
Je suppose qu'il vaudrait donc mieux reconsidérer les collisions OO ? Qui testerait des vecteurs entre deux points de mes formes  et par le calcul de déterminant on essaye de trouver si les coordonnées de la souris sont comprise dans le polygone ?

J'essaye de tous mettre à plat il faut donc, vous me corrigerez si je me trompe :

  • Récupérer le bon polygone à tester composé de 4 points ABCD, dans le vector où il est stocké
  • Supposons notre souris en M(X ; Y ) quelconque et notre polygone A( xA; yA ) , B(xB; yB ) , C(xC ; yC) et D(xD ; yD)
  • On va étudier les vecteur AB , BC , CD et DA par rapport au vecteur AM , BM  , CM , DM
    Avec comme exemple pour AB ---> T( xB - xA ; yB - yA ) et  AM ----> P( X - xA  ; Y - yA )
  • On a donc nos deux vecteur T et P , on calcul le déterminant des deux : d = (Tx * Py) - (Ty * Px )
    en fonction du résultat on aura un résultat r = 0 ou > 0 ou encore < à 0
  • Si r > 0 alors notre point sera bien vers l'intérieur du polygone, il ne reste plus qu'a tester la même chose avec les 3 autres vecteurs et si pour les 4 vecteur r > 0 les coordonnées de la souris seront toujours vers l'intéreur du polygone et donc bien à l'intérieur de la "case"
  • Une fois tout ça validé on peut donc déclencher la surbrillance de la case




Je vais essayer de coder ça et je le posterais histoire d'avoir vos retours :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: Problème de Bounding Box
« Réponse #3 le: Août 23, 2017, 09:32:34 am »
Comme indiqué dans la documentation et les tutoriels, getGlobalBounds() renvoie un rectangle englobant approximatif, aligné sur les axes. Ce n'est donc bien entendu pas du pixel-perfect.

Pas la peine non plus de réinventer la roue, tape "point in convex polygon" dans Google et tu auras tous les algorithmes et implémentations dont tu as besoin.
Laurent Gomila - SFML developer

MrMahus

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Re: Problème de Bounding Box
« Réponse #4 le: Août 23, 2017, 10:22:25 am »
Merci pour tes infos Laurent, mais je n'aime pas vraiment recopié bêtement du code qui fait peut être le café depuis des années, mais qui n'a pas été écris par moi même. J'essaye de comprendre et d'apprendre donc si il faut réinventer LA roue pour MON code , je préfère le faire plutôt que piocher les idées des autres.

Mais à titre informatif j'irais lire avec plaisir comment font les autres, merci :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: Problème de Bounding Box
« Réponse #5 le: Août 23, 2017, 04:03:40 pm »
Je ne parle pas de bêtement recopier du code, mais d'aller chercher le bon algorithme (et l'implémenter toi-même en comprenant comment il fonctionne). Ca n'a pas de sens de réinventer ce genre d'algorithme bien connu, que tout le monde utilise.
Laurent Gomila - SFML developer

 

anything